什么是索引

mysql的数据是持久化到磁盘的,写SQL查询数据也就是在磁盘的某个位置查找符合条件的数据,但是磁盘IO比起内存效率是极慢的,特别是数据量大的时候,这时候就需要引入索引来提高查询效率;

在我看来索引是为了提高查询效率而诞生的一种手段,借助合适的数据结构将数据有规律的沉淀下来,使得查询的时候能尽量减少磁盘IO快速返回;也可以类比书本或字典的目录,能快速定位数据

索引的类型

mysql的索引可分为:主键索引(唯一且非空)、唯一索引(可为空)、全文索引、联合索引以及普通索引(普通列做索引)

索引的优点

  • 减少磁盘IO次数,提升查询效率
  • 将随机IO变成顺序IO

索引的数据结构

众所周知,mysql innerDb和myIsam引擎索引的数据结构都是B+树,使用B+树作为索引的数据结构主要是因为相同的磁盘IO次数下B+树的查询表现远高于其他数据结构,并且B+树的叶子节点是收尾相连的,这样更便于顺序查询;下面依次简单介绍下其他数据结构作为索引数据结构的优缺点

HASH表

首先介绍下hash算法,通过hash算法将索引列分散到hash表上去,由于hash是基于内存的,所以效率还是不错的,但是正是因为基于内存导致了其不适合大数据量的计算,浪费内存空间;并且hash算法查询时只有等值计算才会体现他的高效,对于范围查询其还是无能为力;需要注意的是,mysql的memory存储引擎索引的数据结构就是hash表

二叉树

二叉树插入数据时很容易造成树的倾斜,每次插入对应一次IO,效率低下

AVL树

平衡树在二叉树的基础上新增了左旋和右旋,但是需要确保最短子树和最长字树的高度差不大于1;当插入数据量过大时会进行很多次的旋转,导致插入速度极低;查询效率高

红黑树

红黑树相当于是AVL树的一个升级,它通过变色的操作降低了左右旋转的次数,中和了AVL树插入速度慢的缺点;红黑树的要求如下:

  • 任意路径上不能有两个红色节点连续出现
  • 最长子树不超过最短子树的两倍即可
  • 更节点到各子节点的链路中黑色节点的数量一致

    虽说红黑树提高了插入效率,但是受限于一个节点最多只有两个子节点的影响,当数据量大时还是会出现树深度过深从而增加IO次数的问题

B树

B树的每个节点可以有N个节点,这就解决了上面说的树深度的问题,B树的每个节点(包括非叶子节点)不仅会存储页码而且还会存储对应的数据;下面我们分析下B树的查询能力:

mysql是通过磁盘预读来查询数据的,每次可以读取页的整数倍,一页等于4KB,inderDb默认读的是16KB,我们假设一行数据占用1KB的内存并且忽略节点上页面占用的空间,这样三次磁盘IO的话B树能读出161616=4096条数据,效率并不是很理想,并不能满足日常工作中的实际需求

B+树

B+树与B树的区别在于,B+树的非叶子节点不存储数据,数据均存储在叶子节点,且叶子节点收尾相连;我们同样来计算下B+树的查询能力:

由于非叶子节点不存储数据只存储页码,假设一个页码占用10个字节的内存,这样一个磁盘块可以容纳的数据为:(16 * 1000)/10=1600条,假设同样进行三次IO,那么能支持查询的数据量是:1600 * 1600 * 16=40960000,轻松达到千万级别;

浅谈MYSQL的索引以及它的数据结构的更多相关文章

  1. 浅谈B+树索引的分裂优化(转)

    http://www.tamabc.com/article/85038.html 从MySQL Bug#67718浅谈B+树索引的分裂优化   原文链接:http://hedengcheng.com/ ...

  2. 浅谈mysql主从复制的高可用解决方案

    1.熟悉几个组件(部分摘自网络)1.1.drbd     —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...

  3. 浅谈mysql innodb缓存策略

    浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...

  4. 浅谈mysql配置优化和sql语句优化【转】

    做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...

  5. 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载

    浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...

  6. 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

    浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景   Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...

  7. 浅谈MySQL索引背后的数据结构及算法

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  8. 浅谈MySQL索引背后的数据结构及算法(转载)

    转自:http://blogread.cn/it/article/4088?f=wb1 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储 ...

  9. 浅谈MySQL索引背后的数据结构及算法【转】

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

随机推荐

  1. ARC122D XOR Game(博弈论?字典树,贪心)

    题面 ARC122D XOR Game 黑板上有 2 N 2N 2N 个数,第 i i i 个数为 A i A_i Ai​. O I D \rm OID OID(OneInDark) 和 H I D ...

  2. [HDU3976]Electric resistance(电阻)(信竞&物竞)(高斯消元)

    题面 Problem Description Now give you a circuit who has n nodes (marked from 1 to n) , please tell abc ...

  3. JS/java实现QQ空间自动点赞

    使用方法: 1:进入QQ空间 2:复制下面代码 3:按F12或右键审查元素 进入控制台 也就是console 4:粘贴  回车键  喝口水 5:如果嫌慢的话可以 修改这段代码. window.setI ...

  4. openstack中Nova组件简解

    一.Nova组件概述 计算节点通过Nova Computer进行虚拟机创建,通过libvirt调用kvm创建虚拟机,nova之间通信通过rabbitMQ队列进行通信. Nova位于Openstack架 ...

  5. yum install lrzsz

    yum install lrzsz rz:从本地上传文件至服务器 sz filename:从服务器下载文件至本地

  6. python3实现:进程遇Error定时重启

    import os import time # 停止HFish def stopHFish(): # while True: try: # 找到HFish进程号 HFish_id = int(os.p ...

  7. WSL 2简介

    Windows Subsystem for Linux(WSL)适用于 Linux 的 Windows 子系统是微软在Windows 10上提供的一项供用户快速运行Linux命令和工具的功能.相比前一 ...

  8. 《Win10——常用快捷键》

    Win10--常用快捷键       Ctrl+C:复制 Ctrl+V:粘贴 Ctrl+A:全选 Ctrl+X:剪切 Ctrl+D:删除 Ctrl+Z:撤销 Ctrl+Y:反撤销 Ctrl+Shift ...

  9. 大家都在用MySQL count(*)统计总数,到底有什么问题?

    在日常开发工作中,我经常会遇到需要统计总数的场景,比如:统计订单总数.统计用户总数等.一般我们会使用MySQL 的count函数进行统计,但是随着数据量逐渐增大,统计耗时也越来越长,最后竟然出现慢查询 ...

  10. GitHub desktop常见问题及解决办法

    1.There are unresolved conflicts in the working directory. 问题出现:A台电脑push代码后,可能新建了分支,然后B电脑打开GitHub de ...