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并稍后显示状态检查,那么性能是否相同?
假设任何列都没有索引来简化问题.
(部分回答,部分要求更多信息......)
无论你放在第一位还是最后一位,都没有什么区别status=1。换句话说,ANDeda 中事物的顺序WHERE并不重要。
LOWER(x) LIKE '...'x比将 的排序规则设置为大小写折叠要低得多,例如utf8_general_ci(ci意味着“不区分大小写”)。对于ci排序规则,您只需要执行x LIKE '...'.
但是,这不会让事情加快太多。你有很多ORs;这些效率很低,因为索引通常是无用的,因此需要全表扫描。
很多时候,OR可以变成UNION可以使用索引。但可能不是你的情况。
请提供SHOW CREATE TABLE。嗯...查询的模式让我想知道您是否有很多“相同”的表。如果是这样,也许我们可以将其作为设计模式的低效方法。因此,请告诉我们c01和c03(等)是否看起来相同。
什么样的值将被放入LIKEs?字?数字?任意字符串?通配符?前导通配符?不领先?如果是“言语”,那么FULLTEXT 可能会有用。但是...我们需要仔细查看所涉及的长(?)表列表。