数据库中添加索引的目的是为了快速查询和检索数据。常见结构有:B树,B+树和Hash
优势:
- 大大加快了数据检索速度。
- 保证数据的唯一性,通过唯一索引可以保证数据唯一。
- 加速表连接,在连接操作时,如果连接字段上有索引,可以提升性能。
劣势:
- 额外占用存储空间
- 降低了数据增删改的速度,因为表的数据更新时,需要维护索引结构。
一般行数超过300的表就应该有索引
索引类型
- 普通索引
- 唯一索引
- 主键索引
- 联合索引(单列索引和多列索引)
- 全文索引
主键索引:
数据表的主键列就是主键索引。一张表只能有一个主键,并且主键不能为null,不能重复。
在mysql的lnnoDB的表中如果没有显示指定的主键,就会查询表中是否有唯一索引的字段,如果没有就会自动生成一个6Byte的自增主键。
二级索引
二级索引又称为辅助索引,因为二级索引的叶子节点存储的是主键。作用就是用二级索引定位到主键的位置。
- 唯一索引:不允许出现重复的数据,允许数据为NULL,一张表允许创建多个唯一索引,目的是保证属性列的唯一性。
- 普通索引:为了快速查询数据,一张表允许创建多个普通索引,允许数据重复和NULL。
- 前缀索引:只适用于字符串类型的数据,对文本的前几个字符创建索引。
- 全文索引:为了检索答问比数据中的关键词数据。lnnoDB需要5.6版本后支持。
聚集索引
同一个.ibd文件包含了表的索引和数据,每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据。
优势:
- 聚集索引的查询非常快,因为整个B+树本身就是一颗多叉平衡树,叶子节点也是有序的,定位到索引的节点就相当于定位到了数据。
缺点:
- 依赖于有序的数据。因为B+树是多叉平衡树,如果数据不是有序的,就需要在插入数据时排序。
- 更新代价大,如果索引列的数据被修改,对于的索引也要被修改。
非聚集索引
即索引结构和数据是分开了存放的。二级索引属于非聚集索引。
优势:
- 更新代价跟小。
缺点
- 也依赖于有序数据。
- 有可能会二次查询(回表),这是非聚集索引最大缺点,当查到索引对应的指针或者主键后,可能需要根据指针或主键再到数据文件或表中查询
索引创建原则
单列索引:即由一列属性组成的索引。
联合索引:即由多列属性组成索引。
最左前缀原则:SQL语句中使用索引时,需要从索引列的最左边开始,往右边使用,可以不使用全部列,但是不能省略某列,否则索引将失效。
