Mysql 如果有';它也是一个和一个id字段相对的?
我有一个类似以下内容的MySQL查询:Mysql 如果有';它也是一个和一个id字段相对的?,mysql,where-clause,sql-like,Mysql,Where Clause,Sql Like,我有一个类似以下内容的MySQL查询: select * from cust_comment where note LIKE '%awesome%' and userId=222; 让我们假设note字段是varchar(255),而userId是一个int 在我看来,执行此操作最有效的方法是MySQL首先对userId进行过滤,然后像一样应用。MySQL是默认(自动)这样做的,还是您必须强制它这样做,还是有其他方法来实现这一点 额外答案:如果userId有索引,那么这个问题的答案会有什么不同
select * from cust_comment where note LIKE '%awesome%' and userId=222;
让我们假设note
字段是varchar(255),而userId
是一个int
在我看来,执行此操作最有效的方法是MySQL首先对
userId
进行过滤,然后像一样应用。MySQL是默认(自动)这样做的,还是您必须强制它这样做,还是有其他方法来实现这一点
额外答案:如果userId
有索引,那么这个问题的答案会有什么不同
更多信息:我正计划对note
字段设置全文索引,但这在不久的将来可能不可能实现,因此LIKE
被用作临时解决办法。很可能MySQL首先通过userId
减少结果,因为LIKE
成本高昂,而且通常选择性较低
更可能的情况是,在userId
上有索引,因为这样可以加快查找速度
尽管如此,我还是不相信这一点,因为当MySQL从它的统计数据中知道,userId
无论出于什么原因都是非常低的选择性时,它可能比第一次使用note
而不是userId
来减少结果要好。在这种情况下,MySQL可能更喜欢完整表扫描,而不是使用现有索引。一种可能的情况是,表中的每一行都有userId=222
注意
上的索引在这里没有区别,因为像“%”这样的永远不能使用索引。对于LIKE“…%”
-在%
之间超过3个字符的模式,MySQL使用Turbo-Boyer-Moore算法加快搜索速度。很可能MySQL首先通过userId
减少搜索结果,因为LIKE
价格昂贵且通常选择性较低
更可能的情况是,在userId
上有索引,因为这样可以加快查找速度
尽管如此,我还是不相信这一点,因为当MySQL从它的统计数据中知道,userId
无论出于什么原因都是非常低的选择性时,它可能比第一次使用note
而不是userId
来减少结果要好。在这种情况下,MySQL可能更喜欢完整表扫描,而不是使用现有索引。一种可能的情况是,表中的每一行都有userId=222
注意
上的索引在这里没有区别,因为像“%”这样的永远不能使用索引。对于如“%…%”
,%
之间超过3个字符的模式,MySQL使用Turbo-Boyer-Moore算法加快搜索速度。执行此查询的最有效方法是使用索引:
create index idx_cust_comment_userid on cust_coment(userid)
在这种情况下,将首先进行userId
比较
由于where
中有这两个子句,我不知道MySQL是否试图优化求值顺序。比较整数比比较字符串快一点(尽管如果字符串很短,这会有所缓解)。但是,与全表扫描相比,性能上的差异可能并不重要。执行此查询的最有效方法是使用索引:
create index idx_cust_comment_userid on cust_coment(userid)
在这种情况下,将首先进行userId
比较
由于where
中有这两个子句,我不知道MySQL是否试图优化求值顺序。比较整数比比较字符串快一点(尽管如果字符串很短,这会有所缓解)。但是,与全表扫描相比,性能上的差异可能并不重要。最好的方法是EXPLAIN PLAN.MySQL优化查询本身,所以我认为它可以做到这一点(在字符串字段之前检查int字段)。和作为外键的userId应该被索引。当查询使用联接时,“解释”更有用。。。在测试之后,我确认MySQL优化WHERE子句OrthMySQL的优化器足够好地选择最佳执行计划,而不必强迫它做您可能认为更好的事情(比如强制索引等)。现在,如果可以应用索引查找,则数据集将减少—有时无法应用。在您的例子中,如果它是索引,它将首先基于userId
查找记录。如果两个列都不是索引,它会扫描表并在两个列中查找两个值-这里的顺序实际上是不相关的,因为这是一个效率极低的操作,并且必须满足这两个条件。最好的方法是解释PLAN.MySQL优化查询本身,所以我认为它会这样做当查询使用连接时,解释是更有用的。在测试之后,我确认MySQL优化了WHERE子句OrdMySQL的优化器足够好地选择最佳执行计划,而不强迫它做您可能认为更好的事情。(如强制索引等).现在,如果可以应用索引查找,数据集将减少-有时无法应用。在您的情况下,如果它是索引,它将首先基于userId
查找记录。如果两列都不是索引,它将进行表扫描并在两列中查找两个值-顺序在这里实际上是不相关的,因为首先,这是一个效率极低的操作,必须满足这两个条件。