【发布时间】:2019-02-14 13:49:26
【问题描述】:
我有一个简单的内连接查询如下:
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 with (post_status, ID) 然后我可以将 myKey 用作索引,但不幸的是它没有为性能做很多事情。
【问题讨论】:
-
你能指定
tr.meta_key而不是搜索所有的元值吗? -
很遗憾没有。我们需要查找的内容存储在“item_html”meta_key 下,然后我们必须在整个键值中搜索我们需要的内容。键值是一堆 HTML 内容,我们正在检查它是否包含特定项目。最初并没有计划好,所以这就是我们要搜索的内容。我正在缓存响应以减少所需时间,但如果可能的话,我希望初始检查更快。
-
那你为什么不能使用
tr.meta_key = 'item_html' AND tr.meta_value LIKE '%>Washing</a>%'? -
当然!我不敢相信我没有遵守并错过了这一点。谢谢!这大大减少了执行查询的时间并将其降低到 0.2171 秒!
-
以
%开头的 LIKE 模式很昂贵,任何可以减少它们的方法都会有所帮助。