mysql B+tree

news/2024/7/8 7:27:06

 

  •  什么是索引?

索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。

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的原因)

转载于:https://www.cnblogs.com/jyzyz/p/10449882.html


http://www.niftyadmin.cn/n/4594188.html

相关文章

写给电子工程师的,非常值得一看

今天带着大家了解下未来嵌入式大致发展方向&#xff0c;以及的对嵌入式入门学习的一个规划&#xff01;&#xff01;&#xff01;&#xff01; 嵌入式应用领域如下图所示&#xff1a;当我们在学习嵌入式时&#xff0c;我们首先需要了解嵌入式应用领域&#xff0c;且我们以后向往…

ansible基础-playbook剧本的使用

ansible基础-playbook剧本的使用 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 一.YAML概述 1>.YAML的诞生 YAML是一个可读性高&#xff0c;用来表达数据序列的格式。  YAML参考了其他多种语言&#xff0c…

c语言的七大查找算法,非常值得学习

今天带着大家学习下&#xff0c;C语言七大查找算法!!!!!!!!!! 这里我们首先看下算法的概念&#xff1a;算法&#xff08;Algorithm&#xff09;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制…

hdoj3038(带权并查集)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid3038 题意&#xff1a;对于给定的a1..an&#xff0c;通过询问下标x..y&#xff0c;给出a[x]...a[y]&#xff0c;但给出的值可能是错的&#xff0c;需要判断&#xff0c;因为题目说的是整数&#xff0c;也可能是…

飞思卡尔MC9S12X Flash驱动

今天带着大家学习下飞思卡尔MC9S12 Flash驱动 在现今的经济社会&#xff0c;比拼的“快”不仅仅是速度快&#xff0c;更是效率高。身处社会分工细致的今天&#xff0c;让自己更快效率更高是有方法的。 每一家MCU产商都会提供他们生产的MCU型号的datasheet,Reference Manual等…

基于Centos 7构建一个yum源

系统:Linux Centos 7YUM源&#xff1a;网易需联网 说明 /etc/yum.conf中表示&#xff0c;源可以写入/etc/yum.conf中&#xff08;条目&#xff09;或是以后缀为.repo的文件形式单独的放入/etc/yum.repos.d这个目录中 yum.conf: 本文章采用的是文件形式&#xff0c;存放在/etc/y…

飞思卡尔MC9S12X CAN驱动

今天带着大家学习下MC9S12XS CAN驱动模块开发。首先先了解下什么CAN&#xff0c;用途。 CAN总线的概念&#xff1a;CAN是控制器局域网络&#xff08;Controller Area Network&#xff09;的简称&#xff0c;是由研发和生产汽车电子产品著称的德国BOSCH公司开发&…

“经验”重要吗?

许多人对我说&#xff1a;“加藤先生&#xff0c;您是一位专家&#xff0c;因为您拥有在世界上那么多国家的阅历和经验……”每当我听到这样的话&#xff0c;我总会回答&#xff1a;“经验不能代表什么。在富士通&#xff08;我之前工作的公司&#xff09;&#xff0c;数以百计…