使用索引改进MySQL表

jam*_*lin 12 php mysql indexing optimization

我对MySQL中的索引很新.我知道,我应该早点调试它,但大多数项目都足够小,我可以逃脱它;)

所以,现在我正在测试它.我通过运行EXPLAIN查询来完成测试:

查询:

EXPLAIN SELECT a . *
FROM `tff__keywords2data` AS a
LEFT JOIN `tff__keywords` AS b ON a.keyword_id = b.id
WHERE (
b.keyword = 'dog' || b.keyword = 'black' || b.keyword = 'and' || b.keyword = 'white'
)
GROUP BY a.data_id
HAVING COUNT( a.data_id ) =4 
Run Code Online (Sandbox Code Playgroud)

首先,没有索引我得到了这些结果:

在此输入图像描述

然后,使用data_id和keyword_id上的索引,我得到了这个:

在此输入图像描述

据我所知,MySQL必须搜索的行数从61k减少到10k,这一定是好的吗?

所以我的问题是,我在这里是否正确?在尝试优化时,我还有什么可以考虑的吗?

更新:

此外,在AJ和Piskvor的一些帮助指出我的另一个表及其列关键字没有索引后,我得到了这个:

在此输入图像描述

好大的改进!对?

Pis*_*3.0 4

如您所见,key用于表的b仍然是NULL. 您可能想要添加索引b.keyword并匹配

WHERE b.keyword IN ('dog','black','and','white')
Run Code Online (Sandbox Code Playgroud)

WHERE尽管它返回相同的结果,但它在功能上与您的子句不同。

看起来,您可能对全文搜索感兴趣。

  • @jamietelin:索引查找意味着与表本身的额外连接(称为“表查找”),如果查询中使用不属于索引的列,则需要额外的时间。从索引扫描中检索单个记录所花费的时间是从表扫描中检索单个记录所需的时间的几倍。因此,只有当过滤的好处超过表查找的缺点时,索引扫描才有用。如果有很多记录满足条件,则带过滤的表扫描会更便宜。不过,“MySQL”尝试自动计算它,并且做得很好。 (2认同)
  • 我同意,我之所以提到它,是为了让 jamietelin 可以进一步研究这个主题,更好地理解索引和索引策略。 (2认同)