解决问题的一般思路是:发现问题,找到问题的原因,根据原因因地制宜解决。定位到了执行慢的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:对于每个来自于前面的表的行组合,从该表中读取一行,它用在一个索引的所有 部分被联接使用并且索引是UNIQUE或PRIMARY 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 INDEX、USE 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 |
相关推荐
而MySQL Connector/J是MySQL官方提供的JDBC驱动,使得Java应用程序能够无缝地连接到MySQL数据库,执行SQL查询,进行数据读写操作。 MySQL Connector/J 8.0.13 是针对MySQL 8.0.x系列的驱动,这意味着它支持MySQL ...
版本8.0.26的更新可能包含了性能优化、新的特性和对MySQL新版本的支持,以及可能的bug修复。通常,升级驱动到最新版本可以确保最佳的兼容性和安全性。 此外,压缩包中还包含了一个名为"mysql-connector-java-8.0.26...
5. **性能优化**:通过优化网络通信和查询执行,提高与MySQL服务器交互的效率。 6. **错误处理**:提供了详细的错误和异常处理机制,帮助开发者快速定位和解决问题。 “mysql-connector-java-8.0.22.jar.txt”可能...
MySQL Connector/J 8.0.23 是MySQL数据库与Java应用程序之间的重要桥梁,它是一个用于连接Java应用程序到MySQL服务器的JDBC驱动程序。这个jar文件是MySQL官方提供的,确保了与MySQL数据库的高效且可靠的通信。在Java...
odbc-5.1.13`后,用户可以通过ODBC数据源管理器创建MySQL的数据源,然后在支持ODBC的应用程序中,如Excel、Access或者自定义的C++、Python等语言开发的应用,通过数据源名(DSN)来连接到MySQL数据库,执行SQL语句,...
MySQL Connector/J是MySQL数据库与Java应用程序之间的桥梁,它是一个实现了JDBC(Java Database Connectivity)标准的驱动程序,允许Java开发者在Java应用中访问和操作MySQL数据库。`mysql-connector-java-8.0.27....
MySQL Connector/J 8.0.15 版本是针对 MySQL 8.0 数据库系列的,这意味着它已经过优化,可以充分利用 MySQL 8.0 的新特性和性能改进。例如,它支持新的 JSON 数据类型,增强的性能和并发性,以及改进的行级锁定机制...
MySQL Connector/J是MySQL数据库与Java应用程序之间的重要桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够方便地在Java应用中访问MySQL数据库。本资源提供的"mysql-...
1. **下载与添加依赖**:从MySQL官方网站或者第三方源获取此jar包,并将其添加到Java项目的类路径中。对于Maven项目,可以在pom.xml文件中添加对应的依赖条目。 2. **建立连接**:使用JDBC,首先要通过`...
这个压缩包包含的“mysql-connector-java-8.0.24.jar”是这个驱动的二进制文件,允许开发者在Java环境中执行SQL查询、数据操作和其他数据库交互任务。 首先,我们要了解JDBC(Java Database Connectivity),这是...
2. **性能优化**:MySQL Connector/J经过优化,可以充分利用MySQL的特性和性能,例如使用预编译的SQL语句(PreparedStatement)和批处理,提高执行效率。 3. **事务支持**:支持ACID(原子性、一致性、隔离性、持久...
- **性能优化**:利用零拷贝技术,提高数据读写速度;支持多线程并行执行,提升数据库操作效率。 - **安全性**:支持SSL加密,确保数据在传输过程中的安全。 2. **安装与配置** - **下载**:可以从MySQL官方网站...
总的来说,`mysql-connector-java-8.0.13.jar`是Java开发者连接MySQL数据库的重要工具,它的使用涉及到Java的JDBC技术,数据库连接管理,以及数据库操作的基本流程。熟悉这些知识点对于进行Java数据库编程至关重要。
10. **性能优化**:通过预编译的存储过程、批处理操作和连接池技术,可以显著提高性能并减少网络负载。 mysql-connector-net-6.1.6版本可能存在一些已知的问题和限制,开发者应关注官方更新日志和社区反馈,适时...
"二、mysql优化技术-定位慢查询"这一主题聚焦于如何识别和解决性能瓶颈,提升数据库的响应速度。这篇博文可能详细介绍了如何诊断和解决MySQL中的慢查询问题,而`sql.txt`文件很可能包含了一些示例SQL语句或者慢查询...
- **性能提升**:通过优化查询缓存、查询执行计划和内存管理,提升了整体查询速度。 2. **Winx64平台**: 这个版本是为64位Windows操作系统设计的,这意味着它可以利用64位系统的内存寻址能力和更大的内存空间,...
mysql-connector-java-8.0.19.jar包含了实现这些接口的类和方法,使得Java开发者可以方便地在代码中执行SQL语句,处理结果集等。 2. **版本8.0.19**:这个版本的发布意味着它包含了一系列的改进、修复和新特性。...
此外,MySQL Connector/J还支持多种高级功能,包括事务处理、批处理、连接池管理以及连接和查询性能优化。它还提供了一套全面的异常处理机制,帮助开发者优雅地处理数据库操作中的错误和异常。 总的来说,MySQL ...
这个版本的驱动支持Java平台的标准接口,允许Java开发者在应用程序中执行SQL语句、处理结果集以及管理MySQL数据库的事务。 MySQL Connector/J 的主要功能包括: 1. **连接管理**:提供连接到MySQL服务器的机制,...
4. **改进的查询优化器**:新的优化器策略和统计信息收集方法提高了查询性能,确保数据库能更准确地选择执行计划。 5. **增强的加密和安全功能**:包括更强大的默认密码策略、支持AES加密的二进制日志以及对SSL/TLS...