04 | 深入浅出索引(上)
该思维导图由 AI 生成,仅供参考
索引的常见模型
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了MySQL选择B+树结构来存储数据的原因,并分析了数据库索引的重要性以及三种常见的索引模型:哈希表、有序数组和搜索树。文章重点介绍了InnoDB采用的B+树索引模型,以及B+树在维护索引有序性和索引维护过程中的作用。此外,文章还讨论了在建表语句中使用自增主键的优势,以及业务逻辑字段做主键的应用场景。最后,文章提出了一个问题,探讨了重建索引的作法及其优化方法。总的来说,本文深入浅出地介绍了数据库引擎设计中的核心概念和技术特点,对于读者快速了解索引的工作原理和数据库引擎设计具有重要意义。
《MySQL 实战 45 讲》,新⼈⾸单¥68
全部留言(630)
- 最新
- 精选
- wuxue_123置顶老师,回表只是普通索引才会有的吗?主键和数据放在同一个树中,根据主键查询的时候,就可以直接获得数据了。 那select *from table where id=xx 和select id from table where id=xx 的效率是一样的吗?(id是主键)
作者回复: 这两个语句是都不用回表了,在“查找行”这个逻辑上是一样的, 但是select *要读和拷贝更多列到server,还要发送更多列给客户端,所以还是select id更快的。 好问题
2018-12-2030239 - JackPn置顶老师我可不可以理解为:每一张表其实就是一个B+树,树结点的key值就是某一行的主键,value是该行的其他数据。新建索引就是新增一个B+树,查询不走索引就是遍历主B+树。
作者回复: 每一个表是好几棵B+树(应该是你理解对了但是手误), 其它的完全正确
2018-11-2734326 - Christain置顶老师,索引篇结束了么? 有几个问题 1 :三个字段联合索引时,如果中间的字段使用了范围查询或者模糊查询,最后一个字段还会用到索引么? 2:在order by时,索引是如何使用的 3:新建一张表,如何界定其索引的数量,有没有选择或者公式 4:能不能再详细介绍下字符串前缀索引
作者回复: 理论篇的先到这里,实践篇的还有六篇索引相关。 1. 我们文中有这样的例子了哦。like “张%” 就是对name 字段的范围查询/模糊查询。 age 就是你说的最后一个字段啦 😄 2. 我们有两篇的篇幅来讲order by, 第14和16(15是答疑) 3. 根据查询需要😓 4. 等《如何给字符串字段加索引》发布哈 嗯索引的内容其实很多,基础篇两篇是不可能写完的,而且怕理论类太多大家读着累,把一些知识点放到实践篇了 @all
2018-11-237100 - 壹笙☞漂泊总结: 1.索引的作用:提高数据查询效率 2.常见索引模型:哈希表、有序数组、搜索树 3.哈希表:键 - 值(key - value)。 4.哈希思路:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置 5.哈希冲突的处理办法:链表 6.哈希表适用场景:只有等值查询的场景 7.有序数组:按顺序存储。查询用二分法就可以快速查询,时间复杂度是:O(log(N)) 8.有序数组查询效率高,更新效率低 9.有序数组的适用场景:静态存储引擎。 10.二叉搜索树:每个节点的左儿子小于父节点,父节点又小于右儿子 11.二叉搜索树:查询时间复杂度O(log(N)),更新时间复杂度O(log(N)) 12.数据库存储大多不适用二叉树,因为树高过高,会适用N叉树 13.InnoDB中的索引模型:B+Tree 14.索引类型:主键索引、非主键索引 主键索引的叶子节点存的是整行的数据(聚簇索引),非主键索引的叶子节点内容是主键的值(二级索引) 15.主键索引和普通索引的区别:主键索引只要搜索ID这个B+Tree即可拿到数据。普通索引先搜索索引拿到主键值,再到主键索引树搜索一次(回表) 16.一个数据页满了,按照B+Tree算法,新增加一个数据页,叫做页分裂,会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。 17.从性能和存储空间方面考量,自增主键往往是更合理的选择。 思考题: 如果删除,新建主键索引,会同时去修改普通索引对应的主键索引,性能消耗比较大。 删除重建普通索引貌似影响不大,不过要注意在业务低谷期操作,避免影响业务。
作者回复: 优秀
2018-11-2125833 - 约书亚“N叉树”的N值在MySQL中是可以被人工调整的么?曾经面试被问到过这问题,当时就懵逼了...
作者回复: 面试中题面越简单的问题越暗藏凶险,可见一斑… 可以按照调整key的大小的思路来说; 如果你能指出来5.6以后可以通过page大小来间接控制应该能加分吧 面试回答不能太精减,计算方法、前缀索引什么的一起上😄
2018-11-2178347 - 堵车请问没有主键的表,有一个普通索引。怎么回表?
作者回复: 没有主键的表,innodb会给默认创建一个Rowid做主键
2018-11-218292 - 天天向上去面试,遇到面试官问我innodb B+树主键索引的叶子节点存的是什么,我说是行,面试官说错,存的是页, 老师讲的就是行啊,我……
作者回复: B+树的叶子节点是page (页),一个页里面可以存多个行
2019-03-2371249 - 扬~但现在一般自增索引都设置为bigint,这点老师这么看
作者回复: 特别合理,因为现在很多业务插入数据很凶残,容易超过int 上限, 实际上是建议设置bigint unsigned 好问题
2018-12-198142 - Richie老师索引只能定位到page,page内部怎么去定位行数据
作者回复: 内部有个有序数组,二分法
2018-11-2114133 - 橡皮泥boy【回答问题】 1. 直接删掉主键索引是不好的,它会使得所有的二级索引都失效,并且会用ROWID来作主键索引; 2. 看到mysql官方文档写了三种措施,第一个是整个数据库迁移,先dump出来再重建表(这个一般只适合离线的业务来做);第二个是用空的alter操作,比如ALTER TABLE t1 ENGINE = InnoDB;这样子就会原地重建表结构(真的吗?);第三个是用repaire table,不过这个是由存储引擎决定支不支持的(innodb就不行)。
作者回复: 准确
2018-11-2214115