高性能的MySQL(5)创建高性能的索引一B-Tree索引

本文详细介绍了MySQL中B-Tree索引的类型,包括B+Tree索引的特性和存储方式,以及如何利用索引来优化查询性能。通过实例展示了索引在全键值、键值范围或键前缀查找中的应用,同时阐述了B-Tree索引的限制和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、索引的类型

MySQL中,索引是在存储引擎层实现的,而不是服务器层,所以没有统一的标准。

MySQL支持的索引类型如下:

1、B-Tree索引(也包括B+Tree索引,统称为B-Tree索引,只是数据结构上的不同,特性上是一样的)

使用B-Tree数据结构来存储数据,实际上很有存储引擎使用的是B+Tree。关于BTree、B-Tree、B+Tree的区别请看本博客的附件

InnoDB就是使用的B+Tree索引。

B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到跟的距离相同。

B-Tree对索引列是顺序组织存储的,所以很适合查找范围数据。

B-Tree索引适合用于全键值、键值范围或键前缀查找,其中键前缀查找只适合用于根据最左前缀查找。

举例说明:

113840753.png

数据如下:

114521246.png

a、全值匹配

对索引中的所有列进行匹配,必须按索引定义的顺序,比如:115627622.png
b、匹配最左前缀

只使用索引的第一列

120120123.png
c、匹配列前缀

只使用索引的第一列

120505768.png
d、匹配值范围

只使用索引的第一列

130301192.png

e、精确匹配某一列并范围匹配另外一列

130554513.png


f、只访问索引的查询

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


因为B-Tree是按顺序存储的,所以还可以用于查询中的排序操作order by,所以order by 如果满足前面列出的几种查询类型,则这个索引也可以满足对应的排序需求。


B-Tree索引的限制,无法用到索引的说明

a、不是按照最左列开始查找,则无法使用到索引。

131416461.png

当然dob字段也是一样的,即使是最左列也无法使用索引查找“%a”的格式

131741565.png

b、不能跳过中间的列,否则只能使用到索引的第一列

132745270.png

c、如果查询中有某个列的范围查询,则其右边的列无法使用索引优化,左边可以用到索引

150023855.png

这里显示都没有用到索引,是因为数据太少,可能引擎有自己的优化,增加数据到了1000条以上可以看看效果:可以看到的却查询影响的条数一样,的却是没有用到右侧的索引。

195111951.png

而实际的条数只有更少

195518429.png

所以,索引的顺序是很重要的,在优化性能的时候,可能需要使用相同的列但顺序不同的索引来满足不同类型的查询。




本帖最后由 591691826 于 2013-4-10 13:32 编辑 0.我只说些常用的以及目前用的到的 1.下载附件。解压后拷到c:windows\system32里面。 2.打开运行(快捷键windows键+R)输入cmd 回车。 3.输入adb devices 可以获取当前连接的设备。 4.输入adb shell 回车 接着输入su。这时候$变成#。说明你已经取得权限了,可以进行各项调试命令了。 5.如果要从电脑上传送文件到手机的话,使用adb push命令。格式:adb push 本地路径 手机路径 ;举例:把c盘根目录下的456.txt传送到system。则:adb push c:\456.txt /system/ 传送文件到system文件夹的话。需要先挂载system分区。再改读写权限。 如下:mount -o rw,remount -t yaffs2 /dev/block/mtdblock1 /system回车 (这是挂载分区) chmod 777 /system回车 (修改权限为可读) 这两步做完后退出shell指令端(exit回车 exit回车)就可以push文件到system里面去了。 如果push文件到sdcard卡的话。一般来说直接push就行。如果出现premission denied 的话,需要修改sdcard权限为可读写。即chmod 777 sdcard。 6。adb pull 是从手机传送文件到电脑上。格式: adb pull 手机路径 电脑路径 。会push的话pull很简单。大同小异嘛。 7.关于这个地方的权限,具体说下: 在Unix和Linux的各种操作系统下,每个文件(文件夹也被看作是文件)都按读、写、运行设定权限。例如我用ls -l命令列文件表时,得到如下输出: -rw-r--r-- 1 bu users 2254 2006-05-20 13:47 tt.htm 从第二个字符起rw-是说用户bu有读、写权,没有运行权,接着的r--表示用户组users只有读权限,没有运行权,最后的r--指其他人(others)只有读权限,没有写权和运行权。这是系统默认设置,我可以改写tt.htm,同组的人和其他人只有权读,没人有权运行,因为只是一个html文件,不必运行。这在Novell的directory services之前很先进。 读、写、运行三项权限可以用数字表示,就是r=4,w=2,x=1。所以,rw-r--r--用数字表示成644。 反过来说777就是rwxrwxrwx,意思是该登录用户(可以用命令id查看)、他所在的组和其他人都有最高权限。 再多说一句。我用chmod o-r tt.htm命令改权限,o-r是others的权限中减掉读。结果是 -rw-r----- 1 bu users 2254 2006-05-20 13:47 tt.htm 如果用命令chmod 777 tt.htm,结果是 -rwxrwxrwx 1 bu users 2254 2006-05-20 13:47 tt.htm 任何人都有读、写、运行三项权限。8。以后比如替换系统文件神马的不能开机。可以通过救援模式下adb命令替换系统文件并该权限即可。 .想写的就是这么多了。仅把我的心得告诉大家。内容编辑可能有些混乱。不好意思。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值