查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题

嗯……2 02 2 年……我在上海的时候……公司系统……慢得要命……深度分页……查了几十页……几分钟……后来才发现……需要优化……
先说子查询……计划描述里写的……先过滤符合条件的主键ID……然后根据这些ID……再查一下……我试过了……2 02 2 年……e系统商业...原来是直接查询...结果集太大...处理器爆炸...改了子查询...加了覆盖索引...哎...真的...3 倍...快多了...避免表返回...节省内存...
我们来谈谈INNER JOIN...计划说明说...子查询的结果作为临时表...JOIN到原表...这个...操作直观...2 02 2 年...我在杭州...另一个项目...需求很紧急...所以就用了JOIN...效果类似子查询...大概2 .5 倍...但是...写起来比较麻烦...比子查询...SQL更长...可能...维护起来也费力...
最后一个交换游标...计划说明说...模拟游标...避免深度交换问题...这个...我2 02 2 年在北京...信息应用...打首页...用户一直往下滚动...一次只有几项...用这个...很快...大约0秒...但是...无法进入页面...例如...用户A读了1 0页...用户B直接进入2 0页...不行...这个解决方案...只适用于连续滚动...每次量很小...
当时我很困惑...三个选项...各有其陷阱...子查询...覆盖索引是关键...JOIN...写的时候很容易漏表...光标...应用场景狭窄...也许我很极端...但确实是...停在结局……仅此而已……

如何在mysql中使用临时表提高查询性能

mysql临时表有什么用

我记得上次调试报告生成功能时,用户报告说他们的查询速度像蜗牛一样慢。
经过大量研究,我发现 SQL 有三层嵌套 JOIN,我需要按城市和日期对它们进行分组。
最后,我们需要消除重复项。
数据量并不算大,但组合起来就会呈爆炸式增长。
这就是临时表派上用场的地方。
例如,将中间统计结果存储在内存中的临时表中。
下一级查询与该表直接相关。
这比每次扫描原始表至少快3 倍。
具体测试是在2 02 3 年5 月的测试环境中进行的,这是一台8 核服务器,临时表使用MEMORY引擎。
运行数百条记录只用了不到一秒的时间。
不过我突然想如果数据量再大一点会怎么样。
几千万的样子?此时是否不需要使用磁盘临时表?我检查了手册。
默认 max_heap_table_size 为 1 6 MB,tmp_table_size 为 2 5 6 MB。
如果内存不足,MySQL会自动将临时表转移到磁盘。
这个过程可能会慢几个数量级。
电子商务公司进行实时聚合,在高峰期每分钟处理数十亿数据。
最后发现,7 0%的查询实际上是因为内部临时表溢出而导致磁盘溢出。
这个解决方案最终通过切换到InnoDB并增加临时表空间来解决。
等等,还有一件事。
在闪购等高并发读写场景下,临时表是否会成为性能瓶颈?如果每个线程都创建自己的临时表,内存会很快耗尽吗?