我有一些类似的问题:
SELECT *
FROM users
WHERE cat = X
AND cat2 = X
AND title LIKE %X%
AND content LIKE %X%
AND email LIKE %X%
AND box LIKE %X%
AND address LIKE %X%
那些长而有点格式错误的查询是由专有软件完成的,所以我无法优化它们。有什么想法,我应该索引和改进,以获得更好的性能?
答案 0 :(得分:2)
如果LIKE的参数是无法启动且带有通配符的常量字符串,则该索引也可用于LIKE比较。
所以你对LIKE %X%
部分运气不好。对于那些,不能使用索引,MySQL必须对表进行全面扫描。
答案 1 :(得分:2)
索引仅在表达式告诉您某个值的开始时才有用。因此,只有当表达式不以通配符开头时,LIKE运算符才有用。
field1 = 'value' # Index this
field2 LIKE 'value%' # Index this
field3 LIKE '%value%' # Do not index, beginning characters unknown.
field4 LIKE '%value%' # Do not index, beginning characters unknown.
同样适用于<
,>
,<=
和>=
运营商,对字段编制索引非常有用。
在您的情况下,在cat
和cat2
上添加索引。
答案 2 :(得分:1)
您无法获得该查询的LIKE
部分。但是,通过为这两列提供组合索引,您可以确保cat
和cat2
快速。
答案 3 :(得分:1)
您最好的选择是在cat和cat2上设置多列索引:
INDEX( cat, cat2 )
你的字符串列上的索引根本没有提到,就像cularis所提到的那样。
答案 4 :(得分:0)
如果许多连续查询完全相同(我不知道是否属于这种情况),那么MySQL Query Cache将大大受益。