1.什么是索引?
索引就是存储引擎为了提高数据的访问效率提供的一种数据结构;是对数据库表中一个或多个列的值排序的结构。
2.索引的优势
- 索引能够加快数据库的检索速度
- 确保每一行数据的唯一性
- 可以在查询的过程中使用隐藏优化器一高系统的性能
3. 索引的缺点
- 索引会降低插入、删除、修改等人物的速度
- 索引需要空间存储,也需要定期维护,每当有记录在表中增减或索引列被修改时,索引本身也会被修改。这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5次的磁盘I/O.
- 索引不但会使得插入和修改的效率降低,而且在查询的时候,有一个查询优化器,太多的索引会让优化器困惑,可能没有办法找到正确的查询路径,从而选择了慢的索引。
4.索引的种类
索引有主键索引、唯一索引、全文索引、普通索引、组合索引
索引又可以分为聚集索引和非聚集索引
聚集索引:索引为主键,叶子节点为整行数据数据。在InnoDB里称为聚簇索引
非聚集索引:除主键以外的字段,该索引的叶子节点的内容是主键的值而不是整行数据,非聚集索引需要两步才能查出结果。联合索引指的是多个字段组合而成的索引属于非聚集索引。在InnoDB里被称为二级索引
注意:主键的长度越小,普通索引对应的叶子节点就越小,索引占用的空间也越小。
5.索引有哪些结构
1.hash:以键-值即(key-value)存储数据的结构,根据输入的key找到对应的值。执行过程先通过哈希函数计算出key的位置,然后将key放入数组,若发生hash冲突则将挂载到链表中;倘若有多个key冲突会造成查询性能下降(hash冲突)。
适用场景:等值查询
2.有序数组:只适用于静态存储引擎:用于等值查询和范围查询(id必须递增)
3.B+树:左子节点<父节点<右节点innoDB默认使用b树
B+树与hash的区别:
- 由于hash采用哈希表实现,是kv结构,存储数据没有顺序,无法实现利用索引查询区间的数据,所以采用多路平衡的B+树来实现,它的节点是天然有序的,对于范围查询无需全表扫描。
- 哈希索引无法利用索引实现排序
- 哈希索引不支持组合索引的最左匹配原则
- 在大量键值的情况下会降低查询效率(哈希碰撞)
6.导致索引失效的因素:
- where子句中使用or连接,因替换为in(若要使用or的话需要将or条件中的所涉列建立索引,查询每个列使用单独的索引)
- where子句中使用(!=、<>、is null、is not null{应替换为exists})
- like模糊查询时(%x)的形式会全表扫描
- 使用索引进行表达式操作和函数操作
- 对索引应用内部索引
7.建立索引的场景
需要建立:
1.主键自动创建唯一索引。
2.为作为条件频繁查询的字段建立索引
3.查询与其他表关联的字段,外键关系建立索引
4.为排序字段创建索引
不需要:
1.表记录少的不建议创建索引
2.经常做增删改的表不建议创建索引
3.where子句用不到的字段