MySQL索引不会被用到的情况汇总
MySQL中索引的类型
一般可分为四类:
- 普通索引:最普通的索引
- 唯一索引:索引列的值必须唯一,但允许有空值
- 主键索引:一种特殊的唯一索引,不允许有空值
- 联合索引:索引列有多个字段,使用时需要满足最左前缀原则
普通索引
这是最基本的索引,它没有任何限制。它有以下几种创建方式:
1.创建索引
代码如下:
CREATEINDEXindexNameONmytable(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定length,下同。
2.修改表结构
代码如下:
ALTERmytableADDINDEX[indexName]ON(username(length))
创建表的时候直接指定
CREATETABLEmytable( IDINTNOTNULL, usernameVARCHAR(16)NOTNULL, INDEX[indexName](username(length)) );
删除索引的语法:
DROPINDEX[indexName]ONmytable;
唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
CREATEUNIQUEINDEXindexNameONmytable(username(length))
修改表结构:
ALTERmytableADDUNIQUE[indexName]ON(username(length))
创建表的时候直接指定:
CREATETABLEmytable( IDINTNOTNULL, usernameVARCHAR(16)NOTNULL, UNIQUE[indexName](username(length)) );
主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:
代码如下:
CREATETABLEmytable( IDINTNOTNULL, usernameVARCHAR(16)NOTNULL, PRIMARYKEY(ID) );
当然也可以用ALTER命令。记住:一个表只能有一个主键。
联合索引
为了形象地对比单列索引和组合索引,为表添加多个字段:
CREATETABLEmytable( IDINTNOTNULL, usernameVARCHAR(16)NOTNULL, cityVARCHAR(50)NOTNULL, ageINTNOTNULL );
为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将name,city,age建到一个索引里:
代码如下:
ALTERTABLEmytableADDINDEXname_city_age(name(10),city,age);
索引用不上的情况
索引不是每次都可以生效的,如果我们操作不对,那么很有可能是走全表扫描而不是走的索引,Explain中的possible_key、key_len以及key参数都可以分析我们的SQL语句是否用到了索引。
以下情况将会导致索引失效
- 查询的列中使用了!=比如selectid,name,agefromstudentwhereid!=2;
- 查询的列中使用了函数操作,比如pow(id,2)对id做平方这种函数表达式,也不会用到索引
- 如果条件中有or,即使其中有部分条件带索引也不会使用(这也是为什么尽量少用or的原因)
- 联合索引中即使满足最左前缀原则,但是第一个条件带了范围查询,那么也不会用到索引
- 存在索引列的数据类型隐形转换,则用不上索引,比如列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
- 如果MySQL估计使用全表扫描要比使用索引快,则不使用索引
以上都可以使用Explain进行测试是否用到了索引。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。