• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL索引不会被用到的情况汇总

    MySQL中索引的类型

    一般可分为四类:

    普通索引

    这是最基本的索引,它没有任何限制。它有以下几种创建方式:

    1.创建索引

    代码如下:

    CREATE INDEX indexName ON mytable(username(length));

    如果是 CHAR,VARCHAR 类型,length 可以小于字段实际长度;如果是 BLOB 和 TEXT 类型,必须指定 length,下同。

    2.修改表结构

    代码如下:

    ALTER mytable ADD INDEX [indexName] ON (username(length))

    创建表的时候直接指定

    CREATE TABLE mytable(
     ID INT NOT NULL,
     username VARCHAR(16) NOT NULL,
     INDEX [indexName] (username(length))
    );

    删除索引的语法:

    DROP INDEX [indexName] ON mytable;

    唯一索引

    它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

    CREATE UNIQUE INDEX indexName ON mytable(username(length))

    修改表结构:

    ALTER mytable ADD UNIQUE [indexName] ON (username(length))

    创建表的时候直接指定:

    CREATE TABLE mytable(  
    	ID INT NOT NULL,  
    	username VARCHAR(16) NOT NULL,  
    	UNIQUE [indexName] (username(length))  
    );

    主键索引

    它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

    代码如下:

    CREATE TABLE mytable(  
    	ID INT NOT NULL,  
    	username VARCHAR(16) NOT NULL,  
    	PRIMARY KEY(ID) 
    );

    当然也可以用 ALTER 命令。记住:一个表只能有一个主键。

    联合索引

    为了形象地对比单列索引和组合索引,为表添加多个字段:

    CREATE TABLE mytable(  
    	ID INT NOT NULL,  
    	username VARCHAR(16) NOT NULL,  
    	city VARCHAR(50) NOT NULL,  
    	age INT NOT NULL 
    );

    为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。就是将 name, city, age 建到一个索引里:

    代码如下:

    ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);

    索引用不上的情况

    索引不是每次都可以生效的,如果我们操作不对,那么很有可能是走全表扫描而不是走的索引,Explain 中的 possible_key、key_len 以及 key 参数都可以分析我们的 SQL 语句是否用到了索引。

    以下情况将会导致索引失效

    1. 查询的列中使用了 != 比如 select id,name,age from student where id != 2;
    2. 查询的列中使用了函数操作,比如 pow(id,2) 对 id 做平方这种函数表达式,也不会用到索引
    3. 如果条件中有 or,即使其中有部分条件带索引也不会使用(这也是为什么尽量少用or的原因)
    4. 联合索引中即使满足最左前缀原则,但是第一个条件带了范围查询,那么也不会用到索引
    5. 存在索引列的数据类型隐形转换,则用不上索引,比如列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
    6. 如果 MySQL 估计使用全表扫描要比使用索引快,则不使用索引

    以上都可以使用 Explain 进行测试是否用到了索引。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • mysql索引使用率监控技巧(值得收藏!)
    • 当Mysql行锁遇到复合主键与多列索引详解
    • MySQL查询条件中in会用到索引吗
    • mysql索引对排序的影响实例分析
    • MySQL如何修改账号的IP限制条件详解
    • MySQL分区表的局限和限制详解
    • mysql查询语句通过limit来限制查询的行数
    • MySQL连接数超过限制的解决方法
    • MySQL索引长度限制原理解析
    上一篇:CentOS 安装redis和MySQL
    下一篇:MySQL InnoDB MRR优化指南
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL索引不会被用到的情况汇总 MySQL,索引,不,会被,用到,