微友说是做网站维护让帮忙投注,中小企业经营管理培训班,学校网站建设计入哪个会计科目,wordpress中文标题字体MySQL索引原理 1、Innodb中的B树是怎么产生的呢? 背景1.1、mysql索引使用B树#xff0c;为什么#xff1f;1.2、主键索引图示1.3、mysql最好使用自增ID#xff1a;为什么呢#xff1f;1.4、高度为3的B树能存多少条数据#xff1f;a、假设2层b、假设3层 2、索引采用什么数… MySQL索引原理 1、Innodb中的B树是怎么产生的呢? 背景1.1、mysql索引使用B树为什么1.2、主键索引图示1.3、mysql最好使用自增ID为什么呢1.4、高度为3的B树能存多少条数据a、假设2层b、假设3层 2、索引采用什么数据结构3、为什么不用哈希表进行数据存储4、B 树特点5、回表、索引覆盖、最左匹配的区别6、内存与磁盘交互问题 1、Innodb中的B树是怎么产生的呢? 背景
类似链表存储
mysql数据存在磁盘还是内存磁盘 mysql的索引数据存储在那磁盘 存在内存一旦断电索引需要重新重建
1.1、mysql索引使用B树为什么
mysql的数据存储在磁盘mysql的索引数据也存在磁盘——》这里就涉及到了磁盘的交互过程——》通过IO交互为了减少资源消耗减少io量减少io次数
当数据量非常大的时候没办法一次加载到内存中——》采用分块读取——》分而治之——》磁盘预读在内存和磁盘之间交互有一个最基本的的逻辑单位称为页也叫做datapagedatapage的大小跟操作系统相关一般是4kb或者8kb我们在进行数据读取的时候一般选择页的整数倍进行读取。
innodb存储引擎每次读取16kb
1.2、主键索引图示
一页有16kb每一页包含页目录、用户数据区域、指针。
1.3、mysql最好使用自增ID为什么呢
当使用索引列进行数据查询的时候最终会到主键索引树中查询对应的数据行进行返回。
mysql中一页有16kb的数据假设我插入了4条数据一页占满了 当我插入第5条数据如果一页满了会新增一页 但是会出现新插入的数据加入到那一页
如果不是自增列的话会修改之前已经满的页影响性能。 指针指向 当第2页中的数据满了会新增第3页…依次类推 当插入a60000时在磁盘中会从第一页开始遍历链表速度太慢了。怎么优化
在这些页的上层增加1页只存储组件和指针其中int类型占4个字节 指针占6个字节 10个字节。
整页16kb/10字节1638页存多少页
当a60000的时候可以从第一层的数据获得具体的索引范围接着向下取数据。 效率立刻提升。
类似于下方的图示
1.4、高度为3的B树能存多少条数据
a、假设2层
假设数据表中每一条记录为1kb 一页里面能存多少条记录16kb/1kb 一共1638页 存1638*16kb/1kb 26208
b、假设3层
一般情况下3层的B树足以支撑千万级别的数据量存储。
2、索引采用什么数据结构
数据结构——》哈希表、一堆树——》B树
3、为什么不用哈希表进行数据存储
1、哈希冲突和哈希碰撞问题当哈希算法有问题的时候会造成大量的哈希碰撞问题,导致数据聚集。 2、哈希表是散列表数据是无序的当需要进行范围查询的时候只能挨个对比,效率比较低。 memory存储引擎使用的是哈希索引 innodb存储引支持自适应哈希
4、B 树特点
BTree是在BTree的基础之上做的一种优化变化如下: 1、BTree每个节点可以包含更多的节点这个做的原因有两个
第一个原因是为了降低树的高度。第二个原因是将数据范围变为多个区间区间越多数据检索越快。
2、非叶子节点存储key,叶子节点存储key和数据。 3、叶子节点两两指针相互连接(符合磁盘的预读特性)顺序查询性能更高。 5、回表、索引覆盖、最左匹配的区别
例如 select * from 表名 where time“zhangsan”——》回表 select id,name from 表名 where time“zhangsan”——》索引覆盖
6、内存与磁盘交互问题
update数据时 1、判断更新的数据是否在内存中如果在内存中直接更新数据 2、如果不在内存中需要把磁盘的数据加载到内存中 3、去修改内存的数据 4、再把内存中的数据溢写到磁盘中。
内存往磁盘写的过程中可能出现没写完就断掉了导致数据丢失。
随机读写 磁盘寻址找到数据需要消耗时间 顺序读写 append写入日志redlog 举例 餐馆记账本——》找到个人账单——》加上10元 餐馆小黑本——》记录消费的金额——》不忙的的时候再把信息挪到记账本中。