索引失效:mysql> select count(*) from tradelog where month(t_modified)=7;t_modified索引生效:mysql> select count(*) from tradelog where t_modified='2018-7-1’
下面是这个 t_modified 索引的示意图。方框上面的数字就是 month() 函数对应的值。

如果你的 SQL 语句条件用的是 where t_modified='2018-7-1’的话,引擎就会按照上面绿色箭头的路线,快速定位到 t_modified='2018-7-1’需要的结果。
实际上,B+ 树提供的这个快速定位能力,来源于同一层兄弟节点的有序性。
但是,如果计算 month() 函数的话,你会看到传入 7 的时候,在树的第一层就不知道该怎么办了。
也就是说,对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。
mysql> select name from tradelog where id + 1=100
改为
mysql> select name from tradelog where id =99
此时索引失效
select xx from xx where id = 1 等价于
select xx from xx where CAST(id AS signed int) = 1
EXPLAIN SELECT * FROM all_info WHERE task_id='835';

如果规则是“将字符串转成数字”,那么就是做数字比较,结果应该是 1;
如果规则是“将数字转成字符串”,那么就是做字符串比较,结果应该是 0

EXPLAIN SELECT * FROM sha1_virus_name WHERE virus_name_id LIKE '%EB801BEEEE%'; --all
改为:
EXPLAIN SELECT * FROM sha1_virus_name WHERE virus_name_id LIKE 'EB801BEEEE%'; --range
当创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。
索引失效:
select * from t where k2=2;
select * from t where k3=3;
slect * from t where k2=2 and k3=3;
仅命中k1
slect * from t where k1=2 and k3=3;
例表总行数10000行,col > 100 行数是9w多行,这时候走索引会遍历9W多条数据,要回表9w多次,数据库优化器就会进行评估,评估后全表扫描比索引快,就会自动变成全包扫描不走索引
负向查询包括:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,
并不绝对会索引失效,这要看MySQL优化器的判断,全表扫描或者走索引哪个成本低了。
其实单个索引字段,使用is null或is not null时,是可以命中索引的,字段要设为not null并提供默认值
https://juejin.cn/post/6844904022885793806
https://blog.csdn.net/MariaOzawa/article/details/107363136