神奇的 SQL 之 MySQL 性能分析神器 → EXPLAIN,SQL 起飞的基石!
前言
开心一刻
某人养了一头猪,烦了想放生,可是猪认识回家的路,放生几次它都自己回来了。一日,这个人想了个狠办法,开车带着猪转了好多路进山区放生,放生后又各种打转,然后掏出电话给家里人打了个电话,问道:“猪回去了吗?”,家里人:“早回来了,你在哪了,怎么还没回来?”,他大怒道:“让它来接我,我特么迷路了!!!”
还不如我了
背景
某一天,楼主打完上班卡,坐在工位逛园子的时候,右下角的 QQ 闪了起来,而且还是个美女头像!我又惊又喜,脑中闪过我所认识的可能联系我的女性,得出个结论:她们这会不可能联系我呀,图像也没映象,到底是谁了?打开聊天窗口聊了起来
她:您好,我是公司客服某某某,请问 xxx后台 是您负责的吗?
我:您好,是我负责的,有什么问题吗?
她:我发现 xxx 页面点查询后,一直是 加载中... ,数据一直出不来,能帮忙看看吗?
我:是不是您的姿势不对?
她:我就 xxx,然后点查询
我:骚等下,我试试,确实有点慢,很长时间才能出来
她:是的,太慢了,出不来,都急死我了,能快点吗?
我:肯定能、必须能!您觉得什么速度让您觉得最舒服?
她:越快越好吧
我:呃...,是吗,我先看看是什么问题,处理好了告诉您,保证让您觉得舒服!
她:好的,谢谢!
公司没有专门的搜索服务,都是直接从 MySQL 查询,做简单的数据处理后返回给页面,慢的原因肯定就是 SQL 查询了。找到对应的查询 SQL ,就是两个表的联表查询,连接键也有索引,WHERE 条件也能走索引,怎么会慢了?然后我用 EXPLAIN 看了下这条 SQL 的执行计划,找到了慢的原因,具体原因后面揭晓(谁让你不是猪脚!)
EXPLAIN 是什么
它是 MySQL 的一个命令,用来查看 SQL 的执行计划(SQL 如何执行),根据其输出结果,我们能够知道以下信息:表的读取顺序,数据读取类型,哪些索引可以使用,哪些索引实际使用了,表之间的连接类型,每张表有多少行被优化器查询等信息,根据这些信息,我们可以找出 SQL 慢的原因,并做针对性的优化
MySQL 5.6 之前的版本,EXPLAIN 只能用于查看 SELECT 的执行计划,而从 MySQL 5.6 开始,可以查看 SELECT 、 DELETE 、 INSERT 、 REPLACE 和 UPDATE 的执行计划,这可不是我瞎掰,不信的可以去 MySQL 的官网查看:Understanding the Query Execution Plan
EXPLAIN 使用方式非常简单,简单的你都不敢相信,就是在我们常写的 SELECT 、 DELETE 、 INSERT 、 REPLACE 和 UPDATE 语句之前加上 EXPLAIN 即可
EXPLAIN SELECT * FROM mysql.`user`; EXPLAIN DELETE FROM t_user WHERE user_name = '123';
莫看 EXPLAIN 短,但它胖呀
虽然有点婴儿肥,但也掩不住我逼人的帅气!
虽然 EXPLAIN 使用起来非常简单,但它的输出结果中信息量非常大,虽然我胖,但我肚中有货呀!
环境和数据准备
MySQL 版本是 5.7.