关于 MySQL 5.6 ICP

ICP(index condition pushdown)

参考资料:

  1. csdn-melody_mr

关于 字符串 与 整型对比 的查询与索引

  1. 查询中 number compare string: 如果有索引,那么就可以利用到索引。
  2. 查询中 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的查询。这意味着,你不能再通过索引来查询了,所以不能使用到索引。