Mysql 什么';这是查询与中的不同之处

Mysql 什么';这是查询与中的不同之处,mysql,sql,database,optimization,Mysql,Sql,Database,Optimization,我有两个MySQL表,Post和Account 我将NodeJS用于我的后端API,它生成以下SQL语句: select `p`.`id` as `post_id` from `Post` as `p` left join `Account` as `a` on `a`.`id` = `p`.`author` where `p`.`id` in ('9', '10', '76', '77', 123) order by `p`.`id` asc 代码工作正常,问题是它的速度太慢

我有两个MySQL表,
Post
Account

我将
NodeJS
用于我的后端API,它生成以下
SQL
语句:

select `p`.`id` as `post_id`
from `Post` as `p` 
left join `Account` as `a` 
    on `a`.`id` = `p`.`author` 
where `p`.`id` in ('9', '10', '76', '77', 123) 
order by `p`.`id` asc
代码工作正常,问题是它的速度太慢了!我试着用
解释
来检查发生了什么,它没有使用索引

但是,然后我注意到IN子句中的与数字和字符串混合,因此我将
123
更改为
'123'
,并再次解释,它现在使用索引

所以,我的问题是当数字和varchar在
中的中混合时会发生什么

提前感谢

此查询:

select `p`.`id` as `post_id`
from `Post` as `p` left join
     `Account` as `a` 
     on `a`.`id` = `p`.`author` 
where `p`.`id` in ('9', '10', '76', '77', 123) 
order by `p`.`id` asc;
对于
where
子句,应利用
Post(id)
上的索引。它可能会也可能不会使用
order by
的索引

关于为什么不使用
Post(id)
上的索引,我想到了两个原因。第一个是类型转换。列表中的
由字符串组成。我猜
id
是一个整数。有时,类型转换可能会阻止使用索引。您可以将逻辑更改为:

where p.id in (9, 10, 76, 77, 123) 

第二个原因很简单,就是桌子太小了。MySQL在选择执行计划时考虑了基数。对于小表,全表扫描可能比索引更有效。在这种情况下,MySQL应该始终使用覆盖索引。如果您想测试这种可能性,请在
帖子(id,author)
上创建一个索引。这包括了查询,优化器应该更喜欢它。

如果您查看MySQL文档,您会注意到以下语句:

select `p`.`id` as `post_id`
from `Post` as `p` 
left join `Account` as `a` 
    on `a`.`id` = `p`.`author` 
where `p`.`id` in ('9', '10', '76', '77', 123) 
order by `p`.`id` asc
不同列的比较(将字符串列与 例如,时间或数字列)可能会阻止使用索引,如果 如果不进行转换,则无法直接比较值。一定要 数值列中的值(如1),它可能与任何 字符串列中的值数,如“1”、“1”、“00001”或 '01.e1'。这排除了对字符串列使用任何索引


因此,如果在
-语句中混淆了
中的数据类型,则可能会阻止使用索引

Ricky,如果使用(9、10、76、77、123),查询的性能是否会提高?如果使用('9'、'10'、'76'、'77'、'123'),性能会如何变化?无图片,谢谢。只需粘贴文本directly@MuhammadMuazzam,该线程是有用的和相关的,但没有回答op的问题,因为它处理的是由于使用了不同的比较运算符而导致结果可能不一致的事实(如果你问我,MySQL bug),但是,这并不能解释这里的性能问题。很可能已经完成了varchar比较,但我不确定这一点,而且另一个问题并不意味着这一点。p.id列的数据类型?性能问题在上面解决,当使用相同的数据类型时