MYSQL:基础——索引原理

什么是索引

B-树

  数据库索引是存储在磁盘上的,当数据量比较大的时候,索引的大小将会达到几个G。当我们利用索引查询的时候,无法把整个索引全部加载到内存中。而是逐一加载每一个磁盘页,这里的磁盘页对应索引树的结点。

  

  B-树,一种平衡多路查找树。适用于查找磁盘中的大量数据。为了减少IO次数,B树最明显的特征是“矮胖的”,即深度较小。初次之外,还有如下特征:

  1. B树每个节点可以有多个子树,M阶B树表示该数每个节点最多有M个子树
  2. 根节点至少有两个子树;中间节点都包含k-1个关键字,和k个子树,其中(M/2<=K<=M)。
  3. 所有的叶子节点都在同一层。
  4. 每个节点中的元素从小达到排序,节点当中k-1个关键字正好被k个子树包含的元素的值域分划。

注:B-树(中间的不是减),B是Balance的意思。

3阶B-树

  如下图所示是一个3阶的B树。

    

  当单一节点中的关键字更多时,查询的比较次数会更多,但是可以减少IO读写次数。在这里我们需要知道的是在内存中的比较耗时机会可以忽略,IO次数足够小,就可以提升查找性能

B+树

  B+树是基于B-树的一种变体,有着比B-树更高的查询性能。B+树具有如下特征:

  1. 有k个子树的中间节点包含有k个关键字(B树中是k-1个关键字),每个关键字不保存数据,只用来索引,所有数据都保存在叶子节点
  2. 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  3. 所有的中间节点关键字都同时存在于子节点,在子节点关键字中是最大(或最小)元素。

  概念有点晦涩,我们看一个例子。

  

  最明显的特点就是中间节点的关键字全部都会包含在在叶子节点中,所以中间节点的关键字只是做索引,不保存数据。每一个叶子节点都带有指向下一个节点的指针,形成一个有序链表

快在哪里

  B+树的好处主要体现在查询性能上。由于中间节点不保存数据,所以同样大小的磁盘页可容纳更多的关键字。这意味着,数据量相同的情况下,B+树比B树更矮胖,IO查询次数越少。同时B+树查询性能更加稳定,因为B树匹配的关键字可能在叶子节点也可能在中间节点,而B+树一定在叶子节点上。其次在范围查找上,由于叶子节点之间形成有序链表所以速度更快

通过索引优化慢查询

建索引的原则

  • 最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
  • =和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。
  • 尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
  • 尽量选择区分度高的列作为索引。
  • 索引列不能参与计算,保持列“干净”。

慢查询优化实例

  如下查询语句

select
count(*)
from
task
where
status=2
and operator_id=20839
and operate_time>1371169729
and operate_time<1371174603
and type=2;

  根据最左匹配原则,最开始的sql语句的索引应该是status、operator_id、type、operate_time的联合索引;其中status、operator_id、type的顺序可以颠倒。

  但是这只是一种语句,我们其实需要把这个表所有查询都找到,进行综合定夺。

参考资料

最新文章

  1. sys.argv
  2. 序列最小最优化算法(SMO)-SVM的求解(续)
  3. sql 遍历结果集
  4. jQuery 选择器 (基础恶补之三)+Ajax
  5. 发现Select等注入语句自动跳转Code
  6. JAVA基础知识之网络编程——-基于UDP协议的通信例子
  7. Git分支管理详解
  8. 分享一个快速的Json(反)序列化开源项目 Jil
  9. 本人在安装ADT Bundle for windows的各种问题总结
  10. 从0开始学习react(一)
  11. Handler一定要在主线程实例化吗?new Handler()和new Handler(Looper.getMainLooper())的区别?
  12. linux 内核开发基础
  13. PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等
  14. iOSXML &amp; JSON 简介
  15. LintCode 521.去除重复元素
  16. 数据类型表(DELPHI、C++)
  17. Solve Error: Library not loaded: @rpath/RoutingHTTPServer.framework/RoutingHTTPServer
  18. 温顾知新系列-JAVA网络编程系统(1)- 流
  19. Android对接WebService -- The given SOAPAction http://webservice.ams.cnpc.com/getServerTime does not match an operation.
  20. 实验二Java面向对象程序设计

热门文章

  1. 讲心情 demo1
  2. jsp文件上传下载组件
  3. 结构化异常SEH处理机制详细介绍(一)
  4. cgp的辣鸡比赛题解
  5. LibreOJ #6191. 「美团 CodeM 复赛」配对游戏
  6. pandas数据保存至Mysql数据库
  7. linux服务器时间乱码问题解决
  8. 利用Unicode RTLO方法构建恶意文件名
  9. OSPF基本详解
  10. Spark(二)—— 标签计算、用户画像应用