浅谈sql索引 (2)

首先把磁盘块1由磁盘加载到内存,此时发生一次IO;在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,因为内存时间非常短(相比磁盘的IO)可以忽略不计。

将磁盘块1的P2指向的磁盘块3由磁盘加载到内存,发生第二次IO;确定29在26和30之间,指向磁盘块3的P2指针。

将磁盘块3的P2指针指向的磁盘块8加载到内存,发生第三次IO,同时内存中做二分查找找到29。

查询结束,总计三次IO。

真实的情况是:3层的B+树可以表示上百万的数据,如果上百万的数据查找只需要3次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要上百万次IO。

总结:减少IO次数可以减少查询时间,提高性能,那么怎么减少IO次数?
答案:增加树的广度而非深度。B+树的叶子节点可以多。

建立索引的时机 哪些情况需要创建索引

主键自动建立唯一索引

频繁作为查询条件的字段应该创建索引

查询中与其他表关联的字段,外键关系建立索引

频繁更新的字段不适合创建索引 -- 因为每次更新不只更新记录还会更新索引

Where里用不到的字段的不创建索引

单键/组合索引的选择问题 -- 在高并发下倾向创建组合索引

查询中排序的字段 -- 排序字段若通过索引去访问将大大提高排序速度

查询中统计或者分组字段

哪些情况不需要创建索引

表记录太少 -- mysql300w左右就可以考虑建索引了

经常增删改的表 -- 因为索引要跟着更新

数据重复且分布平均的表字段 -- 可以用(该字段不同的数据的数量)/(该字段总的数据量),值越接近1,说明不怎么重复,越有建索引的价值。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyppy.html