Как я могу оптимизировать MySQL запрос с несколькими объединениями? - PullRequest
1 голос
/ 21 января 2012

Какие-либо входные данные о том, как я могу оптимизировать объединения в запросе MySQL? Например, рассмотрим следующий запрос

    SELECT E.name, A.id1, B.id2, C.id3, D.id4, E.string_comment
    FROM E
    JOIN A ON E.name = A.name AND E.string_comment = A.string_comment
    JOIN B ON E.name = B.name AND E.string_comment = B.string_comment
    JOIN C ON E.name = C.name AND E.string_comment = C.string_comment
    JOIN D ON E.name = D.name AND E.string_comment = D.string_comment

Таблица A, B, C, D являются временными таблицами и содержит 1096 строк, а таблица E (также временная таблица) содержит 426 строк. Не создавая никакого индекса, MySQL EXPLAIN показывал мне все строки, которые ищутся во всех таблицах. Теперь я создал индекс FULLTEXT для имени как name_idx и string_comment как string_idx для всех таблиц A, B, C, B и E. Команда EXPLAIN все еще дает мне тот же результат, как показано ниже. Также обратите внимание, что name и string_comment имеют тип VARCHAR, а idX имеют тип int (15)

    id  select_type table  type  possible_keys         key  key_len  ref rows  Extra
    1   SIMPLE      A      ALL   name_idx,string_idx                     1096
    1   SIMPLE      B      ALL   name_idx,string_idx                     1096  Using where
    1   SIMPLE      C      ALL   name_idx,string_idx                     1096  Using where
    1   SIMPLE      D      ALL   name_idx,string_idx                     1096  Using where
    1   SIMPLE      E      ALL   name_idx,string_idx                     426   Using where

Любые комментарии о том, как я могу настроить этот запрос?

Спасибо.

Ответы [ 2 ]

1 голос
/ 21 января 2012

Для каждой таблицы вы должны создать составной индекс для обоих столбцов. Синтаксис немного меняется, но это что-то вроде:

CREATE INDEX comp_E_idx E(name, string_comment) 

И повторить для всех таблиц. Отдельные индексы не помогут, потому что когда они пытаются объединиться, они бесполезны. Он очень быстро ищет имя в индексе, но затем должен выполнить итерацию, чтобы найти комментарий

0 голосов
/ 21 января 2012

Вы спрашиваете, можно ли настроить запрос. Я бы сначала спросил, если данные, сам может быть настроен. то есть, пожалуйста, рассмотрите возможность помещения данных в A, B, C, D и E в одну таблицу с NULL-способными столбцами. Это уменьшит сложность поиска с O (N ^ 5) до O (N).

...