什么是索引
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。由此可得到索引的本质是一种数据结构。
简单理解为:排好序的快速查找数据结构
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。
我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+树索引)。
B+树索引检索原理
优缺点
优点:
1、类似图书馆书目索引,提高数据检索的效率,降低数据库的IO成本。
2、通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
缺点:
1、实际上索引也是一张表,该表保存了主键、索引字段,并指向实体表的记录,所以索引也是要占空间的。
2、虽然索引大大提高了查询速度,但却降低了更新表的速度。如对表进行INSERT/UPDATE/DELETE操作时,mysql不仅要保存/更新数据,还要保存/更新索引,如果表数据更新太频繁可能导致因索引频繁更新带来的操作变慢,索引失效等问题。
3、索引只是提高查询速度的一个因素,需要花时间研究建立最优化索引
索引分类
单值索引
一个索引只包含单个列,一个表可以有多个单值索引
唯一索引
索引列的值必须唯一,但允许有空值。主键(PRIMARY KEY)默认是唯一索引
复合索引
一个索引可以包含多个列,高并发场景下倾向于创建复合索引
何时需要创建索引?
适合创建索引的情况:
1、主键自动创建唯一索引
2、频繁作为查询条件的字段应当创建索引
3、查询中与其他表关联的字段,即外键适合创建索引
4、查询中排序的字段适合创建索引。因为排序字段若通过索引去访问将大大提高排序速度
5、查询中统计或者分组的字段适合创建索引
不适合建立索引的情况:
1、频繁更新的字段,经常增删改的表,不适合创建索引
2、WHERE条件里用不到字段不适合创建索引
3、表记录太少的情况无需建立索引
4、如果某个数据列中包含许多重复的内容,为它建立索引就没有太大的实际效果