mysql B+tree
- 什么是索引?
索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。
id和磁盘地址的映射。

关系型数据库存在磁盘当中。
- 为什要用索引?
索引能极大减少存储引擎需要扫描的数据量。
索引可以把随机IO变成顺序IO。
索引可以帮助我们在进行分组、排序等操作时,避免使用临时表。
二叉查找树,Binary Search Tree。使用二分查找法,可以提高查找效率,但数据可能不均匀,极限时和全表扫描一样。

平衡二叉树:balanced binary search tree 相对平衡术(二路)

二叉树插入过程网址:www.cs.usfca.edu
一个节点的子节点高度差不超过1.
存在问题:

多路平衡查找树,B -tree,(B树)绝对平衡树

m路的平衡查找树,关键字最多是m-1个,解决了二叉树的问题。关系型数据库,B-树作为索引最常见的一种数据结构,或者用变种。mysql用的B+树。
索引不宜建多,会影响新增和删除。因为索引结构会调整,为了维持绝对平衡,特别耗时。
加强版多路平衡查找树-B+树:(没有数据区)

1.B+节点关键字搜索采用闭合区间。
2.B+非叶节点不保存数据相关信息,只保存关键字和子节点的引用。
3.B+关键字对应的数据保存在叶子节点中。
4.B+叶子结点是按顺序排列的,并且向临界点具有顺序引用的关系。
为什么选用B+tree:
B+树是B-树的变种多路平衡查找树,他拥有B-树的优势。
B+树扫库和扫表能力更强,尤其是扫表。
B+树的磁盘读写能力更强。(因为没有数据区,节约了磁盘空间,可以存储更多的关键字,路数更多)
B+树排序能力更强。(本身就有顺序)
B+树的查询效率更加稳定。(B+必须找到叶子结点,B-树查询效率不稳定,因为深度不一定。so仁者见仁,智者见智)
Mysql B+Tree索引体现形式
Mysql B+Tree索引体现形式 -Myisam

index文件保存索引,最末叶子结点保存指向每条记录的磁盘地址,data文件保存所有的数据。

Mysql B+Tree索引体现形式 -InnoDB

innodb只有主键是聚集索引,其他都是非聚集索引

设计初衷,只有主键重要。
InnoDB vs Myisam

列的离散型 count(distinct col):count(col)
如下离散型最好的列是name:

离散型越高,选择性越好。
最左匹配原则
对索引中关键字进行计算(对比),一定是从左往右依次进行,且不可跳过

like %abc%用不到索引,因为离散型太差 ,还不如做全表扫描。
联合索引
单列索引:节点中关键字【name】
联合索引:节点中关键字【name,phoneNum】
结论:
单列索引是特殊的联合索引
联合索引列选择原则
1.经常用的列优先【最左匹配原则】
2.选择性(离散度)高的列优先【离散度高原则】
3.宽度小的列优先【最小空间原则】
哈哈
经排查发现最常用的SQL语句:处理不优秀

最左匹配原则,建一个联合索引就够了。
覆盖索引
如果查询列可通过索引节点中的关键字直接返回,则该索引称为覆盖索引。

一条sql只会选择一条索引。
结论:
索引列的长度能少则少。
索引不一定越多越好,越全越好,一定是建合适的。
匹配列前缀可用到索引 like 999%,like %999%、like %999用不到索引;
where 条件中 not in 和 <>、!= 操作无法使用索引;
匹配范围值,order by ,group by 也可以用到索引;
多用指定列查询,只返回自己想到的数据列,少用select *;
联合索引中如果不是按照索引最左开始查找,无法使用索引;
联合索引中精确匹配最左前列并范围匹配另外一个列可以用到索引;
联合索引中如果查询有某个列的范围查询,则其右边的所有列都无法使用索引;
有些 where 条件会导致索引无效:
1.where 子句的查询条件里有!=,MySQL 将无法使用索引。
2.where 子句使用了 Mysql 函数的时候,索引将无效,比如:select * from tb
where left(name, 4) = 'xxx'
3.使用 LIKE 迕行搜索匹配的时候,返样索引是有效的:select * from tbl1 where name like 'xxx%',而 like '%xxx%' 时索引无效
4.不匹配的数据类型 char 搜索的时候 where name=你好 应该用 where name='你好' 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
5.在Where子句中使用IS NULL或者IS NOT NULL。
6.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
mysql B+tree的更多相关文章
- PHP+MySQL+Easyui tree菜单从后台加载json数据(一)
实现功能:从数据库加载出所有的数据库名,相应的数据库加载对应的数据库表名 原理:(首先看一下参考手册的内容) 异步加载Tree tree 支持内置的异步加载模式,用户创建一个空的tree,然后定义一个 ...
- Mysql B+Tree原理
B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的.在讲B ...
- mysql B+Tree索引
原文地址:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 数据结构及算法基础 索引的本质 MySQL官方对索引的定义为:索 ...
- mysql 函数tree状
// 子节点的查询 CREATE DEFINER = `root`@`%` FUNCTION `getDeptChildList`(rootId BIGINT) RETURNS longtext DE ...
- 深入理解Mysql索引的底层数据结构 B+ Tree (2)
sql查询 explain的详细用法 操作时间:寻道时间+旋转时间 引入索引:采用二叉树结构 把第二列做为索引生成二叉树结构,此时查询89 只做了两次io操作 但是mysql 为什么不用二叉树作为底层 ...
- Ubuntu 12.04 安装MySQL
本文地址:http://www.cnblogs.com/yhLinux/p/4012689.html 本文适合新手入门. 本文是对 Ubuntu 12.04 环境下安装 MySQL 的记录,通过这两天 ...
- MySQL 系列(五) 多实例、高可用生产环境实战
MySQL 系列(五) 多实例.高可用生产环境实战 第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 史上最屌.你不知道的数据库操作 第三 ...
- linux 下mysql的启动 、调试、排错
Linux 下 MySQL 启动与关闭 说明 一.启动 1.1 MySQL 进程 可以用ps 命令查看进程: [root@rac2 ~]# ps -ef|grep mysql root 21 ...
- 第 8 章 MySQL 数据库 Query 的优化
前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 Query 语句的优化进行相应的分析. ...
随机推荐
- 跟随我在oracle学习php(2)
在制作网页之前,先看一些常用标签的具体用法,上次我给出了常用标签表格,我们来一个一个看一看. 首先是<a>,他的第一个用法就是超链接,格式为<a href=”你想要跳转到的网页地址” ...
- httpd 2.4连接php-fpm
php-fpm参数修改 默认php-fpm监听在127.0.0.1接口上,修改listen = 192.168.99.150:9000,可以监听在指定网卡上. 默认php-fpm仅允许127.0.0. ...
- SQL-41 构造触发器
题目描述 构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中.CREATE TABLE employees_test(ID IN ...
- 《JavaScript Dom 编程艺术》读书笔记-第7章
动态创建标记~内容包括: 1. 传统技术:document.write 和innerHTML 2. 深入剖析DOM方法:createElemen.createTextNode.appendChild和 ...
- angular2升级到angular4历程
Angular 4 在昨天(2017-03-24)正式发布了,我的系列教程也得更新一下.步骤略繁琐,不用 cli 的项目反倒更简单一些,但是 cli 平时给我们的便利还是很多的,升级最多半年一次而已. ...
- <? extends T> <? super T>
拿前者来说,这其实就是一个指定的泛型,不过这个泛型可以是T及T的任何子类, 如果一个set方法,是把一个泛型对象T赋值给一个泛型T属性,现在这个T变成了<? extends T>,那么se ...
- 自动化测试-6.selenium的css定位
前言 大部分人在使用selenium定位元素时,用的是xpath定位,因为xpath基本能解决定位的需求.css定位往往被忽略掉了,其实css定位也有它的价值,css定位更快,语法更简洁.这一篇css ...
- jQuery-1.样式篇---属性与样式
jQuery的属性与样式之.attr()与.removeAttr() 每个元素都有一个或者多个特性,这些特性的用途就是给出相应元素或者其内容的附加信息.如:在img元素中,src就是元素的特性,用来标 ...
- mission 01
A.自己目前在专业能力上的短板,及打算如何弥补. answer:由于在课本中所学的知识是死板的,加上不知如何课外提高自己在专业上的实践应用能力,所以我认为我在专业能力上的短板是缺乏将所掌握的知识应用到 ...
- #20175120彭宇辰 java第五周学习总结
第六章 接口与实现 教材学习内容总结 接口-接口声名interace -接口体1.只有常量声明和抽象方法2.所有常量和方法的访问权限都为public3.常量都为static常量4.可省略pulic\s ...