Bootstrap

mysq索引


前言

这是一篇关于索引的文档。
首先要明白索引是 mysql 最重要的一篇之一。
因为这和数据库的性能息息相关。
本篇文章主要介绍数据库索引比较基本的内容
这篇文章以 mysql-5.7.38 的 innodb 引擎为例。
更新于--2022-6-8


一、索引基本功能

本文围绕 mysql 的 innodb 引擎讲解。

索引对性能的影响非常关键。一个好的索引能轻易的将查询性能提升几个量级。

但是不是所有的表字段建立索引都适合创建索引。如果在一个表的所有字段全部创建索引这样不如不使用索引。

当数据量较小时索引体现不出优势,但是在数据超过一定量级后,不恰当的索引和好的索引性能之间会是天差地别。

二、索引优缺点

本文围绕 mysql 的 innodb 引擎讲解。

mysql 索引字面意思理解起来非常简单。可以把它想象成一本字典的索引页。通过索引可以快速锁定到指定的页面。

索引作用
了解优缺点之前首先要知道索引的作用

索引可以提高查询速度,部分索引可以约束数据例如:主键索引,和唯一索引。
ORDER BY && GROUP BY 也能通过索引快速排序分组。

索引优点:

  1. 减少了服务器检索的数据量,提高查询速度。--主要用途
  2. 提高表与表之间的连接的速度。
  3. 唯一索引可以约束数据的唯一性。
  4. 减少 ORDER BY && GROUP BY 排序和分组时间,提高效率。

索引缺点:

  1. 索引存储需要占用磁盘空间。--并不是每一个字段都适合创建索引,下文会有讲解
  2. 需要额外时间对索引进行创建和维护。
  3. 增、删、改需要动态维护索引。降低维护速度。--向有索引的表中插入记录时,数据库系统会按照索引进行排序,这样就降低了插入记录的速度

三、索引分类

本文围绕 mysql 的 innodb 引擎讲解。

索引整体分为三种类型

  1. 主键索引--聚集索引

     主键索引:它不仅有主键,而且有主键所属的全部数据,所以在 Innodb 中,主键索引即数据。
    
  2. 普通索引 --普通索引又可以分为 单列索引 && 唯一索引 两种

     单列索引:指在一列数据创建索引,允许快速查找具有相应列值的行(值可以重复,并为空)。
     唯一索引:在单列索引的基础上多一个唯一的特性(值不能重复,同时不能为空)。
    
  3. 复合索引(多列索引)--最左匹配原则

     最左匹配原则:
     最左匹配原则以最左边的为起点任何连续的索引都能匹配上。
     同时遇到范围查询(>、<、between、like)就会停止匹配。
    

    现有一个复合索引如下

//创建索引
 index user_key(name,age,sex)`
//在创建复合索引的同时也会创建两个索引(相当于同时创建了一个单列索引和两个聚合索引)
 index name && index (name,age)	
//但是 index age && index sex 不会被创建,因为这样违背了最左匹配原则

因为 innodb 底层是 B+ 树,所以 普通索引 && 复合索引 取值方式是一样的

列值为 Key,主键位置为 Value 即 (列值, 主键位置) 的非主键索引。

四、索引的建立

本文围绕 mysql 的 innodb 引擎讲解。

  1. 普通索引

     具体的建立应该根据业务来看,通常情况下索引应该建立在值重复度比较低的列上。
     一般情况下唯一索引的效率是除主键索引外最快的。
    
  2. 复合索引

     复合索引创建需要考虑最左匹配原则的情况下创建。
     复合索引在范围匹配的字段时会导致范围索引右边的索引失效。
     //例:
     现有索引 index user_key(name,age,sex)
     //查询:
     SELECT * FROM table WHERE name='张三' AND age BETWEEN 10 AND 20  AND sex = '男';
     //这个查询语句 name && age 两个索引生效因为 BETWEEN 是一个范围查询 会导致 sex 索引 失效
     //所以在创建这个复合索引时同时结合业务需求对 age 进行范围查询要改变复合索引创建顺序
     //创建索引:
     index user_key(name,sex,age)
     //查询:
     SELECT * FROM table WHERE name='张三' AND age BETWEEN 10 AND 20  AND sex = '男';
     因为 mysql 有 sql 语句优化器所以这个查询通过优化器重新调整后等于
     SELECT * FROM table WHERE name='张三'  AND sex = '男' AND age BETWEEN 10 AND 20;
     可以用 explain 在 mysql 中查看
    

五、索引失效

本文围绕 mysql 的 innodb 引擎讲解。

索引失效的几种情况

  1. 不等于(<>)导致索引失效
  2. is not null 无法使用索引(is null可以使用索引)
  3. LIKE 以 % 开头并且以 % 结尾无法使用索引
  4. OR 前后只要存在非索引的列,都会导致索引失效
  5. 字符编码集转换会导致索引失效
  6. WHERE字句中计算会导致索引失效
  7. 复合索引违反最左匹配原则索引会失效

总结

本文介绍了 mysql 索引的使用。
本文只有概念没有代码。
这篇文章覆盖了我在设计索引时分析的一些点,以后有新知识点回慢慢补充。

;