Простое внутреннее соединение и индекс - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть простой внутренний запрос соединения следующим образом:

SELECT DISTINCT t.guid, t.post_title 
FROM wph3_posts t 
INNER JOIN wph3_postmeta tr 
ON t.ID = tr.post_id AND tr.meta_value LIKE '%>Washing</a>%' AND t.post_status = 'Publish' 
ORDER BY t.post_date DESC LIMIT 3

Когда я делаю объяснение MySQL, я получаю следующий вывод:

|id|select type|table|type|possible_key|key|key_len|ref|rows|extra|
:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
|1|SIMPLE|t|ALL|PRIMARY, myKey|NULL|NULL|NULL|29859|Using where; Using temporary; Using filesort|
|1|SIMPLE|tr|ref|post_id|post_id|8|y345435_wp946.t.ID|6|Using where; Distinct|

Индекс "myKey" был простосоздан и является индексом wph3_posts с (ID, post_status)

Ключ все еще игнорируется и отображается как NULL для используемых ключей.Для выполнения запроса требуется примерно 1.4230 , который я действительно хотел бы сузить.

РЕДАКТИРОВАТЬ: После замены порядка ключей: wph3_posts с (post_status, ID) Затем я могу получить myKey для использования в качестве индекса, но, к сожалению, это мало влияет на производительность.

1 Ответ

0 голосов
/ 14 февраля 2019

Большое спасибо Barmar за указание на это мне.

В моем исходном запросе я искал все мета-значения вместо того, чтобы просить его искать мета-значения, хранящиеся подконкретный ключ, который я искал.Так что ключом к этому стал tr.meta_key = 'item_html' AND tr.meta_value LIKE '%>Washing</a>%'.

Мой обновленный запрос:

SELECT DISTINCT t.guid, t.post_title 
FROM wph3_posts t 
INNER JOIN wph3_postmeta tr 
ON t.ID = tr.post_id AND tr.meta_key = 'item_html' AND tr.meta_value LIKE '%>Washing</a>%' AND t.post_status = 'Publish' 
ORDER BY t.post_date DESC LIMIT 3

Это сократило время запроса до 0,2171 секунды, что является очень хорошим улучшением по сравнению с тем, что было.

...