Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如果有';它也是一个和一个id字段相对的?_Mysql_Where Clause_Sql Like - Fatal编程技术网

Mysql 如果有';它也是一个和一个id字段相对的?

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有索引,那么这个问题的答案会有什么不同

我有一个类似以下内容的MySQL查询:

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
查找记录。如果两列都不是索引,它将进行表扫描并在两列中查找两个值-顺序在这里实际上是不相关的,因为首先,这是一个效率极低的操作,必须满足这两个条件。