mysql索引

今天看了一些关于MySQL相关的东西,来做一些碎碎念,写这些可能只是觉得自己看东西老爱忘23333.

先来看一组MySQL数据,如图我们要查看最后id=11的数据,如果我们不加索引的话会怎样呢?

他会一条一条的比对,直到最后一条,加了索引他就不用一条一条比对了吗?

其实也不是这样理解的。

我们先来看他如何进行一条一条比对,我们数据库中的数据是存储在硬盘中的,这是一种持久化的数据,不同于我们

程序中的数据(程序中的数据是易失的,程序结束就没了,这其实就是我们内存的特性),如果我们需要比对,第一

步要做的是把数据库硬盘中的数据加载进内存,例如比对开始,第一条数据,id=1从硬盘加载进内存,与我们程序中

的sql语句(select id from user where id=11)进行比对,发现id不等于11,于是接着把id=2加载进内存,如此

下去,直到id=11,程序结束。此过程我们可以发现如果我们要查询id=11

要进行11次把数据从硬盘加载进内存的操作

这就是我们常说的磁盘IO操作,磁盘IO操作非常耗费时间的,仅仅这样一个查询就要11次IO操作……

我还有个不成熟的例子,我们大家都有那种一个软件半天才打开的经历吧,这就是一个把硬盘数据加载进内存的过程,

也就是磁盘IO操作,类比于我们现在这个表中的查询,如果要进行11次这样的操作,有点吓人是不是。

那么我们如果可以在插入数据的时候同时维护一棵二叉排序树,这样我们在查找的时候是不是可以节省不少时间?

二叉排序树就是一棵左儿子小于本身,右儿子大于本身的二叉树,不详细说了。这样我们就可以从查找O(n)的

复杂度,降低到O(lgn)。但是又有问题了,如图所示

事实上这样的二叉排序树非常常见,像不像我们的链表?链表相比于数组的坏处就是查找麻烦,这种退化为链表的

二叉排序树已经没有查找的优越性了。由此人们又研究出来AVL排序树,叫法很多,平衡树啊,AVL查找树啊都是这个。

如图

平衡树的确很好,但是还是有问题,平衡树要求叶子节点的高度差不能大于1,这个要求其实过于苛刻,事实上随便一个

操作都能打破这种平衡,平衡树就需要左旋右旋来进行矫正,但是左旋右旋操作也是非常耗费时间的,所以就有了红黑树

红黑树先比较于平衡树,最大的区别就在于他放宽了进行左旋右旋的条件。

但是我们知道MySQL索引底层用的也不是红黑树,其实是B+树,那么B+树又改进了红黑树什么特性呢,红黑树说到底还是

一种二叉树,在我们数据量足够大的情况下,二叉条件下树的深度还是非常大的,避免不了进行很多次磁盘IO,B+树简单

来说就是一种多叉排序树,将深度转换为宽度。

mysql 深胡_Mysql胡说八道相关推荐

  1. mysql 深胡_数据存储之MySQL

    包的导入: @python3import pymysql @python2import MySQLdb 基本应用 import pymysql #建立连接 db = pymysql.connect(h ...

  2. mysql 汉编码 的选_peewee连接mysql汉语言数据编码_mysql

    peewee连接mysql中文数据编码 系统是win7 x64 python 2.7.6的site.py里面编码设定为 utf-8 py文件首行指定 #coding:utf-8 mysql 5.5.3 ...

  3. windows 新建mysql权限设置_Windows下设置MySQL安全权限_mysql

    注意:本文的内容涉及到修改NTFS磁盘权限和设置安全策略,请务必在确认您了解操作可能的后果之后再动手进行任何的修改. 文中提及的权限都是在原有权限上附加的权限. [修改步骤] 1.创建用户 创建一个名 ...

  4. mysql函数大全最小,MySQL函数一览_MySQL函数全部汇总

    前言 MySQL提供了众多功能强大.方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,从而更加灵活地满足不同用户的需求.本文将MySQL的函数分类并汇总,以便以后用到的时候可以随时 ...

  5. mysql checksum用法_MySQL checksum理解_mysql

    mysql checksum了解 在主从复制中Checksum常常需要对某些重要的表进行一致性检查. Checksum Table在逻辑备份时候前后是否可以用于验证数据一致性.扩展一下发现有一些有趣的 ...

  6. mysql ibata文件_重装系统后,怎么调用之前mysql的数据_mysql

    重装系统后,如何调用之前mysql的数据 前提是:必须保留之前的数据库数据 在介绍此方法之前,提醒各位最好的转移数据的方法为: 在原来MYSQL服务器导出SQL文件,然后再在新的MYSQL服务器导入数 ...

  7. MySql深分页问题详解

    MySql深分页问题详解 1. 问题描述 2. 问题分析 3. 验证测试 3.1 创建两个表 3.2 创建两个函数 3.3 编写存储过程 3.4 编写存储过程 3.5 创建索引 3.6 验证测试 4. ...

  8. mysql数据更新回退_Mysql的几个灵魂拷问(一)

    开发对于数据库的了解可不能局限于CURD,数据库的技能复杂度也不是仅仅写几个复杂的sql语句,这个Mysql系列就是对数据库由浅到深的总结. 一.基础概念 myisam 和 innodb的区别吗? m ...

  9. 实战!聊聊如何解决MySQL深分页问题

    前言 我们日常做分页需求时,一般会用limit实现,但是当偏移量特别大的时候,查询效率就变得低下.本文将分四个方案,讨论如何优化MySQL百万数据的深分页问题,并附上最近优化生产慢SQL的实战案例. ...

最新文章

  1. CVPR2018上关于目标检测(object detection)
  2. node.js 多个异步过程判断执行是否完成
  3. cannot be registered to your development team. Change your bundle identifier to a unique string to t
  4. oracle00312,oracle 启动 报ORA-16014 和 ORA-00312
  5. 【Linux】一步一步学Linux——cut命令(44)
  6. RVDS4.0上开发cortex A8 NEON程序
  7. 对我影响最大的三个老师
  8. 使用MySQL的存储过程
  9. Swift 语言概览 -自己在Xcode6 动手写1
  10. Java集合的框架和实现类
  11. access的papersize命令_如何在报表中使用自定义尺寸的纸张
  12. MATLAB程序(入门)
  13. python骰子游戏分析_python知识分解析掷骰子游戏
  14. Default clip could not be found in attached animations list...must be marked as legacy解决办法
  15. 公司-瑞幸咖啡:瑞幸咖啡
  16. 关于Altium Designer的BOM,元件清单
  17. 动手学深度学习笔记3.1+3.2+3.3
  18. Vue Browserslist: caniuse-lite is outdated.
  19. 干得好也要说得好| 这样向领导汇报,让你在职场上如鱼得水
  20. opencv学习日记——娜扎小姐姐与猫咪的图像融合,超美哈哈哈

热门文章

  1. Java:计算类的serialVersionUID
  2. 用Spring长轮询Tomcat
  3. 泽西岛的JSON模式生成
  4. 用Java排序的五种有用方法
  5. 轻松完成Birt报告
  6. python执行linux命令返回结果_python执行linux命令的简单示例
  7. IntelliJ IDEA普通的Java项目如何转成Maven Web项目
  8. macOS查看IP地址的命令
  9. LFS、BLFS、ALFS、HLFS的区别详解
  10. 超时空机战服务器配置信息错误,超时空机战熔炉篇FAQ教你如何合理的使用熔炉...