mysql -b -e_MySQL 的B+树索引.

一、B+树索引概述

索引是应用程序设计和开发的一个重要方面。若索引太多,应用程序的性能可能会受到影响(需维护索引的结构和数据);而索引太少,对查询性能又会产生影响。

二叉树,左子树的键值总是小于根的键值,右子树的键值总是大于根的键值。

平衡二叉树(AVL树),任何节点的两个子树的高度最大差为 1。平衡二叉树的查询速度很快,但是维护一棵平衡二叉树的代价是非常大的。通常来说,需要 1 次或多次左旋和右旋来得到插入或更新后树的平衡性。

B+ 树是为磁盘或其他直接存取辅助设备设计的一种平衡查找树,B+ 树中的 B 不是代表二叉(binary),而是代表平衡(balance)。在 B+ 树中,所有记录节点都是按键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行连接,叶子节点之间组成一个双向链表。

60209.html

B+ 树索引的本质就是 B+ 树在数据库中的实现,但是 B+ 索引在数据库中有一个特点是高扇出性(数据库分区),因此在数据库中,B+ 树的高度一般都在 2-4 层,这也就是说查找某一键值的行记录时最多只需要 2 到 4 次IO。

数据库中的 B+ 树索引可以分为 聚集索引和辅助索引。

B+ 树索引并不能找到一个给定键值的具体行。B+ 树索引能找到的只是被查找数据行所在的页。然后数据库通过把页读入到内存,再在内存中查找,最后得到要查找的数据。

二、索引创建和查看

索引的创建和删除可以通过两种方法,一种是 ALTER TABLE,另一种是 CREATE/DROP INDEX。用户可以设置对整个列的数据进行索引,也可以只索引一个列的开头部分数据。

## 添加索引

alter table add index (column_list);

alter table add unique(column_list);

alter table add primary key(column_list);

## 删除索引

alter table drop index ;

alter table drop primary key;

## 添加索引

create index on (column_list);

create unique index on (column_list);

## 删除索引

drop index on ;

索引的查看,可以使用命令 SHOW INDEX。

SHOW INDEX FROM

60209.html

Non_unique 表示是否非唯一的索引;Column_name 表示索引列的名称;Seq_in_index 表示索引中该列的位置;Collation 表示列以什么方式存储在索引中,可以是 A 或 NULL,B+ 树索引总是 A,即排序的;Sub_part 是否是列的部分被索引,如果是整个列,则该字段显示为 NULL;Packed 关键字如何被压缩;Null 是否索引中的列含有 NULL 值;Index_type 索引的类型。

Cardinality 非常关键的值,表示索引中唯一值的数目的估计值,优化器会根据这个值来判断是否使用这个索引。这个值并不是实时更新的,如果需要实时更新 Cardinality 的信息,可以使用 ANALYZE TABLE 命令。建议在非高峰时间,对应用程序下的几张核心表做 ANALYZE TABLE 操作,这能使优化器和索引更好的工作(除了 ANALYZE TABLE 外,还有 SHOW TABLE STATUS、SHOW INDEX 以及访问 INFORMATION SCHEMA 架构下的表 TABLES 和 STATISTICS 都会去重新计算 Cardinality 值)。

MySQL 对于主键索引的创建会采用临时表的方式,首先会创建一张带有主键索引的临时表,然后把原表中数据导入到临时表,接着删除原表,最好把临时表重命名为原表名,这部分操作会导致数据库不可用,因此建议在创建表的时候就定义好主键!

MySQL 对于辅助索引的创建支持 FIC —— Fast Index Creation(快速索引创建)方式,其会对创建索引的表加上一个 S 锁,不需要建立临时表。

MySQL 5.6 版本开始支持 Online DDL(在线数据定义)操作,其允许辅助索引创建的同时,还允许其他诸如 INSERT、UPDATE、DELETE 这类 DML 操作,其原理是将 DML 操作日志写入到一个缓存中,待完成索引创建后再将缓存应用到表上,以此达到数据的一致性,这个缓存的大小由参数 innodb_online_alter_log_max_size 控制,默认的大小为 128MB。

AlTER TABLE [index_type](index_col_name)

ALGORITHM [=] {DEFAULT|INPLACE|COPY}

LOCK [=] { DEFAULT| NONE| SHARED| EXCLUSIVE }

ALGORITHM 制定了创建和删除索引的算法,COPY 选择创建临时表的方式;INPLACE 表示创建和删除索引不需要创建临时表;DEFAULT 会根据参数 old_alter_table 来判断是使用 INPLACE 算法还是 COPY 算法,该参数的默认值为 OFF,表示采用 INPLACE 方式。

LOCK 指定了创建和删除索引的时候添加锁的情况,NONE 表示不添加任何的锁;SHARE 表示添加 S 锁;EXCLUSIVE 表示添加 X 锁;DEFAULT 会根据并发性执行一个锁升级的过程,先判断是否可以使用 NONE 模式,若不能,再判断是否可以使用 SHARED 模式,否则将使用 EXCLUSIVE 模式。

三、联合索引

联合索引是指对表上的多个列进行索引。从本质上来说,联合索引也是一棵B+ 树。那么什么时候会使用到联合索引呢?"WHERE a= xxx and b=xxx" 和 "WHERE a= xxx" 都能使用到联合索引,但是"WHERE b= xxx"则使用不到这个索引,因为叶子节点上的 b 值是无序的,这也是人们常说的 —— 最左前缀匹配。除此之外,因为联合索引已经对键值进行了排序处理,因此对于索引列的排序操作也能使用到索引。

60209.html

四、覆盖索引

覆盖索引是指从索引中就可以得到查询的记录,而不需要查询聚集索引中的整行记录的所有信息,因此可以减少大量的 IO 操作。比如只查询索引列的信息。

对于统计问题而言,在同时存在辅助索引和聚集索引的情况下,InnoDB 存储引擎会优先使用辅助索引来进行统计,因为辅助索引远小于聚集索引(辅助索引不需要维护整行记录的全部信息)。

60209.html

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

60209.html

五、其他

当访问的数据占整个表中数据的蛮大一部分时(一般是20%左右),即使存在可以使用的辅助索引,优化器仍然会选择通过聚集索引来查找数据,因为顺序读要远大于离散读。这是由当前传统机械硬盘的特性所决定的,即利用顺序读来替换随机读的查找。可以使用关键字 FORCE INDEX 来强制使用某个索引。

Multi-Range Read 优化是 MySQL 5.6 开始支持的一种索引优化方式,目的是为了减少磁盘的随机访问,并且将随机访问转化为较为顺序的数据访问,这对于 IO-bound 类型的 SQL 查询语句可带来性能极大的提升,适用于 range、ref、eq_ref 类型的查询。

Index Condition Pushdown(索引下推) 优化是 MySQL 5.6 开始支持的一种索引优化方式,默认开启,使用 SET optimizer_switch = 'index_condition_pushdown=off'; 可以将其关闭。ICP 优化可以有效的提高查询效率,适用于 range、ref、eq_ref、ref_or_null 类型的查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 5.7 api 中文_mysql5.7怎么解决中文

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

mysql卸载完环境变量还有_MySql完全卸载

这篇文章为转载本博客内容均摘自其他博客,由我整合并且将内容更改的更为详细,方便自己以后观看,也方便各位同学学习,少踩一些坑1.首先我们看一下如何卸载(1)停掉MySql在Windows的服务:开始—> 运行—> services.…

Effective Java学习笔记之第5条 避免创建不必要的对象

第5条 避免创建不必要的对象 一般来说,最好能重用对象而不是在每次需要的时候就创建一个相同功能的对象。 反面例子: String s new String("stringette"); // DONT DO THIS! 对于同时提供了静态工厂方法和构造器都不可变类,通常可…

C_C++变量命名规则

变量命名规则是为了增强代码的可读性和容易维护性。以下为C必须遵守的变量命名规则: 1、 变量名只能是字母(A-Z,a-z)和数字(0-9)或者下划线(_)组成。 2、 第一个字母必须是字母或者下…

pycharm怎么编写python代码_如何设置PyCharm中的Python代码模版(推荐)

在MacOs运行的PyCharm中,执行python文件,如果不指定python文件字符编码会报错:SyntaxError: Non-ASCII character \xe6 in file /Users/yuchao/PycharmProjects/oldboy_python/python_lesson/模块与包/spam.py on line 6,but no encoding dec…

转载——开阔自己的视野,勇敢的接触新知识

在我们公司有buddy制度。每个新员工都会被分配给一个有经验的员工。老员工会在新员工6个月的试用期内给予各种各样的帮助。前几天我被分配到一个新buddy。在和他一起聊天的过程中,明显感觉到他有一些忧虑。“我以前主要做的是c,没做过java,怎…

select与pselect的信号屏蔽

pselect() 函数的原型是:int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask); 它和 select() 函数基本相同,区别在于两个不同的参数&#xff…

vb访问mysql容易死机_VB访问MySQL

最近研究的东西中, 有一部分涉及到用VB访问MySQL数据库, 今天研究了一下小有收获, 共享出来供大家参考首先下载MySQL 的 ODBC 驱动, 我下载的是 MySQL ODBC 3.51 withoutinstaller 版, 下载后是一zip包, 随便解压到哪, 然后运行 cmd, 定位路径到解压的目录, 然后运行 install.b…

cookie注入讲解

我们首先还是来看看中网景论坛的最新版本"(CNKBBS2007)中网景论坛2007v5.0 "官方下载地址" http://www.cnetking.com/websys2.asp?id26"发布时间是2007-06-06,打开系统的源代码后,在"user_RxMsg_detail.asp"文件中,有如下代码:<!--#include …

sigprocmask 阻塞进程

本系列文章由muge0913编写&#xff0c;转载请注明出处&#xff1a;http://blog.csdn.net/muge0913/article/details/7334771 1、有时候不希望在接到信号时就立即停止当前执行&#xff0c;去处理信号&#xff0c;同时也不希望忽略该信号&#xff0c;而是延时一段时间去调用信号处…

python ftp 设置代理_用Python搭建一个简单的代理池

def get_user_agent():随机获取一个用户代理user_agents["Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET …

C++变量命名规则

浅谈C变量命名规则 不知道别的公司如何&#xff0c;反正我现在的公司对变量命名并没有一定的规范&#xff0c;唯一要求就是能简单易懂&#xff0c;但是&#xff0c;我想&#xff0c;这个多个程序员&#xff0c;大概每个人都有自己习惯的一套 命名规则吧&#xff0c;不过&#…

JavaScript中奇妙的replace

1、发现问题&#xff1a; 今天在读require.js源代码时&#xff0c;不经意读到这么一段代码&#xff1a; 1 //If no name, and callback is a function, then figure out if it a2 //CommonJS thing with dependencies.3 if (!deps && isFunction(callback)) {4 dep…

python3 x和python2 x区别_Python知识:Python 3.x和2.x版本的使用区别

使用Python时都需要安装相应的版本&#xff0c;不同的版本适用性也不一样。今天从除法算子、打印功能、Unicode、Xrange、错误处理、未来模块方面看看Python2.x和Python3.x之间的区别。除法算子在移植代码或在python2.x中执行python3.x代码时&#xff0c;要注意整数除法的更改&…

select EINTR

实验环境&#xff1a;ubuntuKylin 13.10 在程序里同时有select和定时器&#xff0c; select 会被定时器产生的EINTR中断 在定时器的设置中增加了SA_RESTART和sigprocmask&#xff0c;发现都不管用 只能自己判断EINTR来重启select了。 在select被EINTR中断时&#xff0c;我输…

移除首页-重回首页

之前发布了一篇文章《订餐系统之获取淘宝外卖订单》&#xff0c;因为是关于淘宝外卖的&#xff0c;所以文中出现这个词时&#xff0c;都加了链接&#xff0c;还设置了 target_blank,就是为了让看的人方便点击&#xff0c;查看。后来&#xff0c;博客园说这个文章中含有推广链接…

sap客户信贷_信贷控制,FD32的销售值不会变化,只有应收总额的变化

请去检查 行项目类型的设定.里面有个栏位 Credit active , 我基本可以确定这里没有勾上才会出现你的问题.ID: Item with active credit function / relevant for creditSpecifies whether the credit management functions (credit checks and update statistics) for order, d…

Scrum之 Sprint计划会议

在sprint第一天召开sprint计划会议&#xff0c;这个会议分为两部分&#xff0c;计划会议1由PO、SM和Team参加&#xff0c;主要是从产品backlog中挑选出需要放到当前sprint下的既定产品backlog&#xff0c;然后由SM、Team参加计划会议2&#xff0c;把既定产品backlog的故事拆分成…

树莓派dht11 python_树莓派使用DHT11温湿度传感器

使用wiringpi编写C程序&#xff1a;如下程序借鉴了网上一老外的程序&#xff0c;忘了原帖地址在哪。#include #include #include #include #define MAX_TIME 85#define DHT11PIN 7#define ATTEMPTS 5 //retry 5 times when no responseint dht11_val[5]{0,0,0,…