搜索
首页数据库mysql教程Mysql -- 执行计划介绍_MySQL

一、序言

       作为程序员,难免要和数据库打交道,一般情况下,我们不是DBA ,但是又要写很多SQL,因此SQL效率就成了很大的问题。关于SQL效率优化,除了要掌握一定优化技巧外, 还得有很多经验的积累,但是这里我们可以通过执行计划对SQL进行分析,能快速找到优化的地方,这是一种很不错的方式,介绍给大家,大部分我是翻译而来,原文地址:http://dev.mysql.com/doc/refman/5.6/en/explain-output.html

二、执行计划输出列的含义:

    

Column Meaning
id The SELECT identifier
select_type The SELECT type
table The table for the output row
partitions The matching partitions
type The join type
possible_keys The possible indexes to choose
key The index actually chosen
key_len The length of the chosen key
ref The columns compared to the index
rows Estimate of rows to be examined
filtered Percentage of rows filtered by table condition
Extra Additional information

● id

   查询的标识,表示在select 执行语句中的顺序(PS:数字越大,优先执行)。如果这行是和其他行合并的结果,这个值可以为null。比如:使用 UNION 关键字,将多个select 的结果合并到一起。

● select_type:每个select 的类型。

select_typeMeaning
SIMPLE 简单的 SELECT (没有 使用UNION 或者 子查询(PS:单表查询))
PRIMARY 最外层的Select 作为primary 查询。(PS:含有子查询的情况,但是并不复杂)
UNION 从第二个或者在union 之后的select 作为 union 查询
DEPENDENT UNION 从第二个或者在union 之后的select 作为 union 查询, 依赖于外部查询
UNION RESULT 结果集是通过union 而来的,作为...
SUBQUERY 第一个查询是子查询
DEPENDENT SUBQUERY 第一个查询是子查询,依赖于外部查询
DERIVED 在from 查询语句中的(派生,嵌套很多)子查询.(PS:递归操作这些子查询)
MATERIALIZED (雾化) 子查询(PS:子查询是个视图?)
UNCACHEABLE SUBQUERY 子查询结果不能被缓存, 而且必须重写(分析)外部查询的每一行
UNCACHEABLE UNION 第二个 或者 在UNION 查询之后的select ,属于不可缓存的查询

● Table:输出所用到的表(PS:通过id 联系) 

● Type:连接类型,很重要的分析手段,下面按最优到最差排序:

   System:表只有一行(=系统表),const 的特例

   const:表查询结果最多只有一行,因为只有一行,该查询优化部分一般是常数。比如根据主键id=1 查询。

   比如:

SELECT * FROM tbl_name WHERE primary_key=1;

   eq_ref:从当前这个表读出的一行,和前面所有表的行进行组合,这是除了const 和system 外,最好的连接类型,它是用于所有的都是用唯一索引去连接被主键或者不为空的索引。常用=操作符比较索引

    比如:

    

SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;

   ref:用于连接非唯一索引的扫描。可以对索引的列使用> = 的操作符。

    比如: 

SELECT * FROM ref_table WHERE key_column=expr; SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;

     

SELECT * FROM <code style="font-size: 14px; background-color: #ffffff;">ref_table</code>,<code style="font-size: 14px; background-color: #ffffff;">other_table</code>WHERE <code>ref_table</code>.<code>key_column_part1</code>=<code>other_table</code>.<code>column</code>AND <code>ref_table</code>.<code>key_column_part2</code>=1;

    

     fulltext: 该方式使用的是全文检索

       ref or null : 该连接方式像ref,但是包含null 的值 ,该连接类型主要是解决子查询

       比如:

SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;

    index_merge:索引合并优化(PS:多个索引条件情况,进行条件的合并优化)

      

我版本低,没出现。。,可以参考下面解释:http://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.htmlSELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;SELECT * FROM tbl_nameWHERE (key1 = 10 OR key2 = 20) AND non_key=30;SELECT * FROM t1, t2WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%')AND t2.key1=t1.some_col;SELECT * FROM t1, t2WHERE t1.key1=1AND (t2.key1=t1.some_col OR t2.key2=t1.some_col2);

   

    unique_subquery:这个参照ref,处理子查询

    比如:

value IN (SELECT primary_key FROM single_table WHERE some_expr)

   index_subquery:这个和unique_subquery 类似,取代非唯一索引的子查询

    比如:

value IN (SELECT key_column FROM single_table WHERE some_expr)

   range:只有在range 范围内的都被检索,只用索引才查询哪些行。后面Key 表示你用的那个索引:

    比如:

    

SELECT * FROM tbl_nameWHERE key_column = 10;SELECT * FROM tbl_nameWHERE key_column BETWEEN 10 and 20;SELECT * FROM tbl_nameWHERE key_column IN (10,20,30);SELECT * FROM tbl_nameWHERE key_part1 = 10 AND key_part2 IN (10,20,30);

    

   index:这索引连接类型和ALL一样,除了树的索引扫描,分为两种情况: 1.会便利索引树,2.没有索引树,就是ALL 一样。

     All:全表扫描,通常是最差的一种查询。

● Extra:包含mysql 解析查询的额外信息。

   Distinct:mysql 查询不同的行,当找到和当前行匹配的时候,就不再搜索了。

   FirstMatch(tbl_name) :The semi-join FirstMatch join shortcutting strategy is used for tbl_name.  

   Full scan on NULL key:查询分析器无法使用当前索引的一个失败策略。

   Impossible HAVING: where 条件总是false,无法筛选任何行

   Impossible WHERE noticed after reading const tables:和上面类似

   LooseScan:利用索引来扫描一个子查询表可以从每个子查询的值群组中选出一个单一的值。

   Not exists:mysql 优化了left join 的查询,

   比如:

   

SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;假设t2.id 定义为 not null,这种情况下,Mysql 扫描t1 并且用t1.id 在t2中查找行,如果Mysql 在t2中找到匹配的行,它表明t2.id 不可能为null,因此不会扫描剩下的具有相同id的行,换句话说,t1 中的每一行,mysql 每次都在t2中做一下查询,无论t2 有多少匹配。

   

    Using filesort:无法利用索引完成的排序,比如文件排序

    Using index:利用索引树扫描得出结果,不用全部扫描

    Using temporary:利用临时表存储结果集,通常查询包含 GROUP BY and ORDER BY 。

     Using where:使用where 限定那些行于下一张表匹配,或者返回到客户端,除非你想要获取or 检查表中所有行,如果extra 的值不是Using where并且连接类型不是all 或者index ,那么你可能有一些错误在你的查询中。

    Using join buffer:

    Using MRR:有点复杂,

    参考:http://dev.mysql.com/doc/refman/5.6/en/mrr-optimization.html

    和:http://blog.csdn.net/zbszhangbosen/article/details/7463394

● Key:key 这一列表明实际你用的是那一个索引,没有则是null

● Key len:该列是Mysql 使用key 的长度,没有则为null,文档提示这值能确定你 multiple-part key  中使用的是哪一部分。

● Rows:表示Mysql 执行语句扫描的行数

● Possible_keys:表示mysql 找到的这些行数据,在indexes(很多索引)里面的哪一个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。

小结:

        1.这个不得不吐槽,翻译太烂了...以至于后面都是自己的理解弄的,建议都去看原文啊,而且5.6+ 变化挺多,有些变化我也没遇到过,请见谅啊。

        2.这些简单的说明呢,仅仅是给大家提供一种分析SQL 的途径,也提醒大家不要盲目的根据SQL 去判断效率,当然你经验丰富,就不说啦~。~新手学习。

        3.如果你需要更详细的可以用show profile 的东西,能看到更详细的信息,精确度也更高,还有关于一些实战方面的应用,没来得及总结,这个以后再介绍吧。

        4.还是请见谅下,不正确的 狗血的地方请指出哦,谢谢啦。

        最后分享个不错的mysql 地址:

        http://www.mysqlab.net/

        http://www.mysqlpub.com/

    

      

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
MySQL与Sqlite有何不同?MySQL与Sqlite有何不同?Apr 24, 2025 am 12:12 AM

MySQL和SQLite的主要区别在于设计理念和使用场景:1.MySQL适用于大型应用和企业级解决方案,支持高性能和高并发;2.SQLite适合移动应用和桌面软件,轻量级且易于嵌入。

MySQL中的索引是什么?它们如何提高性能?MySQL中的索引是什么?它们如何提高性能?Apr 24, 2025 am 12:09 AM

MySQL中的索引是数据库表中一列或多列的有序结构,用于加速数据检索。1)索引通过减少扫描数据量提升查询速度。2)B-Tree索引利用平衡树结构,适合范围查询和排序。3)创建索引使用CREATEINDEX语句,如CREATEINDEXidx_customer_idONorders(customer_id)。4)复合索引可优化多列查询,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。5)使用EXPLAIN分析查询计划,避

说明如何使用MySQL中的交易来确保数据一致性。说明如何使用MySQL中的交易来确保数据一致性。Apr 24, 2025 am 12:09 AM

在MySQL中使用事务可以确保数据一致性。1)通过STARTTRANSACTION开始事务,执行SQL操作后用COMMIT提交或ROLLBACK回滚。2)使用SAVEPOINT可以设置保存点,允许部分回滚。3)性能优化建议包括缩短事务时间、避免大规模查询和合理使用隔离级别。

在哪些情况下,您可以选择PostgreSQL而不是MySQL?在哪些情况下,您可以选择PostgreSQL而不是MySQL?Apr 24, 2025 am 12:07 AM

选择PostgreSQL而非MySQL的场景包括:1)需要复杂查询和高级SQL功能,2)要求严格的数据完整性和ACID遵从性,3)需要高级空间功能,4)处理大数据集时需要高性能。PostgreSQL在这些方面表现出色,适合需要复杂数据处理和高数据完整性的项目。

如何保护MySQL数据库?如何保护MySQL数据库?Apr 24, 2025 am 12:04 AM

MySQL数据库的安全可以通过以下措施实现:1.用户权限管理:通过CREATEUSER和GRANT命令严格控制访问权限。2.加密传输:配置SSL/TLS确保数据传输安全。3.数据库备份和恢复:使用mysqldump或mysqlpump定期备份数据。4.高级安全策略:使用防火墙限制访问,并启用审计日志记录操作。5.性能优化与最佳实践:通过索引和查询优化以及定期维护兼顾安全和性能。

您可以使用哪些工具来监视MySQL性能?您可以使用哪些工具来监视MySQL性能?Apr 23, 2025 am 12:21 AM

如何有效监控MySQL性能?使用mysqladmin、SHOWGLOBALSTATUS、PerconaMonitoringandManagement(PMM)和MySQLEnterpriseMonitor等工具。1.使用mysqladmin查看连接数。2.用SHOWGLOBALSTATUS查看查询数。3.PMM提供详细性能数据和图形化界面。4.MySQLEnterpriseMonitor提供丰富的监控功能和报警机制。

MySQL与SQL Server有何不同?MySQL与SQL Server有何不同?Apr 23, 2025 am 12:20 AM

MySQL和SQLServer的区别在于:1)MySQL是开源的,适用于Web和嵌入式系统,2)SQLServer是微软的商业产品,适用于企业级应用。两者在存储引擎、性能优化和应用场景上有显着差异,选择时需考虑项目规模和未来扩展性。

在哪些情况下,您可以选择SQL Server而不是MySQL?在哪些情况下,您可以选择SQL Server而不是MySQL?Apr 23, 2025 am 12:20 AM

在需要高可用性、高级安全性和良好集成性的企业级应用场景下,应选择SQLServer而不是MySQL。1)SQLServer提供企业级功能,如高可用性和高级安全性。2)它与微软生态系统如VisualStudio和PowerBI紧密集成。3)SQLServer在性能优化方面表现出色,支持内存优化表和列存储索引。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),