1)         不同应用中B+树索引的使用

对于OLTP应用,由于数据量获取可能是其中一小部分,建立B+树索引是有异议时的

对OLAP应用,情况比较复杂,因为索引的添加应该是宏观的而不是微观的。

2)         联合索引

对表上多个列进行索引。联合索引的创建方法与多个索引创建的方法一样。不同之处在于有多个索引页

CREATE TABLEt(

aINT,

bINT,PRIMARY KEY(a),KEYidx_a_b(a,b)

)ENGINE=INNODB

从本质上来说,联合索引也是一棵B+树,不同的联合索引的键值的数量不是1,而是大于等于2。

讨论一下由2个整数列组成的联合索引,分别为a,b

可以看到键值是顺序的,通过叶子节点可以逻辑上顺序地读出所有的数据,即(1,1)(1,2)(2,1)(2,4)(3,1)(3,2)。数据按(a,b)顺序存放

因此对于查询SELECT * FROM TABLE WHERE a = 1 and b=2,显然是可以使用(a,b)联合索引的。对于单列a查询SELECT * FROM TABLE WHERE a = 1,也是可以用到这个(a,b)索引,但是对于b列SELECT * FROM TABLE WHERE b = 2则不可以使用B+树索引。可以发现叶子节点上b列的值为1 2 1 4 1 2 不是顺序的。因此对于b列的查询是使用不到(a,b)的索引

联合索引的第二个好处是已经对第二个键值进行排序处理。例如在很多情况下,需要对某个用户的购物情况进行查询,并且按照时间排序最后取出最近三次的购物记录,使用联合索引可以避免多一次的排序操作。因为索引本身在叶子节点已经排序了。

CREATE TABLEbuy_log(

useridINT UNSIGNED NOT NULL,

buy_date DATE

)ENGINE=INNODB;INSERT INTO buy_log VALUES(1,'2009-01-01');INSERT INTO buy_log VALUES(2,'2009-01-01');INSERT INTO buy_log VALUES(3,'2009-01-01');INSERT INTO buy_log VALUES(1,'2009-02-01');INSERT INTO buy_log VALUES(3,'2009-02-01');INSERT INTO buy_log VALUES(1,'2009-03-01');INSERT INTO buy_log VALUES(1,'2009-04-01');ALTER TABLE buy_log ADD KEY(userid);ALTER TABLE buy_log ADD KEY(userid,buy_date);

建立了两个索引做比较。都包含userid。

SELECT * FROM buy_log WHERE userid=2;

查看优化器的选择

可以看到两个索引都可以使用。但优化器最终使用了userid,因为该索引的叶子节点包含单个键值。所以理论上一个页能存放的记录应该更多

假定要取出userid=1的最近3次记录

EXPLAIN SELECT * FROM buy_log WHERE userid=1 ORDER BY buy_date DESC LIMIT 3;

这次优化器使用了(userid,buy_date)的联合索引userid_2 因为在这个联合索引中buy_date已经排序了。根据该联合索引取出数据,无须在对buy_date做一次额外的排序操作。若强制使用userid索引

EXPLAIN SELECT * FROM buy_log FORCE INDEX(userid) WHERE userid=1 ORDER BY buy_date DESC LIMIT 3;

可以看到Using filesort,即需要额外的一次排序操作才能完成查询。显然是对buy_date排序。因为索引userid中的buy_date是未排序的

联合索引(a,b)其实是根据列a,b进行排序的,故此下面语句可以直接使用联合索引得到结果

EXPLAIN SELECT * FROM TABLE WHERE a=1 ORDER BY b;

对于联合索引(a,b,c) 也可以直接通过联合索引得到结果

EXPLAIN SELECT * FROM TABLE WHERE a=1 and b = 1 ORDER BYc;

EXPLAINSELECT * FROM TABLE WHERE a=1 ORDER BY b;

但是对于下面语句,就不能得到结果了,需要执行一次filesort排序操作因为(a,c)并未排序

EXPLAIN SELECT * FROM TABLE WHERE a=1 ORDER BY c;

3)         覆盖索引

InnoDB存储引擎支持覆盖索引,即从辅助索引中就可以查询到记录,而不需要查询聚集索引中的记录。使用覆盖索引的一个好处是辅助索引不包含整行记录的所有信息,故其大小远小于聚集索引。因此可以减少大量的IO操作

对于InnoDB存储引擎的辅助索引,由于其包含了主键信息,因此其叶子节点存放的数据为(parimary key1,parimary key2,...key1,key2,...)例如,下面语句都可仅使用一次辅助联合索引来完成查询

SELECT key2 FROM table WHERE key1=xxx;SELECT primary key2,key2 FROM table key1=xxx;SELECT primary key1,key2 FROM table key1=xxx;SELECT primary key1,primary key2,key2 FROM table key1=xxx;

覆盖索引的另一个好处是对某些统计问题而言,如上的buy_log,要进行如下查询

SELECT COUNT(*) FROM buy_log;

InnoDB存储引擎并不会选择通过查询聚集索引来进行统计。由于buy_log还有辅助索引,而辅助索引远小于聚集索引。选择辅助索引可以减少IO操作。

如图显示。possible_keys是NULL,但是实际执行优化器却选择了userid,而列Extra的Using index就是代表优化器选择了覆盖索引的操作

此外,在通常情况下,(a,b)的联合索引,一半是不可以选择列b中所谓的查询条件,但是如果是统计操作,并且是覆盖索引的。则优化器会进行选择

EXPLAIN SELECT COUNT(*) FROM buy_log WHERE buy_date>='2011-01-01' AND buy_date

表buy_log有(userid,buy_date)联合索引,这里只根据b进行了条件查询,一般情况下,是不能进行该联合索引的。但这条SQL语句查询是统计操作。并且可以利用覆盖索引的信息。因此优化器是会选择联合索引的。

mysql b-a全局索引_MySQL中B+树索引的使用相关推荐

  1. mysql教程联合索引_MySQL中的联合索引学习教程

    联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| ...

  2. mysql按升序创建索引_MySQL中如何使用索引

    原标题:MySQL中如何使用索引 者:Airy 在数据分析之路狂奔,立志成为大咖级人物. 前言 学完基础的MySQL知识,以及MySQL的增删改查,我们要学习一些性能方面的东西.今天来讲一下索引(In ...

  3. mysql 添加b树索引_Mysql之B树索引

    聚集索引: 简单概念:一个表中根据主键创建的一棵B+树,索引的叶子节点存放了表中所有的记录,存储记录在物理位置上是连续的,一个叶子节点存放一条对应的记录(PS:是根据主键创建的B+树,叶子节点存数据记 ...

  4. mysql 关联索引_mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?...

    情况描述:在MySQL的user表中,对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引? 根据查询字段的位置不同来决定,如查询a,     a,b    a,b, ...

  5. Oracle索引梳理系列(二)- Oracle索引种类及B树索引

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  6. oracle通过执行计划cost,Oracle 执行计划(5)—cost成本之索引范围扫描-B树索引

    Oracle 执行计划(5)-cost成本之索引范围扫描-B树索引 SQL>  select * from t1 where a<600 ; 已选择599行. 已用时间:  00: 00: ...

  7. oracle执行计划cost单位,Oracle 执行计划(5)—cost成本之索引范围扫描-B树索引

    Oracle 执行计划(5)-cost成本之索引范围扫描-B树索引 SQL>  select * from t1 where a<600 ; 已选择599行. 已用时间:  00: 00: ...

  8. mysql按升序创建索引_Mysql中的降序索引底层实现

    什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引 ...

  9. mysql explain 索引_MySql中Explain详解与索引最佳实践

    使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是 如何处理你的SQL语句的.分析你的查询语句或是结构的性能瓶颈 下面是使用 explain 的例子: 在 select 语句之 ...

最新文章

  1. Dell PowerVault TL4000 磁带机卡带问题
  2. 告别深度学习炼丹术!谷歌大脑提出“权重无关”神经网络
  3. C#速成之一(Quick C#)
  4. 60亿元高新项目落户西安
  5. python max函数_Python max内置函数详细介绍
  6. 微信支付开发(6) 收货地址共享接口
  7. 罗永浩:锤子手机比索尼、夏普、微软、LG都好
  8. hashmap是单向链表吗_HashMap源码大剖析
  9. HashTable与ConcurrentHashMap的区别
  10. jsp session 的状态保持, cookie的跨域访问(一)
  11. ROS kinetic自定义路径规划算法
  12. 研发数据安全解决方案
  13. lame编程实现wav转mp3后时长错误的问题
  14. 如何零基础创建自己的微信小程序
  15. 冰桶挑战引来了百度搜索冰桶算法
  16. python生存曲线_用户行为与生存分析
  17. 手把手教你制作手机底部导航栏,领导看完都说好
  18. MySQL数据库基本管理
  19. 小米4c+android+6,小米4c有什么接口?小米4c有HDMI接口吗?
  20. IGES文件解析1——几何图元(更新中...)

热门文章

  1. Linux C :Linux 下第一个C程序
  2. Redis概述、数据类型
  3. 工具SSHSecure连接远程服务器步骤
  4. windows下mysql命令_windows下的mysql命令使用
  5. matlab 二维高斯滤波 傅里叶_光电图像处理 | 傅里叶变换(二)
  6. 连招 横版 flash 游戏_街机游戏中的无限连究竟有多变态?有种对决叫作没开始就结束了!...
  7. oracle erp 库存相关,oracle erp库存模块表(INV)
  8. 虚拟机上怎么配置mysql数据库_Linux虚拟机下安装配置MySQL
  9. python mysql example_Python_Example_ Pycharm(python) 与 数据库(MySQL) 连接学习/示例
  10. HTML--三种样式插入方法--链接---表格---列表