Будет ли MySQL запрос выполняться медленнее, если в одной из участвующих таблиц не определен индекс? - PullRequest
0 голосов
/ 23 марта 2010

Это уже заполненная база данных, созданная другим разработчиком.

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

    SELECT 
       a.col_1, a.col_2, a.col_3, a.col_4, a.col_5, a.col_6, a.col_7
    FROM
       a, b, c, d 
    WHERE
       a.id = b.id
   AND b.c_id = c.id
   AND c.id = d.c_id
   AND a.col_8 = '$col_8'
   AND d.g_id = '$g_id'
   AND c.private = '1'

ПРИМЕЧАНИЕ: $ col_8 и $ g_id являются переменными из формы

Это только моя теория, что таблицы b и c не имеют индекса, хотя я предполагаю, что разработчик не считал это необходимым, поскольку эти таблицы только сообщают отношения между a и d, где b говорит что данные в принадлежат определенному пользователю, а c сообщает, что пользователь принадлежит группе в d.

Как видите, здесь не используются даже объединение или другие расширенные функции запросов, но этот запрос, который возвращает только около 100 строк, выполняется за 2 минуты.

В любом случае, мой вопрос - просто название этого поста. Будет ли MySQL-запрос выполняться медленнее, если в одной из задействованных таблиц не задан индекс?

Ответы [ 4 ]

2 голосов
/ 23 марта 2010

ДА! Это будет НАМНОГО медленнее.

Вам нужно поставить индексы на все "идентификаторы".

И, вероятно, следует переписать запрос для использования объединений (поможет оптимизатор) ...

Сразу после размещения индексов вы можете увидеть увеличение производительности в сто раз.

Другая вещь, о которой говорит такой запрос, заключается в том, что предыдущий разработчик "Полный идиот (тм)"

М.

1 голос
/ 23 марта 2010

Ответ: «Это зависит от деталей, но, скорее всего, будет медленнее».

Индекс позволяет вам читать с диска только X% данных таблицы, а не 100% (так называемое сканирование таблицы).

Кроме того, вам нужно запускать EXPLAIN каждый раз, когда вы хотите ответить «почему мой запрос слишком медленный», чтобы получить необходимые детали для реального объяснения

0 голосов
/ 23 марта 2010

Как правило, да ... но вы должны определить свои индексы для конкретных запросов, которые вы выполняете.

Похоже, что все ваши таблицы должны иметь индексы в ваших полях id, c должен иметь индекс в private, а a должен иметь индексы для возможных значений столбцов a.col_8. Тем не менее, единственный способ действительно сказать - это запустить запрос с помощью EXPLAIN или DESCRIBE, чтобы увидеть, как его выполняет движок ...

0 голосов
/ 23 марта 2010

Невозможно точно сказать, не зная распределения данных в таблице w и самого запроса ... Но Вы можете в значительной степени гарантировать, что он не будет быстрее ...

...