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 语句的优化进行相应的分析. ...
随机推荐
- JQ 关于each() 箭头函数报错的问题
- Linux SSH登录很慢的解决方法
一:UseDNS OpenSSH在用户登录的时候会验证IP,它根据用户的IP使用反向DNS找到主机名,再使用DNS找到IP地址,最后匹配一下登录的IP是否合法.如果客户机的IP没有域名,或者DNS服务 ...
- ECharts访问后台,JSON格式返回数据实例
完成图 一.页面代码 <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...
- C#设置随机整数
JQuery var x = 5;//最大值var y = 1;//最小值var rand = parseInt(Math.random() * (x - y + 1) + y); Mvc控制器 Ra ...
- 【Java集合系列】目录
2017-07-29 13:49:40 一.Collection的全局继承关系 二.系列文章 [Java集合系列一]ArrayList解析 备注: 1.ArrayList本质上就是一个数组,所有对外提 ...
- red hat防火墙的开启与关闭及状态查看方法
Redhat使用了SELinux来增强安全, 首先怎么查看防火墙的状态呢? a.可以通过如下命令查看iptables防火墙状态: chkconfig --list iptables b. selinu ...
- 何在mysql查找效率慢的SQL语句?
如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启 ...
- FCC JS基础算法题(3):Find the Longest Word in a String (找出最长单词)
题目描述: 在句子中找出最长的单词,并返回它的长度.函数的返回值应该是一个数字. 基本思路,将字符串转换成数组,然后得出数组中单个元素的长度,对长度进行排序,返回最大的一个 代码: function ...
- python用schedule模块实现定时任务
1 import schedule 2 import time 3 4 def test(): 5 print("I'm working...") 6 def test2(): 7 ...
- h5 网络断网时,返回上一个页面 demo (与检测网络代码相结合,更直观看到结果)
页面一: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8& ...