2025.2.27 学习

2025.2.27 学习

八股

深分页问题

select * from user where gender = 1 limit 100000,10;

在gender字段有索引的情况下,这条sql至少需要查询100010条数据(在所有数据都是gender=1的情况下),如果男女均匀分布,期望查询200020次,且根据gender非聚簇索引查到主键id后还需要回表得到整条数据,并确定位置,至少要回表100010次,效率很低。

优化:

select * from user where id >= (select id from user where gender = 1 order by id limit 100000,1) limit 0,10;

优化后就可以直接用主键索引定位到第100000条数据的偏移量,然后往后再找10条满足gender=1的记录即可,至少减少了100000次回表操作。

binlog redolog undolog

binlog二进制文件用于记录mysql服务器上的所有更新和修改操作,记录每条DDL和DML语句,是逻辑日志。

redolog用于恢复数据,保证数据的一致性和持久性。当Mysql发生修改的时候,redolog会将这些操作记录下来,并写入磁盘。这样当mysql发生宕机或崩溃时,通过重放redolog就可以恢复数据。

undolog用于回滚操作。当 MySQL发生事务回滚时,这样,当 MySQL需要回滚时,通过重放 undolog 就可以回滚事务。

b树和b+树

主要区别是b树每个节点中都存数据,而b+树的非叶子节点只存索引,所有数据放在叶子节点存储。

B+树由于索引节点上只有索引而没有数据,所以索引节点上能存储比 B 树更多的索引,这样树的高度就会更矮。树的高度越矮,磁盘寻道的次数就会越少。

因为数据都集中在叶子节点,而所有叶子节点的高度相同,那么可以在叶子节点中增加前后指针,指向同一个父节点的相邻兄弟节点,这样可以更好地支持查询一个值的前驱或后继,使连续访问更容易实现。

比如这样的 SQL 语句:select * from tbl where t > 10,如果使用 B+ 树存储数据的话,可以首先定位到数据为 10 的节点,再沿着它的 next 指针一路找到所有在该叶子节点右边的叶子节点,返回这些节点包含的数据。

而如果使用 B 树结构,由于数据既可以存储在内部节点也可以存储在叶子节点,连续访问的实现会更加繁琐(需要在树的内部结构中进行移动)

posted @   vast_joy  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示