Mysql索引数据结构

  • Mysql索引数据结构
    • 索引
    • 1.二叉树的优缺点
      • 优点
      • 缺点
    • 2.红黑树的优缺点
      • 优点
      • 缺点
      • 如何去优化?
    • 3.B-Tree
    • 4.B+Tree
      • B+Tree特点
    • 底层为什么查找这么快的原因

1.慢Sql查询:执行时间几秒, 几十秒,怎么去优化????

2.索引,本来需要执行几秒几十秒的查询,加上合适的索引可能几十毫秒就结束了

3.为什么?

4.底层怎么实现的?

索引

索引是帮助MySQL高效获取数据的排好序的数据结构

索引数据结构:

二叉树
红黑树
Hash表
B-Tree

MySQL底层为什么会选择像B-Tree,B+Tree这样的数据结构来存储我们的索引?

MySQL早期版本选择二叉树,红黑树来存储我们的索引,只不过这些数据结构还存在一些小问题。

1.二叉树的优缺点

优点

COL2作为我们的索引,原来需要做6次I/O,现在只需要做3次I/O,性能提升了一倍

缺点

二叉树,插入大的元素总是放在我们的右下角,插小的元素放左下角,
把Col1当做索引时(当列数据是自增的),和全表扫描在性能上边没有太大的差别,而且还额外增加了索引的存储空间

2.红黑树的优缺点

HashMap的底层实现就用到了红黑树。

优点

红黑树本质上也是二叉树,但是和二叉树不一样,他是二叉平衡树
它有自我平衡功能,如果一个树,一边比另外一边大的太多,它能够自动平衡,让一边与另外一边相差不要太多

比单纯的二叉树查找次数缩短了一半,磁盘的I/O次数减少了一半

缺点

为什么MySQL最终没有选择红黑树呢?

红黑树当数据存储比较大的时候,由于它的树的高度不可控,导致在树的结构遍历元素的时候,如果到了叶子节点,那么需要查找很多次磁盘,性能就会非常低。这是MySQL没有选择红黑树的最主要的原因。

如何去优化?

如果是树进行存储的话,树的高度越小,查找的次数越少,性能效率就会有很大的提升

多路查找

分配索引节点存储的空间的时候,一次给它分配的大一点点,分配多一点点,一个节点可以放更多的索引元素,索引和索引之间还留一点空间做一些分叉,没一个分叉又可以放一点节点。同样存储500万条数据数的高度会更小(横向增多了)

这个优化的结构就是B-Tree

3.B-Tree


MySQL最终并没有用B-Tree,是在B-Tree上对整个数据结构做了一点点优化得到一个B+Tree(B-Tree变种)

4.B+Tree

B+Tree是一个什么的结构呢?
它会把整张表的所有的索引元素都放到叶子节点,叶子节点有整张表的所有的索引元素,非叶子节点是从每一个叶子索引节点拿的第一个元素,做冗余的索引,来组织这一颗B+Tree

我们期望存储相同的元素,树的高度越小越好,MySQL底层的这个B+Tree存储索引的结构,它的容量大概是多少?
每一个节点默认设置16KB,整个树可以放两千多万条索引元素

B+Tree特点

有序性

元素从磁盘读到内存里去,相当于做磁盘I/O,磁盘I/O性能很低
内存中的折半查找是相当快的,与一个磁盘I/O的时间相比可以忽略不计,B+Tree非叶子结点,直接在MySQL初始化的时候,都已经加载到内存中去了,真正查找一个元素的时候,直接在内存中快速定位,也就是说整个过程中我们只需要1次的磁盘I/O,效率相当高。

哪怕上千万行的表记录
不是合理的走索引的话,这条SQL语句要执行几十秒(几千万行全部扫描需要几十秒)
合理的走索引性能提升几个数量级(可能扫描一条记录就搞定了,怎么扫的,前边都内存里快速匹配,然后通过树的结构快速定位到某个节点,磁盘上加载1次I/O就结束了,性能相当高)几毫秒,几十毫秒就查找到我们的元素了。

底层为什么查找这么快的原因

借助B+Tree结构的巧妙的设计

千万级数据表如何索引快速查找相关推荐

  1. mysql千万级数据索引查询_mysql千万级数据量根据索引优化查询速度

    (一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经 ...

  2. mysql千万级数据量根据索引优化查询速度

    (一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经 ...

  3. 千万级别数据表创建索引

    业务背景 最近一个开发维护的公众号管理系统用户表(user_info)数据已经达到15,000k了,而此时有一个业务场景需要将公众号的用户信息重新同步一次,且后台原有过针对单个公众号的用户同步,但是已 ...

  4. mysql explain 为空_车祸现场!我的MySQL千万级数据表选错索引了!

    最近在线上环境遇到了一次SQL慢查询引发的数据库故障,影响线上业务.经过排查后,确定原因是:SQL在执行时,MySQL优化器选择了错误的索引(不应该说是"错误",而是选择了实际执行 ...

  5. 千万级大表如何更快速的创建索引_分享一份生产环境mysql数据库大表归档方案,值得收藏...

    概述 分享下最近做的一个mysql大表归档方案,仅供参考. 整体思路 一.明确哪些大表需做归档 1.数据库表概要信息统计 SELECTt1.table_schema,t1.table_name,`EN ...

  6. mysql千万级数据怎么删除,MySQL 快速删除大量数据(千万级别)的几种实践方案详解...

    这篇文章主要介绍了MySQL 快速删除大量数据(千万级别)的几种实践方案详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 笔者 ...

  7. mysql 亿级表count_码云社 | 砺锋科技-MySQL的count(*)的优化,获取千万级数据表的总行数 - 用代码改变世界...

    专注于Java领域优质技术号,欢迎关注 作者:李长念 一.前言 这个问题是今天朋友提出来的,关于查询一个1200w的数据表的总行数,用count(*)的速度一直提不上去.找了很多优化方案,最后另辟蹊径 ...

  8. MySQL 千万级数据表 partition 实战应用

    目前系统的 Stat 表以每天 20W 条的数据量增加,尽管已经把超过3个月的数据 dump 到其他地方,但表中仍然有接近 2KW 条数据,容量接近 2GB. Stat 表已经加上索引,直接 sele ...

  9. mysql的count(*)的优化,获取千万级数据表的总行数

    一.前言 这个问题是今天朋友提出来的,关于查询一个1200w的数据表的总行数,用count(*)的速度一直提不上去.找了很多优化方案,最后另辟蹊径,选择了用explain来获取总行数. 二.关于cou ...

  10. MySQL 的 count(*) 的优化,获取千万级数据表的总行数

    一.前言 这个问题是今天朋友提出来的,关于查询一个1200w的数据表的总行数,用count(*)的速度一直提不上去.找了很多优化方案,最后另辟蹊径,选择了用explain来获取总行数. 二.关于cou ...

最新文章

  1. windows平台下vlc编译之六:vlc-0.9.8a的编译
  2. redis中的crc16算法
  3. ubuntu9.10配置编译xawtv-3.95
  4. java 08_Java08-构造方法
  5. Cascading——针对Hadoop MapReduce的数据处理API
  6. 代理模式【介绍、静态代理、动态代理、入门、应用】
  7. 面试官:你对MySQL高性能优化有什么规范建议?
  8. Asp.Net_文件操作基类
  9. leetcode5. 最长回文子串(动态规划)
  10. 【Vue】路由Router传参的两种方式(详解)
  11. Java生产环境下性能监控与调优详解 第3章 基于JVisualVM的可视化监控
  12. 外星人做系统logo_深圳福田外星人笔记本电脑维修服网点
  13. 数据中心 服务器管理规范,互联网技术详解 | 新时代数据中心管理标准Redfish
  14. 记录自己的第一次拆机(宏碁E5-572G)
  15. 全网最全C盘清理攻略
  16. 知乎周源微信_每周源代码41-搜索代码,共享代码和阅读代码(和注释)
  17. C++学习第六天——数组
  18. 帆软(FineReport)报表学习——一个简单的报表
  19. 你必须知道alexa排名的重要性
  20. 【HBase】HBase 行健设计

热门文章

  1. MySql分页查询limit
  2. 【Dart语言第6篇】Dart类
  3. 超全面总结Vue面试知识点
  4. 浅谈文字编码和Unicode(上)
  5. MapReduce功能实现三---Top N
  6. QAC静态代码测试工具试用介绍
  7. 进击----Helix QAC自动化静态测试
  8. ps计算机设置,不仅要懂PS 浅谈修图电脑配置(基础篇)
  9. 人体动作捕捉技术综述
  10. 基于C51单片机的锂电池容量检测仪电压电流检测 原理图PCB程序设计