MySQL索引

  1. 1. 为什么要使用索引
    1. 1.0.1. 1) 顺序访问
    2. 1.0.2. 2) 索引访问
  • 2. 索引的优缺点
    1. 2.0.1. 优点
    2. 2.0.2. 缺点
  • 3. 索引种类
  • 4. 案例分析
  • 语法
    1. 1. 创建索引(CREATE INDEX)
    2. 2. explain
    3. 3. 含义
    4. 4. 参数介绍
  • 索引使用建议
    1. 0.1. 失效情况
  • 原则

  • ​ 索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。本节将详细讲解索引的含义、作用和优缺点。
    ​ 通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列。否则,数据库系统将读取每条记录的所有信息进行匹配。
    ​ 可以把索引比作新华字典的音序表。例如,要查“库”字,如果不使用音序,就需要从字典的 400 页中逐页来找。但是,如果提取拼音出来,构成音序表,就只需要从 10 多页的音序表中直接查找。这样就可以大大节省时间。
    ​ 因此,使用索引可以很大程度上提高数据库的查询速度,还有效的提高了数据库系统的性能。

    为什么要使用索引

    ​ 索引就是根据表中的一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表,实质上是一张描述索引列的列值与原表中记录行之间一 一对应关系的有序表。

    1) 顺序访问

    ​ 顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符合条件的目标数据。

    2) 索引访问

    ​ 索引访问是通过遍历索引来直接访问表中记录行的方式。

    索引的优缺点

    索引有其明显的优势,也有其不可避免的缺点。

    优点

    索引的优点如下:

    • 通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
    • 可以给所有的 MySQL 列类型设置索引。
    • 可以大大加快数据的查询速度,这是使用索引最主要的原因。
    • 在实现数据的参考完整性方面可以加速表与表之间的连接。
    • 在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间

    如:

    使用非索引列花费时间:

    使用索引查询花费时间大大减少:

    缺点

    增加索引也有许多不利的方面,主要如下:

    • 创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。

    • 索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。

    • 当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。

    使用索引时,需要综合考虑索引的优点和缺点。

    ​ 索引可以提高查询速度,但是会影响插入记录的速度。因为,向有索引的表中插入记录时,数据库系统会按照索引进行排序,这样就降低了插入记录的速度,插入大量记录时的速度影响会更加明显。这种情况下,最好的办法是先删除表中的索引,然后插入数据,插入完成后,再创建索引。

    索引种类

    分类 含义 特点
    主键索引 对主键新建的索引 自动会新建索引,并且一个
    唯一索引 对unique键新建的索引 可以N个,自动会新建索引
    普通索引 普通类新建的索引 可以N个
    全文检索 全文检索 可以有N个

    案例分析

    • 表结构

    • 聚集索引

    • 二级索引

    语法

    创建索引(CREATE INDEX)

    ​ 创建索引是指在某个表的一列或多列上建立一个索引,可以提高对表的访问速度。创建索引对 MySQL数据库的高效运行来说是很重要的。

    create [ UNIQUE | FULLTEXT ] INDEX 索引名 ON 表名字 ( 列1,…列N ) ;

    1
    2
    3
    4
    5
    6
    7
    -- 创建索引
    -- 删除索引
    drop index 索引名 ON 表名;

    create unique index index_bookId on book(id);
    -- 查看索引
    show index from book;

    explain

    含义

    分析执行计划

    参数介绍

    字段 含义
    id 代表执行顺序值越大,越先执行,如果相同从上到下
    select_type 查询类型,比如:primary(主查询),subquery(子查询),simple(简单查询)
    type 连接类型,性能由好到差的连接类型为NULL、system、const、 eq_ref、ref、range、 index、all 。
    possible_key 显示可能用到的索引名
    key 显示实际使用到的索引名
    rows 必须要执行查询的行数只是一个估计值,
    filtered 返回结果的行数占需读取行数的百分比, filtered 的值越大越好。
    1
    explain select *from book where id=997;

    执行成功:

    索引使用建议

    失效情况

    • 索引列运算

      1
      是指在查询时候对索引列进行了运算后再做比较会失效,比如判断长度
    • 字符串必须添加单引号

      1
      字符串类型的列做比较时候,如果比较符右边的条件不加单引号时索引会失效
    • 数据分布影响

      1
      如果走全表会走索引更快,mysql会不使用索引
    • 头部模糊查询

      1
      如果头部模糊查询索引也会失效
    • or 连接

      1
      使用or连接时候,必须左右两边的条件都有新建索引才会全部生效,否则不生效
    • 少用select *

      1
      避免回表查询
    • 范围查询【使用在联合索引中】

      1
      联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效,但是>=和<=不会失效
    • 最左前缀法则【使用在联合索引中】

      1
      查询的时候联合索引的最左边的字段(即是第一个索引字段)必须存在,和编写的条件先后顺序无关

    原则

    • 适当控制索引的数量
    • 数据量较大
    • 查询比较频繁
    • 常作为查询条件(where)、排序(order by)、分组(group by)操作的字段
    • 尽量建立唯一索引,使用索引的效率越高
    • 字段的长度较长,可以针对于字段的特点,建立前缀索引
    • 尽量使用联合索引,减少单列索引,查询时可以提高覆盖索引,节省存储空间, 避免回表。