`
ywu
  • 浏览: 455567 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

三、mysql优化技术-执行计划

阅读更多

解决问题的一般思路是:发现问题,找到问题的原因,根据原因因地制宜解决。定位到了执行慢的sql语句后,接下来就要分析语句为什么执行慢。

mysql服务器执行sql语句是一个复杂的过程,大致流程如下:

1、接收客户端发送的sql语句;
2、对于查询语句,服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果,否则进入下一阶段;
3、进行SQL解析、预处理,在优化器生成对应的执行计划;
4、mysql根据优化器生成的执行计划,调用存储引擎的API来执行查询;
5、将结果返回给客户端。

也就是说,mysql服务器不是直接执行我们写的sql语句的,而是要对其进行优化,那如果能知道一些mysql优化的细节,对于我们寻找原因有很大帮助,mysql提供了查看执行计划的命令explain关键字,使用方法就是在执行的sql前加explain关键字,explain sql。

我们来看一条sql的执行:

 这条sql执行了4秒多,表结构如下:

表中总记录数如下:

 

查看一下这条sql语句的执行计划:

 

下表是个字段含义解释


字段
说明
可选值
id
查询序列号,表示查询中执行select子句或操作表的顺序
id相同,执行顺序由上至下,如果是子查询,id的序号会递增,
id值越大优先级越高,越先被执行  
一组数字
select_type
查询中每个select子句的类型 

SIMPLE:简单SELECT(不使用UNION或子查询)  

PRIMARY:包含复杂子部分时最外层查询

UNION:UNION中的第二个或后面的SELECT语句

DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询

UNION RESULT:从UNION表获取结果的SELECT

SUBQUERY:SELECT或WHERE列表中的子查询的第一个SELECT

DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询

DERIVED:FROM子句的子查询中包含UNION,外层SELECT

SIMPLE
PRIMARY
UNION

DEPENDENT UNION

UNION RESULT

SUBQUERY

DEPENDENT SUBQUERY

DERIVED

table

输出的行所引用的表

表名

type

联接类型,在表中找到所需行的方式

system:查询的表仅有一行数据

const:表最多有一个匹配行,如根据主键查询,或查询列有unique约束

eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行,它用在一个索引的所有

部分被联接使用并且索引是UNIQUEPRIMARY KEY

ref:非唯一性索引扫描,返回匹配某个单独值的所有行。常见于使用非唯一索引或

唯一索引的非唯一前缀进行的查找

ref_or_null:ref,但是添加了MySQL可以专门搜索包含NULL值的行

index_merge:使用索引合并优化方法

unique_subquery:索引查找函数,可以完全替换子查询,效率更高

index_subquery:类似于unique_subquery,可以替换IN子查询

range:只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引

index:ALL相同,除了只有索引树被扫描,通常比ALL

ALL:全表扫描,遍历全表以找到匹配的行

从上至下,性能由高到低

system

const

eq_ref

ref

ref_or_null

index_merge

unique_subquery

index_subquery

range

index

ALL

possible_keys

指出MySQL能使用哪个索引在表中找到行,查询涉及到的字段上若存在索引,
则该索引将被列出,但不一定被查询使用 ,如果该列是NULL,则没有相关的索引
 

key

显示实际使用的索引,若没有使用索引,显示为NULL,
要想强制MySQL使用或忽视possible_keys中的索引,在查询中使用
FORCE INDEXUSE INDEX或者IGNORE INDEX 
 

key_len

显示mysql决定使用的键长度(字节数 )

 

ref

显示使用哪个列或常数与key一起从表中选择行

 

rows

表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数 
 

Extra

包含MySQL解决查询的详细信息
Distinct:发现第1个匹配行后,停止搜索更多的行
Not exists:对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为
前面的的行组合在该表内检查更多的行
Using filesort:无法利用索引完成的排序操作
Using index:表示相应的select操作中使用了覆盖索引,MySQL可以利用索引返回select
列表中的字段,而不必根据索引再次读取数据文件,包含所有满足查询需要的数据的
索引称为覆盖索引
Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
Using where:使用where子句来过滤结果集

Distinct

Not exists

Using filesort

Using index

Using temporary

Using where

 回过头来看下之前的查询计划,这是一个对emp表的简单查询,没有使用索引,扫描全表,并使用where条件过滤结果集,查询到结果可能要扫描400万行记录。
已经找到了导致sql执行慢的一些地方,接下来就能有针对性的优化了。
 
 
 
  • 大小: 2.9 KB
  • 大小: 4.9 KB
  • 大小: 1.5 KB
  • 大小: 5.7 KB
分享到:
评论

相关推荐

    mysql-connector-java-8.0.26.jar

    版本8.0.26的更新可能包含了性能优化、新的特性和对MySQL新版本的支持,以及可能的bug修复。通常,升级驱动到最新版本可以确保最佳的兼容性和安全性。 此外,压缩包中还包含了一个名为"mysql-connector-java-8.0.26...

    mysql-connector-java-8.0.13.jar

    而MySQL Connector/J是MySQL官方提供的JDBC驱动,使得Java应用程序能够无缝地连接到MySQL数据库,执行SQL查询,进行数据读写操作。 MySQL Connector/J 8.0.13 是针对MySQL 8.0.x系列的驱动,这意味着它支持MySQL ...

    mysql-connector-java-8.0.22.jar

    5. **性能优化**:通过优化网络通信和查询执行,提高与MySQL服务器交互的效率。 6. **错误处理**:提供了详细的错误和异常处理机制,帮助开发者快速定位和解决问题。 “mysql-connector-java-8.0.22.jar.txt”可能...

    mysql-connector-java-8.0.23.jar

    MySQL Connector/J 8.0.23 是MySQL数据库与Java应用程序之间的重要桥梁,它是一个用于连接Java应用程序到MySQL服务器的JDBC驱动程序。这个jar文件是MySQL官方提供的,确保了与MySQL数据库的高效且可靠的通信。在Java...

    mysql-connector-java-8.0.27.jar

    MySQL Connector/J是MySQL数据库与Java应用程序之间的桥梁,它是一个实现了JDBC(Java Database Connectivity)标准的驱动程序,允许Java开发者在Java应用中访问和操作MySQL数据库。`mysql-connector-java-8.0.27....

    mysql-connector-odbc-5.1.13(多平台)

    odbc-5.1.13`后,用户可以通过ODBC数据源管理器创建MySQL的数据源,然后在支持ODBC的应用程序中,如Excel、Access或者自定义的C++、Python等语言开发的应用,通过数据源名(DSN)来连接到MySQL数据库,执行SQL语句,...

    mysql-connector-java-5.1.37-jar

    MySQL Connector/J是MySQL数据库与Java应用程序之间的重要桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够方便地在Java应用中访问MySQL数据库。本资源提供的"mysql-...

    mysql-connector-java-8.0.15.jar

    MySQL Connector/J 8.0.15 版本是针对 MySQL 8.0 数据库系列的,这意味着它已经过优化,可以充分利用 MySQL 8.0 的新特性和性能改进。例如,它支持新的 JSON 数据类型,增强的性能和并发性,以及改进的行级锁定机制...

    mysql-connector-java-5.1.22-bin.jar

    1. **下载与添加依赖**:从MySQL官方网站或者第三方源获取此jar包,并将其添加到Java项目的类路径中。对于Maven项目,可以在pom.xml文件中添加对应的依赖条目。 2. **建立连接**:使用JDBC,首先要通过`...

    mysql-connector-java-8.0.21.jar

    2. **性能优化**:MySQL Connector/J经过优化,可以充分利用MySQL的特性和性能,例如使用预编译的SQL语句(PreparedStatement)和批处理,提高执行效率。 3. **事务支持**:支持ACID(原子性、一致性、隔离性、持久...

    mysql-connector-java-8.0.16.jar

    - **性能优化**:利用零拷贝技术,提高数据读写速度;支持多线程并行执行,提升数据库操作效率。 - **安全性**:支持SSL加密,确保数据在传输过程中的安全。 2. **安装与配置** - **下载**:可以从MySQL官方网站...

    MySQL驱动 mysql-connector-net-6.1.6

    10. **性能优化**:通过预编译的存储过程、批处理操作和连接池技术,可以显著提高性能并减少网络负载。 mysql-connector-net-6.1.6版本可能存在一些已知的问题和限制,开发者应关注官方更新日志和社区反馈,适时...

    二、mysql优化技术-定位慢查询

    "二、mysql优化技术-定位慢查询"这一主题聚焦于如何识别和解决性能瓶颈,提升数据库的响应速度。这篇博文可能详细介绍了如何诊断和解决MySQL中的慢查询问题,而`sql.txt`文件很可能包含了一些示例SQL语句或者慢查询...

    mysql-connector-java-8.0.13.jar mysql数据库驱动下载

    总的来说,`mysql-connector-java-8.0.13.jar`是Java开发者连接MySQL数据库的重要工具,它的使用涉及到Java的JDBC技术,数据库连接管理,以及数据库操作的基本流程。熟悉这些知识点对于进行Java数据库编程至关重要。

    mysql-5.5.40-winx64-msi

    - **性能提升**:通过优化查询缓存、查询执行计划和内存管理,提升了整体查询速度。 2. **Winx64平台**: 这个版本是为64位Windows操作系统设计的,这意味着它可以利用64位系统的内存寻址能力和更大的内存空间,...

    mysql-connector-java-5.1.38-jar

    这个版本的驱动支持Java平台的标准接口,允许Java开发者在应用程序中执行SQL语句、处理结果集以及管理MySQL数据库的事务。 MySQL Connector/J 的主要功能包括: 1. **连接管理**:提供连接到MySQL服务器的机制,...

    mysql-connector-java-8.0.19.jar

    mysql-connector-java-8.0.19.jar包含了实现这些接口的类和方法,使得Java开发者可以方便地在代码中执行SQL语句,处理结果集等。 2. **版本8.0.19**:这个版本的发布意味着它包含了一系列的改进、修复和新特性。...

    mysql-connector-java-8.0.25.jar

    8.0.25是该驱动的版本号,表示这是MySQL Connector/J的一个更新版本,可能包含性能优化、新功能、错误修复和对新MySQL服务器特性的支持。随着MySQL数据库版本的升级,驱动程序也需要随之更新以保持兼容性。 在使用...

    mysql-connector-java-8.0.24.jar

    这个压缩包包含的“mysql-connector-java-8.0.24.jar”是这个驱动的二进制文件,允许开发者在Java环境中执行SQL查询、数据操作和其他数据库交互任务。 首先,我们要了解JDBC(Java Database Connectivity),这是...

    MySQL驱动 mysql-connector-net-6.4.3

    7. 数据库对象操作:`MySqlCommand`还支持创建、修改和删除数据库对象,如表、视图、索引等,通过执行DDL(Data Definition Language)语句实现。 8. 高级功能:包括连接池、异步操作、性能优化等,提高应用程序的...

Global site tag (gtag.js) - Google Analytics