mysql查询所用时间过长 如何优化?
发布网友
发布时间:2022-04-21 07:17
我来回答
共1个回答
热心网友
时间:2023-10-16 09:27
explain命令是查看查询优化器如何决定执行查询的主要方法。
这个功能有局限性,并不总会说出*,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的。
1、什么是MySQL执行计划
要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解。
MySQL本身的功能架构分为三个部分,分别是 应用层、逻辑层、物理层,不只是MySQL ,其他大多数数据库产品都是按这种架构来进行划分的。
应用层,主要负责与客户端进行交互,建立链接,记住链接状态,返回数据,响应请求,这一层是和客户端打交道的。
逻辑层,主要负责查询处理、事务管理等其他数据库功能处理,以查询为例。
首先接收到查询SQL之后,数据库会立即分配一个线程对其进行处理,第一步查询处理器会对SQL查询进行优化,优化后会生成执行计划,然后交由计划执行器来执行。
计划执行器需要访问更底层的事务管理器,存储管理器来操作数据,他们各自的分工各有不同,最终通过调用物理层的文件获取到查询结构信息,将最终结果响应给应用层。
物理层,实际物理磁盘上存储的文件,主要有分文数据文件,日志文件。
通过上面的描述,生成执行计划是执行一条SQL必不可少的步骤,一条SQL性能的好坏,可以通过查看执行计划很直观的看出来,执行计划提供了各种查询类型与级别,方面我们进行查看以及为作为性能分析的依据。
2、如何分析执行计划
MySQL为我们提供了 explain 关键字来直观的查看一条SQL的执行计划。
explain显示了MySQL如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句。
下面我们使用 explain 做一个查询,如下:
mysql> explain select * from payment;
+----+-------------+---------+------------+------+---------------+------+---------+------+-------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+------+---------+------+-------+----------+-------+
| 1 | SIMPLE | payment | NULL | ALL | NULL | NULL | NULL | NULL | 16086 | 100.00 | NULL |
+----+-------------+---------+------------+------+---------------+------+---------+------+-------+----------+-------+
1 row in set, 1 warning (0.01 sec)
查询结构中有12列,理解每一列的含义,对理解执行计划至关重要,下面用一个表格的形式进行说明。
列名
说明
id
SELECT识别符,这是SELECT的查询序列号。
select_type
SELECT类型,可以为以下任何一种:
SIMPLE:简单SELECT(不使用UNION或子查询)
PRIMARY:最外面的SELECT
UNION:UNION中的第二个或后面的SELECT语句
DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
UNION RESULT:UNION 的结果
SUBQUERY:子查询中的第一个SELECT
DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
DERIVED:导出表的SELECT(FROM子句的子查询)
table
输出的行所引用的表
partitions
如果查询是基于分区表的话,显示查询将访问的分区。
type
联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:
system:表仅有一行(=系统表)。这是const联接类型的一个特例。
const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!
eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。
ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。
ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。
index_merge:该联接类型表示使用了索引合并优化方法。
unique_subquery:该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
index_subquery:该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
range:只检索给定范围的行,使用一个索引来选择行。
index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
ALL:对于每个来自于先前的表的行组合,进行完整的表扫描,说明查询就需要优化了。
一般来说,得保证查询至少达到range级别,最好能达到ref。
possible_keys
指出MySQL能使用哪个索引在该表中找到行
key
显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。
key_len
显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。在不损失精确性的情况下,长度越短越好
ref
显示使用哪个列或常数与key一起从表中选择行。
rows
显示MySQL认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数。
filtered
显示了通过条件过滤出的行数的百分比估计值。
Extra
该列包含MySQL解决查询的详细信息
Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
Select tables optimized awayMySQL根本没有遍历表或索引就返回数据了,表示已经优化到不能再优化了
Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行,说明查询就需要优化了。
Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果,说明查询就需要优化了。
Using where:WHERE 子句用于*哪一个行匹配下一个表或发送到客户。
Using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描。
Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查 询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。
总结
以上所述是小编给大家介绍的MySql中如何使用 explain 查询 SQL 的执行计划,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章:MySQL查询优化之explain的深入解析mysql中explain用法详解mysql总结之explainMySQL性能分析及explain的使用说明Mysql中explain作用详解Mysql之EXPLAIN显示using filesort介绍MySQL中通过EXPLAIN如何分析SQL的执行计划详解MYSQL explain 执行计划详解MySQL中EXPLAIN解释命令及用法讲解MySQL性能优化神器Explain的基本使用分析
MySQL查询速度慢一万次查询时间长如何优化查询性能看这篇文章就够了mys...
缓存查询结果是一种常用的性能优化方法。如果查询结果是不变的,可以将结果缓存到内存中,下一次查询时可以直接从缓存中获取结果。这样可以避免重复查询数据库,在一定程度上提高查询速度。4.使用正确的存储引擎 MySQL支持多种存储引擎,每种引擎都有不同的性能特点。例如,MyISAM适合读多写少,InnoDB适合读...
优化MySQL查询减少两表联查的耗时mysql两表联查耗时
通过减少联表查询的次数和使用适当的索引,可以有效地优化MySQL查询,提高查询效率和性能。在实际操作中,建议使用视图和子查询代替JOIN语句,使用联合索引和覆盖索引来提高查询速度。此外,还可以使用MySQL查询缓存来缓存查询结果,以进一步减少查询时间和提高查询性能。
如何优化MySQL三表联查mysql三表联查太慢
1. 使用索引 在使用联查时,最好为每个表的关联字段建立索引。索引可以通过快速定位和过滤数据,缩短查询时间。如下所示,建立表之间的连接:SELECT t1.name, t2.phone, t3.address FROM table1 t1 JOIN table2 t2 ON t1.id=t2.id JOIN table3 t3 ON t1.id=t3.id;在上述查询中,应为t1...
MySql慢查询优化
慢查询配置方面,可以通过命令行和配置文件两种方式开启。命令行方式下,首先检查慢查询日志是否开启,如果未开启可执行相关命令并设置long_query_time参数,然后查询慢查询日志文件存放位置。通过my.cnf文件配置同样可以实现慢查询的开启,只需在配置文件的mysqld部分添加相关参数,重启数据库验证设置效果。慢查...
MySQL查询优化如何使用IN查询获取更好的性能mysql中in中查询
1.使用JOIN替代IN查询 IN查询的语法通常为:SELECT * FROM table WHERE column IN (value1, value2, …); 该查询会将多个值一次性传给MySQL,MySQL需要一个个判断这些值是否符合条件。如果IN查询中的值很多,查询时间就会很长。因此,建议使用JOIN替代IN查询。例如:SELECT t1.* FROM table1 ...
MySQL查询上千万表如何优化数据库性能mysql上千万表查询
SQL语句的优化可以使MySQL执行速度更快,减少查询时间。在编写SQL语句时,我们要注意以下几点:1.避免使用SELECT 查询数据时一定要避免使用SELECT *,而是要尽可能明确地指定所需要的字段。因为使用SELECT *查询时,MySQL需要检索所有列的值,会导致几个字段的查询变得很慢。2.避免使用子查询 子查询是一个...
MySQL索引处理技巧大于等于的优化mysql大于等于索引
MySQL的大于等于查询优化技巧主要有以下3种:1.模糊查找索引:使用模糊查找索引,MySQL可以根据特定字段识别出需要查找的行,这可以大大提高查询性能。下面是一个模糊查找索引的例子:CREATE INDEX idx_name ON tablename(fieldname);2.跳表索引:跳表索引可以有效地加快大于等于查询,因为它可以帮助MySQL在...
优化MySQL三表联查提升查询效率mysql三表联查效率
1. 缩小查询范围:尽可能减少查询条件的范围,以缩短查询时间。例如,在三表联查中,可以先通过WHERE子句对第一个表进行过滤,以减少JOIN操作的数量。2. 添加索引:在多表联查中,可以为关联列添加索引,以加快JOIN操作的速度。同时,在使用SELECT语句时,也应该使用优化的索引顺序,以提高查询效率。MySQ...
优化性能加快查询速度MySQL中使用键的好处mysql中使用键的好处_百度...
除了提高查询速度外,键还可以优化MySQL的性能。使用键可以减少MySQL需要扫描的数据量,从而缩短查询时间和降低系统负载,提高系统的稳定性和可靠性。例如,如果我们有一个包含大量数据的表,那么使用键可以帮助MySQL快速定位到需要查询的数据行,从而减少系统资源的消耗,提高系统的性能。二、如何使用键 在...
如何优化MySQL的三表查询mysql三表查询优化
总结:对于开发者而言,在使用MySQL进行三表查询时,如何优化查询效率是一项非常重要的任务。通过使用JOIN语句代替子查询、使用索引、以及合理选择LEFT JOIN和INNER JOIN,能够显著的提高查询速度。同时,开发者们需要在实际的应用程序中灵活运用这些技术方法,并根据具体情况进行优化。