在mysql中测试查询的性能

Unr*_*son 26 mysql testing performance

我正在尝试设置一个脚本来测试开发mysql服务器上的查询性能.这里有更多细节:

  • 我有root权限
  • 我是访问服务器的唯一用户
  • 对InnoDB性能最感兴趣
  • 我正在优化的查询主要是搜索查询(SELECT ... LIKE '%xy%')

我想要做的是创建可靠的测试环境来测量单个查询的速度,而不依赖于其他变量.

到现在我一直在使用SQL_NO_CACHE,但有时这些测试的结果也显示缓存行为-以更长的时间在第一次运行执行,并采取更少的时间在后续运行.

如果有人能够详细解释这种行为,我可能会坚持使用SQL_NO_CACHE; 我相信这可能是由于文件系统缓存和/或用于执行查询的索引的缓存,正如本文所解释的那样.当缓冲池和密钥缓冲区失效或者它们如何干扰测试时,我不清楚.

因此,如果没有重新启动mysql服务器,您会如何建议设置一个可靠的环境来确定一个查询是否比另一个更好?

new*_*ver 63

假设您无法优化LIKE操作本身,您应该尝试优化基本查询,而不会最小化应检查的行数.

一些可能对此有用的事情:

rowsEXPLAIN SELECT中的列...结果.然后,

mysql> set profiling=1;
mysql> select sql_no_cache * from mytable;
 ...
mysql> show profile;
+--------------------+----------+
| Status             | Duration |
+--------------------+----------+
| starting           | 0.000063 |
| Opening tables     | 0.000009 |
| System lock        | 0.000002 |
| Table lock         | 0.000005 |
| init               | 0.000012 |
| optimizing         | 0.000002 |
| statistics         | 0.000007 |
| preparing          | 0.000005 |
| executing          | 0.000001 |
| Sending data       | 0.001309 |
| end                | 0.000003 |
| query end          | 0.000001 |
| freeing items      | 0.000016 |
| logging slow query | 0.000001 |
| cleaning up        | 0.000001 |
+--------------------+----------+
15 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

然后,

mysql> FLUSH STATUS;
mysql> select sql_no_cache * from mytable;
...
mysql> SHOW SESSION STATUS LIKE 'Select%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Select_full_join       | 0     |
| Select_full_range_join | 0     |
| Select_range           | 0     |
| Select_range_check     | 0     |
| Select_scan            | 1     |
+------------------------+-------+
5 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

另一个有趣的值是last_query_cost,它显示了优化器估计查询的成本(值是随机页面读取的数量):

mysql> SHOW STATUS LIKE 'last_query_cost';
+-----------------+-------------+
| Variable_name   | Value       |
+-----------------+-------------+
| Last_query_cost | 2635.399000 |
+-----------------+-------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

MySQL文档是你的朋友.