MySQL杂项资料收集
Contents
关于 MySQL 5.6 ICP
ICP(index condition pushdown)
参考资料:
关于 字符串 与 整型对比 的查询与索引
- 查询中
number compare string
: 如果有索引,那么就可以利用到索引。 - 查询中
string compare number
: 就算有索引,也利用不到.
官方文档里这样子描述的:
对于用 number 与 string 比较(string >|<|<=|>= number), MySQL不能使用索引来快速查找数据。 如果
str_col
是一个string索引列,那么在下面这条查询语句中,就不能使用到索引:
SELECT * FROM tbl_name WHERE str_col=1;
原因是: 有许多种string可以转换值为1,比如:
'1'
,' 1'
,'1a'
.
stackoverflow 以下是中文大概意思:
要点就是:如果数据库必须在table列进行转换,那么就不能利用到索引.
除此之外,数据库总是从
string
转换为number
,因为这是确定性的。(不然,数字1可以被转换为字符串'01'
,'001'
). 所以,我们可以看以以下同两条SQL:
-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';
数据库转换'1'
到数字1
,然后执行这条SQL。最终,在比较符两边都是int,所以,它可以利用到索引.
-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;
再次,它又将string
转换为numbers
。然而,这次,它必须将表列的数据进行转换。事实上,你就像执行类似 cast(str_column as int) = 1
的查询。这意味着,你不能再通过索引来查询了,所以不能使用到索引。