•  什么是索引?

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

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的更多相关文章

  1. PHP+MySQL+Easyui tree菜单从后台加载json数据(一)

    实现功能:从数据库加载出所有的数据库名,相应的数据库加载对应的数据库表名 原理:(首先看一下参考手册的内容) 异步加载Tree tree 支持内置的异步加载模式,用户创建一个空的tree,然后定义一个 ...

  2. Mysql B+Tree原理

    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的.在讲B ...

  3. mysql B+Tree索引

    原文地址:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 数据结构及算法基础 索引的本质 MySQL官方对索引的定义为:索 ...

  4. mysql 函数tree状

    // 子节点的查询 CREATE DEFINER = `root`@`%` FUNCTION `getDeptChildList`(rootId BIGINT) RETURNS longtext DE ...

  5. 深入理解Mysql索引的底层数据结构 B+ Tree (2)

    sql查询 explain的详细用法 操作时间:寻道时间+旋转时间 引入索引:采用二叉树结构 把第二列做为索引生成二叉树结构,此时查询89 只做了两次io操作 但是mysql 为什么不用二叉树作为底层 ...

  6. Ubuntu 12.04 安装MySQL

    本文地址:http://www.cnblogs.com/yhLinux/p/4012689.html 本文适合新手入门. 本文是对 Ubuntu 12.04 环境下安装 MySQL 的记录,通过这两天 ...

  7. MySQL 系列(五) 多实例、高可用生产环境实战

    MySQL 系列(五) 多实例.高可用生产环境实战   第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 史上最屌.你不知道的数据库操作 第三 ...

  8. linux 下mysql的启动 、调试、排错

    Linux 下 MySQL 启动与关闭 说明 一.启动 1.1  MySQL 进程 可以用ps 命令查看进程: [root@rac2 ~]# ps -ef|grep mysql root     21 ...

  9. 第 8 章 MySQL 数据库 Query 的优化

      前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 Query 语句的优化进行相应的分析. ...

随机推荐

  1. nginx搭建以及其配置文件

    nginx搭建: 参考link:https://blog.csdn.net/wxyjuly/article/details/79443432 nginx配置文件详解: 参考link:https://w ...

  2. 8.7 C++二进制文件读写操作

    参考:http://www.weixueyuan.net/view/6413.html 总结: 二进制文件的读写稍微麻烦一些,对二进制文件的读写同样需要打开文件和关闭文件,打开和关闭方式与文本文件相同 ...

  3. SQL-42 删除emp_no重复的记录,只保留最小的id对应的记录

    题目描述 删除emp_no重复的记录,只保留最小的id对应的记录.CREATE TABLE IF NOT EXISTS titles_test (id int(11) not null primary ...

  4. 认识jmeter

    1.jmeter是什么:Apache Jmeter是Apache组织开发的基于java的压力测试工具. Jmeter可用于对服务器.网络或对象模拟巨大的负载,来自不同压力类别下测试他们的强度和分析整体 ...

  5. Jmeter压力测试生成聚合报告

    Jmeter压力测试: 压力测试的场景设置分为三种: 单场景:一个请求(如:单个接口的测试) 混合场景:多个请求(如:购物流程的测试) 压测时间,一般场景都是运行10-15分钟,如果是做疲劳测试的话, ...

  6. vim语法

    在任何目录输入命令“vim <文件名>”就可以使用vim编辑文件了. 打开vim后,默认的是命令模式,输入i进入编辑模式,这个时候你可以编辑文件了.在编辑模式下按Esc键回到命令模式,在命 ...

  7. 剑指Offer 57. 二叉树的下一个结点 (二叉树)

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题目地址 https://www.nowcoder.c ...

  8. Erlang-接口技术

    系统的构建一定会设计到简历接口,让他与不同的语言的应用程序之间简历系统的联系.这就叫做erlang的接口技术. 接口技术的三种实现方法: 1.让程序以外部操作系统进行的形式在Erlang虚拟机以外运行 ...

  9. 未能加载或程序集“XXXX,Version=0.0.0.0,Culter=neutral,PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。

    问题描述:在VS中运行一个C#程序,出现错误: 未能加载或程序集“XXXX,Version=0.0.0.0,Culter=neutral,PublicKeyToken=null”或它的某一个依赖项.试 ...

  10. 我的代码-models

    # coding: utf-8 # In[1]: import pandas as pdimport numpy as npfrom sklearn import treefrom sklearn.s ...