当前位置: 首页 > 面试题库 >

如何估算SQL查询时间?

聂奇
2023-03-14
问题内容

我正在尝试估算以下查询可能花费的时间:

mysql> EXPLAIN SELECT t1.col1, t1_col4 FROM t1 LEFT JOIN t2 ON t1.col1=t2.col1 WHERE col2=0 AND col3 IS NULL;
+----+-------------+--------------------+------+---------------+------------+---------+-----------------------------+---------+--------------------------+
| id | select_type | table              | type | possible_keys | key        | key_len | ref                         | rows    | Extra                    |
+----+-------------+--------------------+------+---------------+------------+---------+-----------------------------+---------+--------------------------+
|  1 | SIMPLE      | t1                 | ref  | foobar        | foobar     | 4       | const                       | 9715129 |                          | 
|  1 | SIMPLE      | t2                 | ref  | col1          | col1       | 4       | db2.t1.col1                 |   42318 | Using where; Using index | 
+----+-------------+--------------------+------+---------------+------------+---------+-----------------------------+---------+--------------------------+
2 rows in set (0.00 sec)

mysql>

问题答案:

使用SHOW PROFILES语法可以做到这一点。打开MySQL会话时,可以将变量“分析”设置为1或ON。

mysql> SET profiling = 1;

因此,所有发送到服务器的语句将被分析并存储在历史记录中,并在以后通过键入以下命令显示:

mysql> SHOW PROFILES;

从MySQL手册中可以看到:

mysql> SET profiling = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> DROP TABLE IF EXISTS t1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TABLE T1 (id INT);
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW PROFILES;
+----------+----------+--------------------------+
| Query_ID | Duration | Query                    |
+----------+----------+--------------------------+
|        0 | 0.000088 | SET PROFILING = 1        |
|        1 | 0.000136 | DROP TABLE IF EXISTS t1  |
|        2 | 0.011947 | CREATE TABLE t1 (id INT) |
+----------+----------+--------------------------+
3 rows in set (0.00 sec)

mysql> SHOW PROFILE;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| checking permissions | 0.000040 |
| creating table       | 0.000056 |
| After create         | 0.011363 |
| query end            | 0.000375 |
| freeing items        | 0.000089 |
| logging slow query   | 0.000019 |
| cleaning up          | 0.000005 |
+----------------------+----------+
7 rows in set (0.00 sec)

mysql> SHOW PROFILE FOR QUERY 1;
+--------------------+----------+
| Status             | Duration |
+--------------------+----------+
| query end          | 0.000107 |
| freeing items      | 0.000008 |
| logging slow query | 0.000015 |
| cleaning up        | 0.000006 |
+--------------------+----------+
4 rows in set (0.00 sec)

mysql> SHOW PROFILE CPU FOR QUERY 2;
+----------------------+----------+----------+------------+
| Status               | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| checking permissions | 0.000040 | 0.000038 |   0.000002 |
| creating table       | 0.000056 | 0.000028 |   0.000028 |
| After create         | 0.011363 | 0.000217 |   0.001571 |
| query end            | 0.000375 | 0.000013 |   0.000028 |
| freeing items        | 0.000089 | 0.000010 |   0.000014 |
| logging slow query   | 0.000019 | 0.000009 |   0.000010 |
| cleaning up          | 0.000005 | 0.000003 |   0.000002 |
+----------------------+----------+----------+------------+

参考文献(在更新日期:2014年9月4日):
- SHOW PROFILE语法
-
INFORMATION_SCHEMA信息PROFILING表
- 如何使用MySQL查询剖析( 数字海洋最近公布的关于此问题的大文章。




 类似资料:
  • 问题内容: 这不是连接超时,因为与数据库的连接正常。问题是我正在调用的存储过程花费的时间超过30秒,并且会导致超时。 该函数的代码如下所示: ExecuteScalar调用正在超时。如何延长此功能的超时时间? 对于快速存储过程,它可以正常工作。但是,其中一个功能需要一段时间,并且调用失败。当以这种方式调用ExecuteScalar函数时,我似乎找不到任何延长超时时间的方法。 问题答案: 如果您正在

  • 问题内容: 我有一个表,其中有两列开始时间和结束时间。我能够计算每一行的持续时间,但我也想获得总持续时间。这该怎么做。 谢谢 问题答案: 您的列的数据类型为TIMESTAMP,如下所示: 从一个时间戳减去另一个时间戳会导致一个INTERVAL数据类型: 并且不能对INTERVAL数据类型求和。这是一个令人讨厌的限制: 为了规避此限制,您可以使用秒数进行转换和计算,如下所示: 然后它们是可以累加的普

  • 问题内容: 目前,我的代码(PHP)中包含太多SQL查询。例如… 我正在研究使用存储过程来减少这种情况并使事情变得更健壮,但是我有一些担忧。 我在网站上使用了数百种不同的查询,其中许多非常相似。将所有这些查询从上下文(使用结果的代码)中删除并放在数据库的存储过程中时,我应该如何管理这些查询? 问题答案: 最佳的操作方法取决于您如何进行数据访问。您可以采用三种方法: 使用存储过程 将查询保留在代码中

  • 问题内容: 今天,我遇到了一个有趣的SQL问题,尽管我想出了一个行之有效的解决方案,但我怀疑这是最佳还是最有效的答案。在这里,我请专家- 帮助我学习一些知识并改善查询条件!RDBMS是SQL Server 2008 R2,查询是SSRS报告的一部分,该报告将针对约100,000行运行。 本质上,我有一个ID列表,该ID可能具有多个与之关联的值,这些值是Yes,No或其他字符串。对于ID x,如果任

  • 我想在JPA 2.1中将“命名查询”转换为“SQL查询”,并在运行之前对其进行更改。 例如,我有一个命名查询:从CU所在的客户中选择CU。代码=?1,我希望在PAR之后获得查询并对其进行转换和编辑(例如添加模式名称)并创建此查询:从db1.cc1cust cu中选择*其中cu.cc1cod=?1. 我该怎么做? 问候

  • 问题内容: 如何为此操作创建超时:? 问题答案: 我相信正确的方法将是这样的: 当然,这是我使用Oracle的地方,但是我希望这可以给您一个想法。