MySQL выбрал неверный индекс - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть таблицы со столбцами

blog_detail - id INT PK, blog_id INT FK, language INT, title VARCHAR(255).

blog - id INT PK, author_id INT FK, created DATETIME


У меня есть индексы в таблице blog_detail

blog_id_language - blog_id, язык

blog_id - blog_id

blog_id_title - blog_id, заголовок

Запрос:

SELECT  *
    FROM  `blog`
    LEFT JOIN  `blog_detail`  ON `blog`.`id` = `blog_detail`.`blog_id`
    WHERE  (`blog`.`is_active` = 1)
      AND  ((      `blog`.`id`           LIKE "%fulltextsearch%")
              OR  (`blog_detail`.`title` LIKE "%fulltextsearch%")
           )

MySQL выбирает индекс blog_id_language, который использует столбец, который вообще не используется.Почему MySQL не выбирает только blog_id без бесполезного языка столбцов или blog_id_title, то есть используют оба используемых столбца?

1 Ответ

0 голосов
/ 20 декабря 2018

Вы создаете, как я полагаю, обычные индексы столбцов, в которых указывается точное значение столбца - их нельзя использовать с запросами в стиле сопоставления с образцом (например, "LIKE '% text%'").Однако они будут работать при начале сопоставления (например, «LIKE 'text%'»).

Вам нужно либо изменить индексы blog.id и blog_detail.title, чтобы они имели тип FULLTEXT и использовать надлежащий FTS (полныйПоиск текста) или разбейте имеющиеся у вас сценарии на несколько критериев соответствия начала.

В качестве альтернативы вы можете использовать что-то вроде lucene для индексации и поиска.

Ознакомьтесьэтот вопрос для более подробных ответов:

Как ускорить запросы SELECT .. LIKE в MySQL на несколько столбцов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...