WHERE子句中的条件顺序是否会影响MySQL的性能?

chi*_*tiz 5 mysql sql performance where-clause sql-like

给出以下查询:

select ....................
from ......................
where 
(
      lower(c01) like ? 
      or lower(c02) like ? 
      or lower(c5x3_.c01) like ? 
      or lower(5x3_.c02) like ?
 )    
 and(
(
      lower(c03) like ? 
      or lower(c04) like ? 
      or lower(c5x3_.c03) like ? 
      or lower(5x3_.c04) like ?
 )    
 /* ...Multiple further LIKEs... */
 and status=1; /* status is a non-nullable value whose values can only be 1 or 2 */
Run Code Online (Sandbox Code Playgroud)

前10或12个限制是LIKE关于各种模式的 - 我知道这可能很慢,所以总是把状态标准放在第一位,即:

status=1;
 and(other LIKEs)
Run Code Online (Sandbox Code Playgroud)

我的问题:首先应用更简单的限制是否会有性能提升(例如,在这种情况下,被比较的int值不能为空值,只有2个可能的值)?如果LIKE首先放置s并稍后显示状态检查,那么性能是否相同?

假设任何列都没有索引来简化问题.

Ric*_*mes 4

(部分回答,部分要求更多信息......)

无论你放在第一位还是最后一位,都没有什么区别status=1。换句话说,ANDeda 中事物的顺序WHERE并不重要。

LOWER(x) LIKE '...'x比将 的排序规则设置为大小写折叠要低得多,例如utf8_general_cici意味着“不区分大小写”)。对于ci排序规则,您只需要执行x LIKE '...'.

但是,这不会让事情加快太多。你有很多ORs;这些效率很低,因为索引通常是无用的,因此需要全表扫描。

很多时候,OR可以变成UNION可以使用索引。但可能不是你的情况。

请提供SHOW CREATE TABLE。嗯...查询的模式让我想知道您是否有很多“相同”的表。如果是这样,也许我们可以将其作为设计模式的低效方法。因此,请告诉我们c01c03(等)是否看起来相同。

什么样的值将被放入LIKEs?字?数字?任意字符串?通配符?前导通配符?不领先?如果是“言语”,那么FULLTEXT 可能会有用。但是...我们需要仔细查看所涉及的长(?)表列表。