【问题标题】:Simple Inner Join and Index简单的内连接和索引
【发布时间】: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 '%&gt;Washing&lt;/a&gt;%'
  • 当然!我不敢相信我没有遵守并错过了这一点。谢谢!这大大减少了执行查询的时间并将其降低到 0.2171 秒!
  • % 开头的 LIKE 模式很昂贵,任何可以减少它们的方法都会有所帮助。

标签: mysql query-optimization


【解决方案1】:

非常感谢 Barmar 向我指出这一点。

在我的原始查询中,我搜索了所有元值,而不是告诉它搜索存储在我正在寻找的特定键下的元值。 所以 tr.meta_key = 'item_html' AND tr.meta_value LIKE '%&gt;Washing&lt;/a&gt;%' 是解决这个问题的关键。

我更新的查询:

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 秒,这是一个非常好的改进。

【讨论】:

  • 使用提示here 可能会进一步改进postmeta
猜你喜欢
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 2012-03-18
相关资源
最近更新 更多