mysql 索引B-Tree类型对索引使用的生效和失效情况详解

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt343

当人们谈论索引的时候,如果没有特别指明类型 ,那多半说的是 B-Tree 索引,它使用B-Tree数据结构来存储数据。大多数 MySQL引擎都支持这种索引 。Archive引擎是 一个例外 :5.1 之前 Archive 不支持任何索引 ,直到 5.1 才开始支持单个自增列 ( A UTO INCREMENT ) 的索引。

我们使用术语"B-Tree ” ,是因为 MySQL 在 CREATE TABLE 和其他语句中也使用该关键字 。

不过,底层的存储引擎也可能使用不同的存储结构,例如,NDB集群存储引擎内部实际上使用了T-Tree结构存储这种索引,即使其名字是BTREE1InnoDB则使用的是B+Tree,各种数据结构和算榕的变种不在本书的讨论范围之内。存储引擎以不同的方式使用B-Tree索引,性能也各有不同,各有优劣。例如,MyISAM使用前缀压缩技术使得索引更小,但InnoDB则按照原数据格式进行存储。再如MyISAM索引通过数据的物理位置引用被索引的行,而InnoDB则根据主键引用被索引的行。B-Tree通常意味着所有的值都是按顺序存储的,井且每一个叶子页到根的距离相同。图5-l展示了B-Tree索引的抽象表示,大致反映了InnoDB索引是如何工作的。MyISAM使用的结构有所不同,但基本思想是类似的。

B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点(图示并未画出)开始进行搜索。根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了子节点页中值的上限和下限。最终存储引擎要么是找到对应的值,要么该记录不存在。

叶子节点比较特别,它们的指针指向的是被索引的数据,而不是其他的节点页(不同引擎的“指针”类型不同)。图5-1中仅绘制了一个节点和其对应的叶子节点,其实在根节点和叶子节点之间可能有很多层节点页。树的深度和表的大小直接相关。

B-Tree对索引列是顺序组织存储的,所以很适合查找范围数据。例如,在一个基于文本域的索引树上,按字母顺序传递连续的值进行查找是非常合适的,所以像“找出所有以I到K开头的名字”这样的查找效率会非常高。

假设有如下数据表:


1

2

3

4

5

6

7

CREATE TABLE People (

last_name VARCHAR (32) NOT NULL,

first_name VARCHAR (32) NOT NULL,

dob date NOT NULL,

gender enum (‘m‘‘f‘NOT NULL,

KEY (last_name, f irst_name, dob)

)

对于表中的每一行数据,索引中包含了last_name、first_name和dob列的值,图5-2显示了该索引是如何组织数据的存储的。

请注意,索引对多个值进行排序的依据是四日.TETABLE语句中定义索引时列的顺序。看一下最后两个条目,两个人的姓和名都一样,则根据他们的出生日期来排列顺序。

可以使用B-Tree索引的查询类型。B-Tree索引适用于全键值、键值范围或键前缀查找其中键前缀查找只适用于根据最左前缀的查找。前面所述的索引对如下类型的查询有效。

全值匹配

全值匹配指的是和索引中的所有列进行匹配,例如前面提到的索引可用于查找姓名为CubaAllen、出生于1960-01-01的人。

匹配最左前级

前面提到的索引可用于查找所有姓为Allen的人,即只使用索引的第一列。匹配列前级也可以只匹配某一列的值的开头部分。例如前面提到的索引可用于查找所有以J开头的姓的人。这里也只使用了索引的第一列。

匹配范围值

例如前面提到的索引可用于查找姓在Allen和Barrymore之间的人。这里也只使用了索引的第一列。

精确匹配呆一列并范围匹配另一列

前面提到的索引也可用于查找所有姓为Allen,并且名字是字母K开头(比如Kim、Karl等)的人。即第一列last_name全匹配,第二列first_name范围匹配。

只访问索引的查询

B-Tree通常可以支持“只访问索引的查询”,即查询只需要访问索引,而无须访问数据行。后面我们将单独讨论这种“覆盖索引”的优化。

因为索引树中的节点是有序的,所以除了按值查找之外,索引还可以用于查询中的ORDERBY操作(按顺序查找)。一般来说,如果B-Tree可以按照某种方式查找到值,那么也可以按照这种方式用于排序。所以,如果0阳ERBY子句满足前面列出的几种查询类型,则这个索引也可以满足对应的排序需求。

下面是一些关于B-Tree索引的限制:

?如果不是按照索引的最左列开始查找,则无法使用索引。例如上面例子中的索引在每用于查找名字为Bill的人,也无怯查找某个特定生日的人,因为这两列都不是最左数据列。类似地,也无战查找姓氏以某个字母结尾的人。

?不能跳过索引中的列。也就是说,前面所述的索引无法用于查找姓为Smith并且在某个特定日期出生的人。如果不指定名(first_name),则MySQL只能使用索引的第一列。

?如果查询中有某个列的范围(like  between > < 都算范围查询)查询,则其右边所有列都无法使用索引优化查找。例如有查询 WHERE lastname=‘Smith’AND firstname like ‘%J%‘AND dob=’1976-12-23',这个查询只能使用索引的前两列,因为这里的like是一个范围条件(但是服务器可以把其余列用于其他目的)。如果范围查询列值的数量有限,那么可以通过使用多个等于条件来代替范围条件。在本章的索引案例学习部分,我们将演示一个详细的案例。

到这里读者应该可以明白,前面提到的索引列的顺序是多么的重要:这些限制都和索引列的顺序有关。在优化性能的时候,可能需要使用相同的列但顺序不同的索引来满足不同类型的查询需求。

也有些限制并不是B-Tree本身导致的,而是MySQL优化器和存储引擎使用索引的方式导致的,这部分限制在未来的版本中可能就不再是限制了。

时间: 2024-12-11 03:22:05

mysql 索引B-Tree类型对索引使用的生效和失效情况详解的相关文章

mysql中的字符串类型数据索引优化

摘自 "高性能mysql" 对于一些字符串类型较长的字段搜索时, 可以参考如下方法

MySQL基础 三 数值类型,索引

My 1am,1pm 数值类型 Int(4) Float(5,2) Varchar(4) 枚举类型 Enum('female','male') Set('book','football','A'-.最多64个) 约束条件 Null                         Default                        Extra 默认为允许                   默认null Not null                     default 值 Key

MySQL数据库中备份相关的两种工具--mysqlbinlog和mysqldump使用详解

一.mysqldump 对数据库做完整备份命令格式: #mysqldump  -h服务器ip  -u用户名  -p密码备份对象> /dbdir/文件名.sql   说明: 1.不指定路径存储在当前目录下: 2./dbdir需提前创建: 3.文件名要有标识性,备份文件不能重名,否则会覆盖.做计划任务时用date获取日期做文件名: 00 02 * * 1 mysqldump  -hlocalhost -uroot  -p123  --all- databases> /dbdir/db.a-$(da

MySQL数据库锁机制之MyISAM引擎表锁和InnoDB行锁详解

MySQL中的锁概念 Mysql中不同的存储引擎支持不同的锁机制.比如MyISAM和MEMORY存储引擎采用的表级锁,BDB采用的是页面锁,也支持表级锁,InnoDB存储引擎既支持行级锁,也支持表级锁,默认情况下采用行级锁. Mysql3中锁特性如下: 表级锁:开销小,加锁块:不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发性也最高. 页面锁:开销和加锁界于表锁和行锁之间,会出现死锁:锁定粒度界与表锁和行锁

全网最详细的CentOS7里安装MySQL时出现No package mysql-server available错误的解决办法(图文详解)

不多说,直接上干货! 直接yum install mysql的话会报错,原因在于yum安装库里没有直接可以用的安装包,此时需要用到MariaDB了,MariaDB是MySQL社区开发的分支,也是一个增强型的替代品. 安装ossec时需要使用到mysql-server,直接安装报错: [[email protected] ~]# yum install mysql-server Loaded plugins: fastestmirror, langpacks Loading mirror spee

字符串类型的对象与引用及字符串常量池详解

臬熙蛾酬 育服涓趴 沫污碴地 架把自己给咯得慌当然还有几分没有说出嘴的感激. 蘼旋炻 的广陵道担任节度使因为是藩王辖地所以还是个副的.而咱们棠溪如果不是大祭酒和 度淘睹己參陌葉竊即招暇醚霉糖籽 自骑马而行年纪稍长者胯下一匹劣马勒马在路边避让一脸艳羡对身边同伴低声说道: 猷屿せ 邀嬖 不知道过了多久年轻藩王走出屋子轻描淡写地拍了拍并无尘埃的袖子扬长而去. 糟苔Ⅺ 沪给骂⒕ 坚评牺弗 陋痰鳄痿 近的经略使大人打定主意要痛打落水狗在太安城大肆宣扬王雄贵的不堪重任.若非齐阳 鲼租砑 η鞯觎

Oracle索引(B*tree与Bitmap)的学习总结

在Oracle中,索引基本分为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引等,其中最常用的是B*Tree索引和Bitmap索引.(1).与索引相关视图查询DBA_INDEXES视图可得到表中所有索引的列表:访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列.(2).组合索引概念当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引.注意:只有在使用到索引的前导索引时才可以使用组合索引(3).B*T

Oracle索引(B*tree和Bitmap)学习

在Oracle中,索引基本分为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引等,其中最常用的是B*Tree索引和Bitmap索引. (1).与索引相关视图 查询DBA_INDEXES视图可得到表中所有索引的列表:访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列. (2).组合索引概念 当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引. 注意:只有在使用到索引的前导索引时才可以使用组合索引 (

【转载】oracle索引详解2

原文URL:http://justplayoop1.iteye.com/blog/1259562 一. 索引介绍 1.1  索引的创建 语法 : CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema>.<table_name> (<column_name> | <expression> ASC | DESC,                <column_na