Нужно настроить мой запрос MySQL, имеющий индекс по столбцу varchar - PullRequest
1 голос
/ 03 января 2012

У меня есть таблица, в которой содержится почти 2 000 000 записей.У меня есть столбец (crmid), который является varchar в этой таблице.Я написал запрос:

 Select column1, column2,..... from table where crmid = ?

значение поступает из внешнего интерфейса.Раньше все работало нормально, но теперь время ожидания истекло.Затем я использовал индекс по этому столбцу, который даже не сильно мне помог.После индексации я объяснил запрос, и снова он пересекает 1 800 000 строк , используя индекс тоже.

Пожалуйста, помогите мне в тонкой настройке этого запроса.

Примечание: этоэто не фактический запрос, это просто самая простая форма.В самом запросе много объединений.

EDITED :: Полный запрос:

select  column1
        , column2 
from    table1 a
        inner join appointmentstatusmst st 
            on  st.entity_id = a.shdstatuslviid 
        inner join hlcclientdetails 
            on  a.shdclientid = hlcclientdetails.cldregno 
            and a.shdclientdcnid = hlcclientdetails.clddcnid
where   hlcclientdetails.cldunifiedcrmid = ?

Вывод объяснения

1 Ответ

3 голосов
/ 03 января 2012

Есть ли индекс на appointmentstatusmst.entityid?Как насчет table1.shdclientid и table1.shdclientdcnid?Как насчет hlcclientdetails.cldregno и hlcclientdetails.clddcnid?

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

@ Богемский правильно, это небольшая проблема среднего размера.

РЕДАКТИРОВАТЬ.

Это может помочь продумать, что на самом деле должен ваш сервер MySQLсделать, чтобы выполнить ваш запрос.

 where hlcclientdetails.cldunifiedcrmid = ? 

означает, что он должен возиться с вашей таблицей hlcclientdetails в поисках определенных строк.Таким образом, индекс cldunifiedcrmid позволит сделать это эффективно.Вы упомянули, что у вас есть этот индекс на месте.Хорошо.

Продолжая,

   inner join hlcclientdetails 
              on  a.shdclientid = hlcclientdetails.cldregno 
             and  a.shdclientdcnid = hlcclientdetails.clddcnid

означает, что он должен взять строки, найденные в вашей таблице hlcclientdetails, и сопоставить их с table1 a, посмотрев на a.shdclientdcnid иa.shdclientid.Таким образом, ваш запрос может получить пользу от составного индекса в table1 a для этих двух столбцов.Попробуйте добавить этот индекс и посмотреть, улучшится ли производительность.

Наконец,

inner join appointmentstatusmst st 
           on  st.entity_id = a.shdstatuslviid 

означает, что сервер должен взять строки, найденные в table1 a, и сопоставить их доэто третий стол.Вы упомянули в своем комментарии, что entity_id - это PK этой таблицы.Это поможет

Вы поняли идею, я надеюсь.Индексы помогают не только с предложениями WHERE, но и с предложениями ON.

Между прочим, полнотекстовый индекс, упомянутый в другом ответе, не поможет с этой проблемой производительности JOIN, которая возникает у вас.

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