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 树结构,由于数据既可以存储在内部节点也可以存储在叶子节点,连续访问的实现会更加繁琐(需要在树的内部结构中进行移动)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构