数据库查询优化
数据库存储大量数据大量检索只是从所有数据中取出其中少量的数据。如果取出少量数据每次都检索遍历(读取并判断是否是目标数据)所有数据,IO消耗巨大,影响性能。
所以为了减少IO消耗,应该对常用做检索条件和排序的字段建立索引。
问题
1.索引如何减少IO
一次访盘请求(读/写)完成过程由三个动作组成
寻道时间(磁头移动定位到指定磁道 )
旋转延迟时间 (等待指定扇区从磁头下旋转经过)
数据传输时间 (数据在磁盘与内存之间的实际传输)
数据库每次访问索引文件找到目标数据位置 IO次数为tree的深度 , 得到数据的存储位置 再进行一次IO访问 读取数据。相对遍历所有数据块减少了IO次数。
2.为什么Sex字段不建立索引
建立索引 ,考虑到数据存储顺序按照聚集索引顺序存储 ,索引时间里在物理顺序上的B+Tree 结构 ,非聚集索叶节点存储数据的物理位置,通过非聚集索引找到目标数据存储位置再去存储位置取出数据,读取数据时一次读取一块数据。Sex建立索引只有两个分支,b+Tree是多路平衡查找树 即使简历对半的索引 因为男女应该是均匀分布在数据库中所以IO次数没有改善
示意图出自严蔚敏老师的数据结构
顺序集的节点包含多个Key 每个Key对应一个控制区间,控制区间中数据顺序存储
如上图 男女均匀分布在数据集的控制区间
对Sex建立索引 通过索引找到所有的 Sex= 男 还是要读取所有的控制区间块 ,所以IO次数没有减少 建立索引没有意义。
总结:
优化查询 关键在于减少IO
减少 IO 关键在于建立索引
建立索引 优化sql语句命中索引 减少IO 优化查询
其他:
Index Seek And Index Scan https://blog.sqlauthority.com/2007/03/30/sql-server-index-seek-vs-index-scan-table-scan/