•  什么是索引?

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

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. 深入理解vue-router之keep-alive

    keep-alive 简介 keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染. 用法也很简单: ? 1 2 3 4 5 <keep-alive> ...

  2. SQL-61 对于employees表中,给出奇数行的first_name

    题目描述 对于employees表中,给出奇数行的first_nameCREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` ...

  3. Java基础-方法

    方法 Java方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 注意: 在一些其它语言中方法指过程和函数.一个 ...

  4. Jsの数组练习-求一组数中的最大值和最小值,以及所在位置

    要求:求一组数中的最大值和最小值,以及所在位置 代码实现: <!DOCTYPE html> <html lang="en"> <head> &l ...

  5. oracle 汉字转拼音

    oracle汉字转拼音(获得全拼/拼音首字母/拼音截取等) 效果如下: Oracle 字符集 GBK 没有问题 , UTF -8 需要修改一下 Sql代码 --oracle汉字转拼音 PACKAGE ...

  6. C语言gcc处理过程

    gcc编译C文件一共四步,预处理(Preprocess),编译(Compilation),汇编(Assembly)和链接(Linking) 1. 预处理(Preprocess) 预处理是预处理中会展开 ...

  7. indexOf()定义和用法

    indexOf()定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法 stringObject.indexOf(searchvalue,fromindex) ...

  8. cocos2dx开发之util类&方法——字符串替换

    /*将originStr字符串中的searchStr替换成replaceStr*/ std::string str_replace(std::string originStr,std::string ...

  9. machine learning data sets

    http://archive.ics.uci.edu/ml/datasets.html 例如 3 分类 鸢尾花 数据集: http://archive.ics.uci.edu/ml/datasets/ ...

  10. node.js创建简单服务测试请求数据

    工具:安装node: 1,创建文件夹 server, 2 ,在server文件夹下分别创建server.js 和 package.json 文件 3,server.js 代码: var express ...