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

所属分类: 数据库 / Mysql 阅读数: 1276
收藏 0 赞 0 分享

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表结构操作,字段操作常见增删改查实现技巧与操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql学习笔记之完整的select语句用法实例详解

这篇文章主要介绍了mysql学习笔记之完整的select语句用法,结合实例形式详细分析了mysql select语句各种常见参数、使用方法及操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL5.6 GTID模式下同步复制报错不能跳过的解决方法

搭建虚拟机centos6.0, mysql5.6.10主从复制,死活不同步,搞了一整天找到这篇文章终于OK了,特分享一下,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL开启慢查询方法及实例

这篇文章主要介绍了MySQL开启慢查询方法及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

简单了解MYSQL数据库优化阶段

这篇文章主要介绍了简单了解MYSQL数据库优化阶段,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Windows下MySQL主从复制的配置方法

MySQL主从复制允许将来自一个数据库(主数据库)的数据复制到一个或多个数据库(从数据库),主数据库一般是实时的业务数据写入和更新操作,从数据库常用的读取为主
收藏 0 赞 0 分享

Mysql数据库设计三范式实例解析

这篇文章主要介绍了Mysql数据库设计三范式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql数据类型和字段属性原理与用法详解

这篇文章主要介绍了mysql数据类型和字段属性,结合实例形式分析了mysql数据类型和字段属性基本概念、原理、分类、用法及操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql连接查询、联合查询、子查询原理与用法实例详解

这篇文章主要介绍了mysql连接查询、联合查询、子查询原理与用法,结合实例形式详细分析了mysql连接查询、联合查询、子查询的基本概念、功能、原理、用法及操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Window下如何恢复被删除的Mysql8.0.17 Root账户及密码

这篇文章主要介绍了Window下如何恢复被删除的Mysql8.0.17 Root账户及密码,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多