-
索引本质
在生产环境,对数据库的操作,查找比插入和更新要频繁,为了提高查找效率,引入了索引,加速查找。索引的本质是一种数据结构,类似于你在书中要找某一页的信息,先确定哪一章,再确定哪一节,最后通过页数找到信息。有了索引机制,不仅能够提高查找,同时在每次查找都能够按一种方式来查到数据。
但是。。。索引会降低insert、update、delete操作效率,因为修改了数据,同时还要维护同步索引文件
索引分类
- 普通索引(index)
- 唯一索引 (包含主键primary key)
- 联合索引(index(col1,col2))
- 全文索引(fulltext)
- 索引类型
索引的类型主要分为2种:hash索引 和 B+Tree 索引
hash:通过计算key的hash值,对于查询单条记录快,但范围查询慢
查找时间:o(1)
B+Tree:平衡查找树,减少磁盘IO次数,适用于范围查找
查找时间:o(logN)
- 索引特性
比较常见的是最左前缀原则
- 验证索引是否生效
通过使用 explain 命令可查看执行计划。会将语句经过查询优化器,对语句进行分析,如是否命中索引
建立索引,但不一定应用到索引,如索引列参与了计算、使用了like通配符,不符合最左前缀原则。
- 注意事项
- 联合索引代替多个单列索引,比如建立(a,b,c) 相当于建立(a)、(a,b)、(a,b,c)索引
- 尽量使用短索引,比如数据类型为字符串的,指定长度,提高查询效率同时节省磁盘空间
- 索引列不能有计算,比如timestamp(col) 会导致索引失效,进行全表扫描
- 索引列不能有null列,也会索引失效进行全表扫描
- 使用select col1 代替select(*)
- 使用join 代替sub query
- 聚集索引和非聚集索引
聚集索引不是一种单独的索引类型,而是一种数据存储方式,保存了索引和数据行,该索引中键值的逻辑顺序决定了表中相应行的物理顺序,一张表中只能由一个聚集索引,有多个非聚集索引。