美文网首页
MySQL组合索引不被命中使用的情况

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

作者: 北冥摸鱼 | 来源:发表于2020-02-06 18:09 被阅读0次

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

    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';
    

    相关文章

      网友评论

          本文标题:MySQL组合索引不被命中使用的情况

          本文链接:https://www.haomeiwen.com/subject/jrpuxhtx.html