2013-11-20 2 views
1

У меня есть две таблицы, которые объединены через третью таблицу. Первая таблица (изображения) содержит более миллиона записей. Вторая таблица (теги) содержит около 100 тыс. Записей. Третья таблица представляет собой двойную таблицу первичных ключей, состоящую из image_id & tag_id и содержит около 4 миллионов записей.Таблица разделения разделов MySQL (Dual PK)

Я пытался определить способ ускорить поиск изображений по тегу. Прочитав десяток записей или около того, мне кажется, что лучше всего разбить мою таблицу соединений. К сожалению, я никогда не делал этого раньше, и я боюсь потенциально распутать самую большую таблицу в системе.

В любом случае, поскольку таблица является двойным первичным ключом, она индексируется, но по-прежнему требуется довольно много времени для запроса. Я не уверен, что это строго скорость этой таблицы, или если это скорость таблицы изображений, к которой я присоединяюсь. В любом случае, я нажимаю 2-3 раза на запрос, как сейчас, и я волнуюсь, что я еще больше увяжусь с большим количеством изображений, больше тегов и других пользователей.

Все поисковые запросы выполняются с использованием первичных ключей INT (11). Я никогда не просматриваю текст и не смотрю на поля varchar. Один запрос имеет вид столбца status CHAR (1). Конечно, статус не является индексом, но должен ли он быть? Первоначально я думал об ENUM с параметрами A, I, X, D, но с тех пор я расширил до 6 типов состояний.

Аппаратное обеспечение, я нахожусь в ядре i-7 с 24 ГБ DDR3, а MySQL существует на 120 ГБ SSD (всего 3 Гбит/с).

Что я могу сделать, чтобы ускорить процесс? Является узким диском io, эффективностью запросов, плохой утилизацией памяти?

В прослеживания ноте, я наблюдал за работой сервера с помощью MySQL Workbench, и я нашел 2 интересных вещей:

  1. Key эффективность на 99,99%, в то время как скорость кэшу запроса на 0,28%.
  2. Я часто вижу, что задание cron, которое пересчитывает счетчики, имеет состояние «Копирование в таблицу tmp».

Этот запрос:

SELECT COUNT(t.image_id) FROM Image_Tags t 
INNER JOIN (Images i) ON (i.image_id = t.image_id) 
WHERE t.tag_id = :tid 
AND i.status = 'A' 

Я начинаю думать, что мне нужно, чтобы бросить индекс по этой колонке статуса.

+1

Итак, каждый столбец в вашей таблице соединений является ключом или у вас есть один ключ, охватывающий два поля? – Machavity

+0

Это двойной первичный, поэтому они оба являются одним из ключей. – GameCharmer

+1

и здравый смысл, только что начатый ... не понимал, что вы можете индексировать один и тот же столбец более одного раза. – GameCharmer

ответ

1

Проблема была двойным первичным ключом. Как двойственный, в основном он должен был смотреть на каждую запись в таблице соединений. Я добавил один ключ для tag_id и один ключ для image_id, и он значительно улучшил скорость. Спасибо Machavity!

Смежные вопросы