对于 MySQL 数据库而言,数据是存储在文件里的,而为了能够快速定位到某张表里的某条记录进行查询和修改,我们需要将这些数据以一定的数据结构进行存储,这个数据结构就是我们说的索引。能够支持快速查找的数据结构有:顺序数组、哈希、搜索树等。数组要求插入的时候保证有序,这样查找的时候可以利用二分查找法达到O(log(N))的时间复杂度,对范围查询支持也很好,但是插入的时候如果不是在数组尾部,就需要摞动后面所有的数据,时间复杂度为O(N)。所以有序数组只适合存储静态数据,例如几乎很少变动的配置数据,或者是历史数据。磁盘O是一个相对很慢的操作,为了提高读取速度,我们应该尽量减少磁盘IO操作,而操作系统一般以4kb 为一个数据页读取数据,而 MySQL 一般为16kb 作为一个数据块,已经读取的数据块会在内存进行缓存,如果多次数据读取在同一个数据块,则只需要一次磁盘IO,而如果顺序一致的记录在文件中也是顺序存储的,就可以一次读取多个数据块,这样范围查询的速度也可以大大提升,显然链表没有这方面的优势。哈希表通过一个特定的哈希函数将 key 值转换为一个固定的地址,然后将对应的 value 放到这个位置,如果发生哈希碰撞就在这个位置拉出一个链表,由于哈希函数的离散特性,所以经过哈希函数处理后的 key 将失去原有的顺序,所以哈希结构的索引无法满足范围查询,只适合等值查询的情况例如一些缓存的场景。二叉树在极端情况下会变成线性结构,也就是每个节点都只有左子节点或者只有右子节点,这样就无法利用二分查找只能从第一个节点开始向后遍历了,所以为了维持O(log(N))的时间复杂度,我们需要在插入节点的时候对节点进行调整以保证树的平衡,所以平衡二叉树插入的时间复杂度也是 O(log(N)),为了尽量的减少磁盘读写次数,一般用N叉树来代替二叉树

总结来说,数据是以行为单位存储在聚簇索引里的,根据主键查询可以利用聚簇索引定位到所在记录,根据普通索引查询需要先在普通索引上找到对应的主键的值,然后根据主键值去聚簇索引上查找记录,俗称回表。普通索引上存储的值是主键的值,如果主键是一个很长的字符串并且建了很多普通索引,将造成物理空间被占据很大空间,而这也促使使用自增ID来作为主键,另一个原因是因为自增ID在插入的时候可以保证相邻的两条记录可能在同一个数据块,而其他的元素连续性在设计上可能没有自增ID好,导致连续插入可能在多个数据块,增加了磁盘读写次数。

转载于:https://www.cnblogs.com/ggrm/p/11048810.html

Mysql分析排序和锁阅读总结相关推荐

  1. 通过MySQL存储原理来分析排序和锁

    先抛出几个问题 1.为什么不建议使用订单号作为主键? 2.为什么要在需要排序的字段上加索引? 3.for update 的记录不存在会导致锁住全表? 4.redolog 和 binlog 有什么区别? ...

  2. mysql 复合索引 悲观锁_对MySQL索引、锁及事务的简单分析

    一.索引的数据结构 1.二叉搜索树实现的索引 二叉搜索树如下图,它查找元素的时间复杂度为O(logn) 但如果经常出现增删操作,最后导致二叉搜索树变成线性的二叉树,这样它查找元素的时间复杂度就会变成O ...

  3. mysql分析表锁,MySQL锁分析和监控

    通常在MySQL的管理和监控中,Active Session(活动会话)是监控指标中的一个很重要的指标,通过活动会话监控,可以很清楚的了解到数据库当前是否有SQL堆积,是否处于非常繁忙的状态.那么除了 ...

  4. 【MySQL进阶】MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!)

    [MySQL进阶]MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!) 参考资料: 美团技术团队:Innodb中事务隔离级别和锁的关系 数据库的锁,到底锁的是什么? 阿里面试:说说一致性读实现原 ...

  5. 五分钟了解Mysql的行级锁——《深究Mysql锁》

    延伸阅读: 三分钟了解Mysql的表级锁 一分钟深入Mysql的意向锁 mysql锁相关讲解及其应用--<深究mysql锁>了解锁前,一定要先看这篇,了解什么是MVCC,如果我们学习锁,没 ...

  6. 三分钟了解Mysql的表级锁——《深究Mysql锁》

    延伸阅读: 五分钟了解Mysql的行级锁 一分钟深入Mysql的意向锁 mysql锁相关讲解及其应用--<深究mysql锁>了解锁前,一定要先看这篇,了解什么是MVCC,如果我们学习锁,没 ...

  7. 把MySQL中的各种锁及其原理都画出来

    疫情期间在家工作时,同事使用了 insert into on duplicate key update 语句进行插入去重,但是在测试过程中发生了死锁现象: ERROR 1213 (40001): De ...

  8. MySQL之事务、锁

    锁 一.概念 锁是计算机协调多个进程或线程访问某一个资源的机制.在数据库中,除传统的计算资源(CPU.RAM.IO)的争用意外,数据也是一种许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所 ...

  9. mysql慢查询 表级锁_三分钟了解Mysql的表级锁——《深究Mysql锁》

    延伸阅读: 五分钟了解Mysql的行级锁 一分钟深入Mysql的意向锁 mysql锁相关讲解及其应用--<深究mysql锁>了解锁前,一定要先看这篇,了解什么是MVCC,如果我们学习锁,没 ...

最新文章

  1. unity开宝箱动画_unity简单动画实现
  2. SSM整合(2): spring 与 mybatis 整合
  3. springboot接口入参下划线转驼峰以及返回参数驼峰转下划线实现
  4. TFT显示屏驱动设计与验证
  5. Hive 老当益庄 | 深度解读 Flink 1.11:流批一体 Hive 数仓
  6. linux下安装mongodb,以及解决安装报错问题
  7. android5.1不生成odex
  8. 在Eclipse或工作空间中 ,复制或修改项目后,把项目部署后发现还是原来的项目名称...
  9. 如何修改hosts文件
  10. 时间序列数据的存储和计算 - 概述
  11. 前加加与后加加(自增)
  12. 阿里,B站小伙伴刚刚分享的大数据开发运维学习规划,抓紧收藏
  13. zynqmp Linux + 裸机 (A53-0 Linux,A53-1 2 3 裸机大数据量实时处理,R5-0 协议处理,R5-1 屏幕显示逻辑等)填坑笔记
  14. 嵌入式项目实战——基于QT的视频监控系统设计(三)
  15. Linux保护ssh的三把锁
  16. 计算机考研调剂的985大学,2021年考研调剂:这几所985大学名额很多,不少学生捡漏上了名校...
  17. 44Echarts - 柱状图(阶梯瀑布图)
  18. 基于STM32的定时定量智能宠物投食器原理图PCB
  19. python 在列表中间插入字符串
  20. 全国-城市-百度地图中心点坐标

热门文章

  1. 一个反编译工具Reflactor (.NET)
  2. android 框架LoonAndroid,码农偷懒专用(2014/8/6更新)
  3. [转]基于 aspnet 的自动合并输出js和css的解决方案
  4. python3 getopt用法
  5. TensorFlow基础笔记(5) VGGnet_test
  6. 安卓移植和驱动开发第八章心得体会
  7. 如何给电冰箱加氟(方法)
  8. Windows服务程序的调试
  9. Symbian签名和Uid相关内容的整理(一)
  10. 一步一步掌握设计模式一(最简单的开始--单例模式^_^)