大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子
需求:
想要查找哪些索引太长了,这个SQL在5.7下跑的特别慢,8.0则挺快的,帮看下有啥优化方案没
具体SQL 和执行计划如下 :
SELECT c.TABLE_SCHEMA AS DB,
上面的SQL 运行450+ s 也运行不出来,最后kill掉了。
我们初步分析一下,从执行计划中 可以看出三个表都是ALL 所以很慢
那添加索引不就行了吗,因为是系统表,所以不能随便添加!
那该怎么办?想到了AUTOKEY 就是临时索引,那思路就是改写SQL
达到生成临时索引,最终达到优化效果
改写的SQL 如下
SELECT c.TABLE_SCHEMA AS DB, c.TABLE_NAME AS TBL, c.COLUMN_NAME AS COL, c.CHARACTER_OCTET_LENGTH AS COL_LEN_BYTES, s.INDEX_NAME,
结果来了 2463 rows in set, 417 warnings (23.39 sec)
但是经过几次运行之后 有时候是40多秒有时候甚至达到了166s 非常不稳定!
那分析下上面这个SQL的问题在哪里?
问题就是生成的AUTO KEY的量相对来说非常大!因为没有进行任何过滤
那现在的思路就是 对生成的AUTOKEY的量 进行减少
我们通过相对小的表TABLES 表生成autokey 之后 STATISTICS ,COLUMNS
表分别跟 TABLES 表进行JOIN 然后减少数据量 达到减少生成AUOKEY 的量 减少 达到优化目的 ,具体的方法如下
最终SQL 如下
看起来稳定了,跑了几次,都没超过15秒
我的新一轮的SQL 优化课 即将在春节后开课
我是知数堂SQL 优化班老师~ ^^
如有关于SQL优化方面疑问和一起交流的请加 并且 @兔子@知数堂SQL优化
高性能MySQL,SQL优化群 有叶金荣,吴炳锡 两位大神坐镇 :579036588
欢迎加入 知数堂大家庭。
我的微信公众号:SQL开发与优化(sqlturning)
扫码直达宝藏课程
本文分享自微信公众号 - 老叶茶馆(iMySQL_WX)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。