Skip to content

索引的使用

什么是索引

  • 索引就相当于字典中的目录,有了目录我们就能通过目录快速的找到想要的结果

  • 但是如果没有目录,没有索引那么如果想查找某条数据就必须从前往后一条条的查找

  • 所以索引就是用于帮助我们提升数据的查询速度的

索引的优缺点和使用原则

优点:

  • 大大加快数据的查询速度
  • 没有任何限制,所有MySQL字段都可以用作索引

缺点:

  • 索引是真实存在的会占用内存空间、会增加数据库体积

  • 如果对作为索引的字段进行增删改操作,系统需要花费时间去更新维护索引

原则

  • 对于常用于查询的字段应该创建索引(作为where条件字段、作为group by分组字段、作为order by 排序字段)

  • 对于主键和外键系统会自动创建索引,无需我们手动创建

  • 对于数据量小的表不需要刻意使用索引

索引的分类:

  • 单值索引:将某个字段的值作为索引

  • 复合索引:将多个字段的值作为索引

  • 唯一索引(唯一键):索引列中的值必须是唯一的,但是允许为空值

  • 主键索引:是一种特殊的唯一索引,不允许有空值

索引操作

查看当前查询是否使用索引

  1. 查询没有索引的表

select * from stu where id = 999999; #0.695s

  1. 查询有索引的表

select * from stu2 where id = 999999; #0.008s

  1. 查看当前的查询语句是否用到索引

explain sql语句;

  • 如果返回的结果集中的key有值,那么就表示当前的查询语句中用到了索引
  • 如果返回的结果集中的key没有值,那么就表示当前的查询语句中没有用到索引

添加索引

  1. 给表设置主键,只要设置了主键,那么系统就会自动创建对应的索引

  2. 给表设置外键,只要设置了外键,那么系统就会自动创建对应的索引

  3. 给表设置唯一键,只要设置了某一个字段的取值是唯一的,也会自动创建对应的索引

  4. 创建表的时候指定给哪个字段添加索引:

sql

create table test1(
    id int,
    name varchar(255) unique, # 唯一索引
    index 索引名称(字段名称) # 手动指定索引
);

  1. 创建好表之后再给指定字段添加索引
sql

create index 索引名称 on 表名称(字段名); # 创建索引

alter table 表名称 add index 索引名称(字段名称); # 创建索引

  1. 删除索引
sql

drop index 索引名称 on 表名称;

索引算法

BTREE算法:

索引算法决定了如何创建索引

索引算法决定了如何查找索引对应的数据

btree查找:


              4
      |---------------|
      2               6
 |---------|     |---------|
 1         3     5         7

查找方式:BTree索引是基于平衡多叉树排序实现的,能够缩短查询次数

将小的数据放到枝干的左侧,大的数据放到枝干的右侧,一层层的向下对比查找数据

Hahs索引:

哈希索引是基于哈希表实现的,只能用于memory存储引擎,可以一次性定位到指定数据

Released under the MIT License.