截图:
数据库每次取16k数据。
要减少io次数 和io的量(不要写select *)
每次读取大小16K的数据,
假如找主键为28这个数,先读磁盘一 存了主键为16、34和他们的data, 还有三个范围 小于16,16-34,还有 大于34
28应该是在p2范围的。
所以按着p2指针找到磁盘三 把磁盘三读进内存,
同理 磁盘三存的是25 31 的数据 以及他们的范围,那么还得找28所在的范围 指针指向磁盘八
把磁盘八读进内存 找到主键为28的数据,这就是B树的一个简易流程,找到28的数据 一共进行三次IO。
数据data全都放在叶子节点了,而且每个key要出现2次
单机数据库非常建议采用主键递增的设置,因为插入数据 自动递增的话会自然地向最后插入数据,但是不是逐渐递增的话 会向中间插入数据,导致数据页分裂和合并的操作,会影响索引页的改变
select * from stu where name="zhang3"
name有索引的话 先进入name索引的B+树进行查询 只查询到主键的id
在进入主键查询到 * 所有的内容
这种情况就叫回表 ,需要先查找非主键索引 再根据主键索引查询 假如一个表有二十条数据 查询的话 不用索引是要快于使用索引的。
第一条会触发回表,第二条不会触发回表,因为只需要查询id就可以了,这种情况就叫索引覆盖。
直接在存储引擎里做出筛选好数据。
当没有索引下推的时候 io量会非常的大,磁盘虽慢也是相比与内存而言,要尽可能的避免过多的数据加载到内存里面。所以推荐使用索引下推。
主键:尽量使用主键查询 避免回表影响效率;
自然主键
代理主键
