通过静态子句元素改进LIKE子句

时间:2013-06-24 18:44:27

标签: mysql sql performance

我很好奇是否可以使用静态子句元素来优化使用LIKE子句。

这是查询

(SELECT * FROM n where n.name = 'x' AND n.body LIKE '%x%';)

比这个更快

(SELECT * FROM n WHERE n.body LIKE '%x%';)

我使用的是mysql。

2 个答案:

答案 0 :(得分:8)

您可以使用EXPLAIN来了解哪个查询更快。

作为一般概念,静态查询比LIKE查询更好。因此,如果添加一些内容会更快。

但前提是它实际上减少了LIKE的行,静态查询使用和索引。

原则是LIKE样式查询(与其他必须扫描字段内容的查询一起)很昂贵。 (请参阅cost中的EXPLAIN列) 因此,如果减少需要为LIKE处理的行数,查询会变得更快。

究竟什么样的查询在什么情况下很难快速回答。您应该向他们提出准确的问题,包括对具体情况的描述(DBMS,表模型,索引,数据量,EXPLAIN调用的结果等)以获得有效的答案。

答案 1 :(得分:2)

如果您有n.name的索引,可能会更快。我相信MySQL总是在列上可用时使用索引。如果只有几行n.name = 'x',则引擎将选择这些行并仅对它们执行like操作。

由于like双方都有通配符,因此无法利用索引。

如果没有索引,那么额外的比较会在查询中添加非常非常少量的开销,尽管它也可能使like短路。目前还不清楚哪个是主导因素,但无论如何从磁盘读取数据可能会主导查询。