目录
1、索引是什么?
索引是一种特殊的文件,索引中包含了表数据的记录指针。索引通俗地理解,它就类似书的目录(类似而不等同于后面会讲区别),通过目录我们可以快速找到我们要找的内容。(通过索引我们可以快速找到我们想要的数据)
本文讲的索引/事务都是基于MySQL 5.5 之后默认的数据库引擎 InnoDB。
MySQL数据库引擎?MySQL常见的引擎有哪些?
在MySQL5.5 之前 默认引擎为MyISAM,5.5之后默认的引擎为InnoDB。二者比较:
①稳定性:InnoDB 引擎支持事务(保证了数据的稳定性),稳定性比MyISAM好,性能一般
②性能:MyISAM 性能比较高,但不支持事务。
存储数据的模组:
①磁盘:容量大、价格低廉、操作速度慢、可持久化(重启之后数据还是存在的)。
②内存:容量小、价格比较贵、操作速度块、不可持久化。
③CPU缓存:容量小、操作速度极快,不可以被持久化。
2、为什么要用索引?
使用索引之后大大提升了查询的效率
a)使用索引可以避免顺序查询,可以直接将查询的数据定位出来,效率大大提升。
b)使用索引可以将数据库中的关键索引信息存储到内存中,而内存的操作速度远比磁盘块(若不用索引 其实就是去磁盘上进行数据查询)
3、索引的分类
按照是否为主键:
- 主键索引(聚簇索引/聚集索引)
- 非主键索引(非聚簇索引/非聚集索引/二级索引)
按照特征分:
- 普通索引
- 唯一索引
- 联合索引(就是由一张表的多个字段组成的索引)
4、索引的SQL操作
主键索引、唯一索引它是在创建表的时候,如果设置了主键约束或者是唯一约束,就会自动生成主键索引或唯一索引。
PS:如果创建外键约束那么也会产生索引
注意:
①在创建索引的时候会创建对应的约束,而删除索引的时候也会删除对应的约束。
②唯一索引在创建时,要保持原先数据符合唯一约束,这样才能成功创建唯一索引。如下:
4.1手动创建普通索引
语法:
4.2手动创建唯一索引
4.3创建主键索引(给表加上主键约束)
4.4查看索引
show index from table_name;
4.5删除索引
drop index 索引名 on 表名;
-- 每个索引名在一张表中是唯一的,不能重复。
5、索引的优缺点分析/使用场景/注意事项
5.1 优缺点分析
优点:可以提高数据查询的效率
缺点:
①索引增加了维护成本,因为索引是使用B+树实现的,在数据添加和删除时需要重新整理树的结构,这样会带来新的开销。
②使用索引会增加存储的成本(磁盘/内存)
③如果索引过多会对MySQL的优化器造成一定的负担。
5.2 使用场景
创建索引需要考虑的因素:
①数据量是否足够大,查询 速度是否比较慢
②创建索引的列是否为经常使用的查询条件。
不适合创建索引的场景:
①读比较低频,而数据添加和删除比较高频的表业务,不适合建索引,比如日志表
②MySQL服务器本身安装的电脑上磁盘空间或内存空间不足的抢矿下,不要创建。
5.3 注意事项
如果对已经存在的很多数据的表新增索引的时候,切记不要在生产环境上执行(找一个没有用户使用的时间进行操作),因为索引创建会锁表,其他业务场景只能排队等待。结合游戏更新来理解(更新期间 会停服)
6、问题
6.1 索引 vs 约束
①创建索引的时候会自动创建约束,并且创建约束的时候也会自动创建索引。
②索引和约束是不同的定义,约束时来保证数据的正确性,而索引是用来提高查询效率的。
6.2 索引 vs 书的目录
宏观:可以认为索引就相当于书的目录。
微观:索引不等同于书的目录,因为一本书只有一个目录,而数据库中一张表可以有多个索引。