MySQL组合索引不被命中使用的情况

创建组合索引:一个表中可以有多个,用多个列组合构建的索引,这多个列中的值不允许有空值。

ALTER TABLE table_name ADD INDEX index_name(col1,col2,col3);

查询条件中包含索引的前缀部分, 也就是 col1, 可以触发索引的使用

 select * from table_name where col1=1;

使用联合索引的全部索引键, 可触发索引的使用

 select * from table_name where col1=1 and col2=2;

根据最左前缀原则查询条件中包含索引的前缀部分, 也就是 col1, 可以触发索引的使用

select * from table_name where col1=1;

使用部分索引键, 但不包含索引的前缀部分,不可触发索引的使用

 select * from table_name where col2=2;

使用联合索引的全部索引键, 但不是AND操作, 不可触发索引的使用

select * from table_name where col2=2 or col1=1;

使用联合索引的,但是在索引列使用比较、计算的(包含不等于和not)不可触发索引的使用;
但是请注意在对主键和int类型的索引使用比较类型的则可以出发索引;

select * from table_name where col1>0;

使用联合索引的,但是在索引列使用比较、计算的不可触发索引的使用

select * from table_name where col1>0;

使用联合索引的,但是在索引列使用前导模糊查询、正则匹配的不可触发索引的使用

select * from table_name where col1 like  "%1"; //不可命中索引
select * from table_name where col1 regex" “^%1"; //不可命中索引
select * from table_name where col1 like  "1%"; //可以命中索引

使用联合索引的,但是在索引列使用In查询的不可触发索引的使用

select * from table_name where col1 in  1,2;

使用联合索引的,但是使用连接查询的不可触发索引的使用,因为连接查询是生成了临时表,因为临时表没有索引

select table_name.* from table_name,table_name2 where table_name.col1=1;

使用联合索引的,但是索引列类型与查询条件的类型不同的也不会触发索引(如索引类型是int,而查询条件是string)

select * from table_name where col1='0';
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载:http://blog.codinglabs.org/articles/theory-of-mysql-in...
    qf1007阅读 1,328评论 0 0
  • 1、索引组织表 在InnoDB中,表都是根据主键顺序组织存放的,称为索引组织表(index organized t...
    冰河winner阅读 890评论 0 1
  • 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,...
    mysia阅读 603评论 0 1
  • Hi~ ,亲爱的紫霞姑娘: 提笔问好。我是2019的你,原谅我这封迟来的信,虽然现在2019年已经过去好几天了,但...
    紫霞姑娘阅读 456评论 0 3
  • 是什么时候?是谁?在哪儿?实现自己的梦想和价值变现。 就在这个时候 外部环境巨变,人人都要走出舒适区,你不变就会被...
    关三水阅读 318评论 1 3