zoukankan      html  css  js  c++  java
  • 数据库索引的理解

    数据库查询优化

    数据库存储大量数据大量检索只是从所有数据中取出其中少量的数据。如果取出少量数据每次都检索遍历(读取并判断是否是目标数据)所有数据,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/

  • 相关阅读:
    android学习之4种点击事件的响应方式
    python Eve RESTFul 尝试笔记
    完成端口学习笔记(一):完成端口+控制台 实现文件拷贝
    POJ3080:Blue Jeans
    如何让ros支持C++11标准
    ros卸载
    文件读写
    sys.exit()主动结束程序
    python函数查询、数学和比较操作符、二元操作符
    labellmg使用方法
  • 原文地址:https://www.cnblogs.com/fmys/p/8882074.html
Copyright © 2011-2022 走看看