正确的创建合适的索引是提高数据库查询性能的基础。
什么是索引:
索引是为了加速对表中数据行的检索而创建的一种分散存储的数据机构。
为什么需要索引:
- 索引能极大的减少存储引擎的需要的扫描量
- 索引能把随机io变成顺序io
- 索引可以帮助我们在进行分组、排序等操作时,避免使用临时表
索引的数据结构:
- B+Tree
- hash
为什么选择B+Tree:
对比二叉树 平衡二叉查找树 多路平衡查找树B-Tree 加强版多路平衡查找树B+树,详见:https://www.cnblogs.com/vianzhang/p/7922426.html
树的宽度,深度是如何计算
为什么选择hash:
未完善
常见的mysql存储引擎:
- Myisam
- Innodb
B+ Tree索引的体现形式:
一.Myisam
B+ Tree子叶 存储引用关系
使用MYI、MYD来保存:MYI保存索引和引用位置,MYD保存数据。
二. Innodb
只使用一个文件IBD来保存索引和数据
以主键为索引来组织数据存储
聚集索引:数据库表中数据的物理顺序与键值的逻辑(索引)顺序相同
辅助索引需要通过主键索引来查找数据
联合索引选择的原则:
- 经常使用的列优先【最左匹配原则】
- 选择性(离散度[差异性])高的列优先**【离散度高原则】**
- 宽度小的列优先**【最少空间原则】**(宽度越小[索引的长度越短],树越矮胖。mysql–16k为一页,磁盘读写4k为一页,4*1024/索引长度)
覆盖索引:
如果查询列可通过索引节点中的关键字直接返回,则该索引称之为
覆盖索引。
覆盖索引可减少数据库IO,将随机IO变为顺序IO,可提高查询性能
索引
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
LIKE百分写最右,覆盖索引不写星;
不等空值还有or,索引失效要少用;