在日常工作中,我们经常会用到mysql的索引。使用索引的目的基本上就是为了在大量的数据中快速找出某个列中一个特定值的行,简单说就是提高查询效率。

使用索引的优点:

可以快速检索,减少I/O次数,加快检索速度;

根据索引分组和排序,可以加快分组和排序。

当然索引也有缺点:

索引是数据结构,索引是存储在表中的,创建索引和维护索引需要时间,而且数据量越大时间越长

创建索引需要占据磁盘的空间,如果有大量的索引,可能比数据文件更快达到最大文件尺寸

当对表中的数据进行增加,修改,删除的时候,索引也要同时进行维护,降低了数据的维护速度

索引的分类:

常见的索引类型有:主键索引、唯一索引、普通索引、全文索引、组合索引

普通索引(Normal):基本索引类型,允许在定义索引的列里插入空值或重复值。

唯一索引(Unique):索引列值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

主键索引是一种特殊的唯一索引,不允许有空值

单列索引:只包含一个列的索引,一个表中可以有多个

组合索引:包含多个列的索引,查询条件包含这些列的最左边的字段的时候,索引就会被引用,遵循最左缀原则

全文索引:用大文本对象的列构建的索引

索引的设计原则:

首先索引并不是不是越多越好,而且对于常更新的表索引越少越好。

数据量小的表最好不要建立索引

不同的值比较多的列才需要建立索引

某种数据本身具备唯一性的时候,建立唯一性索引,可以保证定义的列的数据完整性,以提高查询熟度

频繁进行排序或分组的列(group by或者是order by)可以建立索引,提高搜索速度

经常用于查询条件的字段应该建立索引

索引需要占用磁盘空间,因此在创建索引时要考虑到磁盘空间是否足够。而且创建索引时需要对表加锁,因此实际操作中需要在业务空闲期间进行。

索引的实现原理:

Mysql本身支持多种存储引擎,所以可以支持多种索引。如BTree索引,哈希索引,全文索引等。mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。

B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值。比如:

对该二叉树的节点进行查找发现深度为1的节点的查找次数为1,深度为2的查找次数为2,深度为n的节点的查找次数为n,因此其平均查找次数为 (1+2+2+3+3+3) / 6 = 2.3次。但是显然对于这种:

对这种二叉树而言查询效率就要低很多,特别是查找最底层的叶子节点的时候。所以要想要这个二叉树的查询效率高,就得需要这棵二叉树尽量是平衡的。对于平衡二叉树而言,他不仅满足二叉树的性质,而且还满足任何节点的两个子树的高度最大差为1。比如:

BTree是平衡搜索多叉树,是为磁盘等外存储设备设计的一种平衡查找树。系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。

InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。Innodb默认每页大小为16k。而系统一个磁盘块的存储空间往往没有一页那么大,因此InnoDB每次申请磁盘空间时都会是若干地址连续磁盘块来达到页的大小。InnoDB在把磁盘数据读入到磁盘时会以页为基本单位,在查询数据时如果一个页中的每条数据都能有助于定位数据记录的位置,这将会减少磁盘I/O次数,提高查询效率。

BTree结构的数据可以让系统高效的找到数据所在的磁盘块。B树是一种多路自平衡搜索树,它类似普通的二叉树,但是B树允许每个节点有更多的子节点。有如下特点

所有键值分布在整个树中

任何关键字出现且只出现在一个节点中

搜索有可能在非叶子节点结束

在关键字全集内做一次查找,性能逼近二分查找算法

如下图所示为一个3阶的B-Tree

比如要查找位于磁盘8上的28 。从根节点开始先找到磁盘1,读入内存,通过比较关键字28找到磁盘1的指针p2。在根据p2找到磁盘3,读入内存,再通过比较关键字找到磁盘3上的指针p2.根据p2找到磁盘8读入内存,通过比较找到关键字28.由于根节点常驻内存,整个过程只是进行了2次的磁盘io操作。

B+树是在btree基础上进行的一种优化。区别如下:

B+Tree中的非叶子结点不存储数据,只存储键值;

B+Tree的叶子结点没有指针,所有键值都会出现在叶子结点上,且key存储的键值对应data数据的物理地址

结构图如下:

Mysql默认innodb存储引擎就是使用B+树来实现索引结构的。由于内节点(非叶子节点)不存储data,所以一个节点可以存储更多的内节点,每个节点能索引的范围更大更精确。也就是说使用B+树单次磁盘IO的信息量相比较B树更大,IO效率更高。一般实际应用中,度d是非常大的数字,通常超过100,因此h非常小(通常不超过3,也即索引的B+树层次一般不超过三层,所以查找效率很高)。

mysql 动态索引_MySQL的索引相关推荐

  1. mysql 普通索引和唯一索引_MySQL 普通索引和唯一索引的区别

    该文为< MySQL 实战 45 讲>的学习笔记,感谢查看,如有错误,欢迎指正 一.查询和更新上的区别 这两类索引在查询能力上是没差别的,主要考虑的是对更新性能的影响.建议尽量选择普通索引 ...

  2. mysql最常用的索引_mysql常用索引

    1.索引 在关系数据库中,索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单.索引的作用相当 ...

  3. mysql 创建唯一索引_Mysql普通索引和唯一索引的选择分析

    假设一个用户管理系统,每个人注册都有一个唯一的手机号,而且业务代码已经保证了不会写入两个重复的手机号.如果用户管理系统需要按照手机号查姓名,就会执行类似这样的 SQL 语句: select name ...

  4. mysql为什么要重建索引_MySQL表索引为什么会遭破坏?

    此文章主要向大家描述的是MySQL表索引被破坏的问题的产生缘由,以及针对这一问题我们给出其具体的解决方案,下面的文章就是对其相关内容的具体介绍,希望在你今后的学习中会有所帮助. 下午上班,惊闻我的de ...

  5. mysql 破坏索引_mysql表索引被破坏的问题及解决

    用mysql的用户,经常会遇到这样的问题,检查mysql日志,错误信息为: Table '.\dedecmsv4\dede_archives' is marked as crashed and sho ...

  6. mysql trim 索引_mysql建索引后需要重启数据库修改MySQL的字符集

    windows下的mysql配置文件是my.ini,一般在c:\windows\my.ini或者c:\winnt\my.ini可以直接在这个文件里面加上 W WW.002pc .COM从mysql建索 ...

  7. mysql innerdb 索引_mysql innodb索引原理

    聚集索引(clustered index) innodb存储引擎表是索引组织表,表中数据按照主键顺序存放.其聚集索引就是按照每张表的主键顺序构造一颗B+树,其叶子结点中存放的就是整张表的行记录数据,这 ...

  8. mysql repair 索引_mysql 创建索引、重建索引、查询索引、删除索引 转自:http://www.phpernote.com/mysql/942.html...

    本篇文章主要是对MySQL索引操作方法做了一下总结,包括创建索引.重建索引.查询索引.删除索引的操作.以下所列示例中中 `table_name` 表示数据表名,`index_name` 表示索引名,c ...

  9. mysql简单索引_mysql简单索引

    mysql的索引是在存储引擎实现的,而不是在服务器层,因此不是标准的. b-tree: 大部分的mysql支持b-tree索引,archive知道mysql5.1才支持,而且仅仅是支持单个auto_i ...

最新文章

  1. 对javascript闭包的理解
  2. vs2008界面查看
  3. java死信队列_RabbitMQ 死信队列是什么鬼?
  4. vue项目如何打包扔向服务器 - Hi-Sen - 博客园
  5. Vue项目启动webpack报错Module build failed: Error: No PostCSS Config found in......
  6. 不同协议的数据包如何处理_【项目申报专员】如何处理各种不同的项目申报工作呢...
  7. 我们为什么要学数学?这里给你一个答案。
  8. random number in groovy
  9. mac常用设置(新建、显示隐藏文件、任意位置开启终端等)
  10. 玩微博也好,头条、朋友圈也罢
  11. Java并发编程:进程和线程之由来__进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能...
  12. PHP获取数组中重复数据
  13. matlab如何绘制函数方程,如何使用MatLab来绘制函数曲线方程图像?
  14. 第五章:物理网络层概述
  15. 南航计算机考研是自主命题吗_什么是自主计算?
  16. [Codeforces1148C]Crazy Diamond——构造
  17. 总结与归纳:深度神经网络中的数据融合方法
  18. 烽火ExMobi移动应用平台能源行业初体验
  19. PL\SQL用户指南与参考10.1 转载
  20. UBUNT14.04中红米手机与电脑的连接。

热门文章

  1. AaronYang WCF教程目录
  2. 利用jquery修改elment的自定义组件多选框el-select(修改多选框的颜色)
  3. Linux5观察doc目录并截屏,linux截屏命令
  4. php如果实现日历的制作,教大家制作简单的php日历
  5. 深度学习案例之基于 CNN 的 MNIST 手写数字识别
  6. java public 继承_java继承问题
  7. keyshot环境素材文件_快速学会keyshot基础渲染的步骤
  8. Downloader Middlewares反反爬虫【学习笔记04】
  9. Scrapy 框架【学习笔记01】
  10. python redis 性能测试台_Redis性能测试