2016 - 2024

感恩一路有你

如何知道数据库能否承受的数据量 如何分析一条SQL的性能?

浏览量:3013 时间:2023-05-13 11:34:03 作者:采采

如何分析一条SQL的性能?

在性能测试中,我们经常会遇到一些sql问题。其实数据库是近几年性能测试中最常见的问题,不是IO高就是cpu高,所以数据的优化在性能测试过程中占据了非常重要的位置。这里我将介绍msyql性能调优过程中常用的三个利器:

1、慢速查询(分析sql问题)

2.解释(展示了mysql如何使用索引来处理select语句和连接表。可以帮助选择更好的索引和编写更优化的查询语句)

(查询SQL将执行多长时间,并了解CPU/内存的使用情况,系统锁、表锁执行需要多长时间等。)

首先,让我们 让我们谈谈mysql ■慢速查询。

1.配置已打开

Linux:

添加mysql配置文件

log-slow-qu:。

在的[mysqld]中添加以下语句:

log-slow-qu: w:

使用mysql 自己的命令mysqldumpslow查看。

公共命令

-s ORD:只考虑包含该字符串:的stmts

s,顺序,不够详细。我用了,包括看代码。,主要是c,t,l,r和ac,at,al,ar,按照查询次数,时间,锁时间,返回的记录数排序,前面有-t,表示top n,即返回多少条数据-g,后面可以写一个正则匹配模式,不区分大小写。

mysqldumpslow-s c-t 20 host-slow . log

mysqldumpslow-s r-t 20 host-slow . log

上面的命令可以显示20条被访问最多的sql语句和20条返回最多记录集的sql语句。

myqldumslow-T10-t-g "左连接 "host-slow.log这是根据时间返回左连接的前10个sql语句。

然后是解释。

如何使用:

执行explain select * from RES _ user order by modified time limit 0,1000以获得以下结果:

显示结果分析:

表|类型|可能的关键字|关键字|关键字|引用|行|额外

解释栏的解释:

桌子

显示该行中的数据是关于哪个表的。

类型

这是显示所使用的连接类型的重要列。连接类型从最好到最差依次为const、eq_reg、ref、range、indexhe和ALL。

可能的键

显示可能应用于此表的索引。如果为空,则没有可能的索引。您可以从相关域的WHERE语句中选择适当的语句。

实际使用的索引。如果为NULL,则不使用索引。在极少数情况下,MYSQL会选择一个不够优化的索引。在这种情况下,可以在SELECT语句中使用US:#)

没有找到理想的索引,所以对于上一个表中的每个行组合,MYSQL检查使用哪个索引,并使用它从表中返回行。这是使用索引的最慢的连接之一。

使用文件排序

当您看到这种情况时,查询需要优化。MYSQL需要采取额外的步骤来找出如何对返回的行进行排序。它根据存储排序键值和匹配条件的所有行的连接类型和行指针对所有行进行排序。

使用索引

从只使用索引中的信息而不读取实际操作的表中返回列数据,当表中所有请求的列都是同一索引的一部分时,会发生这种情况。

使用临时

当您看到这种情况时,查询需要优化。这里,MYSQL需要创建一个临时的

表来存储结果,这通常发生在不同的列集上,而不是ORDER BY上。

使用位置

WHERE子句用于限制哪些行将匹配下一个表或返回给用户。这将会发生,如果你不 我不想返回表中的所有行,并且连接类型是ALL或index,或者查询有问题。

不同连接类型的说明(按效率顺序)

系统

该表只有一行:系统表。这是const连接类型的特殊情况。

常数

表中记录的最大值可以匹配该查询(索引可以是主键或唯一索引)。因为只有一行,所以这个值实际上是一个常量,因为MYSQL先读取这个值,然后把它当作一个常量。

eq_ref

在连接中,MYSQL在查询时从前面的表中读取一条记录,在查询索引为主键或唯一键的所有记录时使用。

裁判员

只有当查询使用非唯一键、主键或这些类型的一部分(例如,使用最左边的前缀)时,才会出现这种连接类型。对于前一个表的每个行联合,将从该表中读取所有记录。这种类型很大程度上取决于根据索引匹配了多少记录——越少越好。

范围

这种连接类型使用索引返回某个范围内的行,如gt或lt;当你寻找某物时会发生什么。

指数

这种连接类型联合扫描前一个表中的每一条记录(比全部扫描更好,因为索引通常小于表数据)

全部

这对于一种连接类型来说,联合扫描每个先前的记录通常是不好的,应该尽可能避免这种情况。

然后是侧写。

我们可以先用它

mysqlgt选择@ @分析

-

| @ @剖析|

-

| 0 |

-

集合中的1行(0.00秒),查看是否已启用profile,以及profile ng。

该值为0,可通过以下方法获得

mysqlgt集合分析1

查询正常,0行受影响(0.00秒)

mysqlgt选择@ @分析

-

| @ @剖析|

-

| 1 |

-

集合中的1行(0.00秒)

启用。启用概要分析后,我们执行一个查询语句,例如:

SELECT * FROM res_user ORDER BY修改的时间限制

0,1000

mysqlgt显示个人资料

- - -

-

|查询ID |持续时间|查询|

- - -

-

| 1 | 0.00012200 |选择@@profiling |

| 2 | 1.54582000 |从res_user中选择res_id

按修改的时间限制0,3 |排序

- - -

-

集合中的2行(0.00秒)注意:Query_ID表示刚刚执行的查询语句。

mysqlgt显示个人资料f或查询2

- -

|状态|持续时间|

- -

|开始| 0.000013 |

|检查查询| 0.000035 |的查询缓存

|打开表格| 0.000009 |

|系统锁定| 0.000002 |

|表锁| 0.000015 |

| init | 0.000011 |

|优化| 0.000003 |

|统计| 0.000006 |

|正在准备| 0.000006 |

|正在执行| 0.000001 |

|排序结果| 1.545565 |

|发送数据| 0.000038 |

| end | 0.000003 |

|查询结束| 0.000003 |

|正在释放项目| 0.000069 |

|将结果存储在查询缓存中| 0.000004 |

|记录慢速查询| 0.000001 |

|记录慢速查询| 0.000033 |

|清理| 0.000003 |

- -

集合中有19行(0.00秒)

结论:我们可以看到这条查询语句的执行过程和时间,总时间约为1.545s,此时我们再执行一次。

mysqlgt通过修改时间限制0,3从res_user ORDER中选择res_id

-

| res_id |

-

| 1000305 |

| 1000322 |

| 1000323 |

-

集合中的3行(0.00秒)

mysqlgt显示个人资料

-- - -

|查询ID |持续时间|查询|

- - -

| 1 | 0.00012200 |选择@@profiling |

| 2 | 1.54582000 |根据修改的时间限制0,3 |从res_user ORDER中选择res_id

| 3 | 0.00006500 | SELECT R

数据库数据量有多大?

这会占用文件系统的空间。例如,表空间的大小是10g,使用1g。你的统计是按照10g计算的。select sum(bytes)/1024/1024/1024 from DBA _ segments有多少数据?

类型 情况 记录 时间

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。