您现在的位置是:技术博客 > 数据库数据库 Explain分析sql语句 Lucas2020-09-04 11:48【代码】784人已围观 简介使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,这可以帮你分析你的查询语句或是表结构的性能瓶颈。 使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,这可以帮你分析你的查询语句或是表结构的性能瓶颈。 #### 一、explain的作用 通过explain命令可以得到:表的读取顺序,数据读取操作的操作类型,哪些索引可以使用,哪些索引被实际使用,表之间的引用,每张表有多少行被优化器查询。 #### 二、举个栗子 1、 查看order表的结构详细信息 ``` mysql> desc order +---------------------+------------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------+------------------------+------+-----+---------+----------------+ | rent_order_id | int(10) unsigned | NO | PRI | NULL | auto_increment | | rent_order_number | varchar(32) | NO | | NULL | | | rent_order_date | char(6) | NO | | NULL | | | rent_order_cut | decimal(10,2) unsigned | NO | | NULL | | | rent_order_diff | decimal(10,2) unsigned | NO | | NULL | | | rent_order_pump | decimal(10,2) unsigned | NO | | NULL | | | rent_order_pre_rent | decimal(10,2) | NO | | NULL | | | rent_order_cou_rent | decimal(10,2) | NO | | NULL | | | rent_order_receive | decimal(10,2) unsigned | NO | | NULL | | | rent_order_paid | decimal(10,2) unsigned | NO | | NULL | | | rent_order_remark | varchar(255) | NO | | NULL | | | house_id | int(10) unsigned | NO | | NULL | | | house_nums | varchar(32) | NO | | NULL | | | tenant_id | int(10) unsigned | NO | MUL | NULL | | | tenant_nums | int(10) unsigned | NO | | NULL | | | pay_way | tinyint(1) unsigned | NO | | 0 | | | is_deal | tinyint(1) unsigned | NO | | 0 | | | ctime | int(10) unsigned | NO | | NULL | | | ptime | int(10) unsigned | NO | | NULL | | | is_invoice | tinyint(1) unsigned | NO | | 0 | | | rent_order_status | tinyint(1) unsigned | NO | | 1 | | +---------------------+------------------------+------+-----+---------+----------------+ ``` 2、 用Explain分析sql ``` mysql> explain select rent_order_number,house_id from ph_rent_order where rent_order_id = 1000; +----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------+ | 1 | SIMPLE | ph_rent_order | const | PRIMARY | PRIMARY | 4 | const | 1 | | +----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------+ ``` #### 二、Explain字段解释 1、 select_type:查询的类型 ``` SIMPLE(简单SELECT,不使用UNION或子查询等) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY) UNION(UNION中的第二个或后面的SELECT语句) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询) UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询) DERIVED(派生表的SELECT, FROM子句的子查询) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行) ``` 2、 table:表名 3、 type:表的连接类型 ``` 从最好到最差的连接类型为system、const、eq_reg、ref、range、index和ALL,一般来说,得保证查询至少达到range级别,最好能达到ref。 type中包含的值: system、const: 可以将查询的变量转为常量. 如id=1; id为 主键或唯一键. eq_ref: 访问索引,返回某单一行的数据.(通常在联接时出现,查询使用的索引为主键或惟一键) ref: 访问索引,返回某个值的数据.(可以返回多行) 通常使用=时发生 range: 这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西,并且该字段上建有索引时发生的情况(注:不一定好于index) index: 以索引的顺序进行全表扫描,优点是不用排序,缺点是还要全表扫描 ALL: 全表扫描,应该尽量避免 ``` 4、 possible_keys:显示可能应用在这张表中的索引。如果为空,表示没有可能应用的索引 5、 key:实际使用的索引。如果为NULL,则没有使用索引。 6、 key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好 7、 ref:显示索引的哪一列被使用了,如果可能的话,是一个常数 8、 rows:MySQL认为必须检索的用来返回请求数据的行数 9、Extra:关于MySQL如何解析查询的额外信息,主要有以下几种 ``` Extra中包含的值: using index: 只用到索引,可以避免访问表,性能很高。 using where: 使用到where来过滤数据, 不是所有的where clause都要显示using where. 如以=方式访问索引。 using tmporary: 用到临时表去处理当前的查询。 using filesort: 用到额外的排序,此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行。(当使用order by v1,而没用到索引时,就会使用额外的排序)。 range checked for eache record(index map:N): 没有好的索引可以使用。 Using index for group-by:表明可以在索引中找到分组所需的所有数据,不需要查询实际的表。explain select user_id from t_order group by user_id; ``` > 提示:见到Using temporary和Using filesort,就意味着MySQL根本不能使用索引,结果是检索会很慢,需要优化sql了。 转载:感谢您对Lucas个人博客网站平台的认可,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“来源Lucas个人博客”。 很赞哦! ( 0 ) 上一篇:mysql配置优化 下一篇:数据库死锁 相关文章 常用的SQL函数 页面可视化数据表结构 存储过程函数 mysql连表查询 点击排行 生活不止眼前的苟且,还有诗和远方 十年一觉电影梦 奥地利基茨比厄尔 禅修治愈身心 自律成就自我 零边际成本社会 Modern PHP 鸟哥的Linux私房菜 本栏推荐 要技术,更要有创意 定时任务 Curl无法发送https请求 Lnmp环境搭建 常用的SQL函数 Windows的cmd指令 ueditor工具栏浮动bug 有趣的js插件 标签云 git laravel swoole javascript vue ajax html css sql linux docker flask django nginx apache thinkphp markdown sublime wechat layui photoshop nodejs mysql windows composer java maven springboot mybatis IDE 猜你喜欢 Swoole 基础篇一(初识) PHP进程管理器 正则的快速上手 Sublime代码格式化 Lnmp环境搭建 高并发库存防控超量 Linux之top命令 常用的SQL函数 站点信息 建站时间:2018-05-01 在线人数:1人 文章统计:263篇 总浏览量:222645次 统计数据:百度统计 个人信息:扫描二维码查看