Mysql 中的基准函数(令人难以置信的结果)

xRo*_*bot 3 mysql database benchmarking

我有2张桌子:

拥有 3 百万行的作者。

预订 20 英里的行。

.

所以我用连接对这个查询进行了基准测试:

SELECT BENCHMARK(100000000, 'SELECT book.title, author.name
FROM `book` , `author` WHERE book.id = author.book_id ')
Run Code Online (Sandbox Code Playgroud)

这是结果:

查询耗时 0.7438 秒

使用连接进行 1 亿次查询仅需要 0.7438 秒???

我犯了一些错误还是这是正确的结果?

Mic*_*ael 5

你的结果闻起来不对,我刚刚检查了文档并运行了我自己的一些基准测试。你实际上并没有对任何东西进行基准测试。

BENCHMARK() 用于测试标量表达式,而不是用于测试查询运行时。查询实际上并没有被执行。在我自己的查询测试中,所用的持续时间与查询的复杂性完全无关,只与要运行的试验数量有关。

看看http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_benchmark

来自文档的一些引用:

“BENCHMARK() 用于测量标量表达式的运行时性能,”

"只能使用标量表达式。虽然表达式可以是子查询,但它必须返回单列,最多单行。例如,如果表 t 有 BENCHMARK(10, (SELECT * FROM t)) 将失败不止一列或不止一行。”

除了绝对大多数查询计划人员的时间之外,您实际上并没有测量任何东西。

如果您想运行基准测试,则可能值得从应用程序代码中执行此操作(并且可能使用无缓存指令,具体取决于您的生产环境的写入量。)。从应用程序代码执行此操作还将计算水合数据的时间,以及通过线路发送数据的成本等。

  • 我向你保证你没有执行/基准测试。首先执行:“SET SESSION query_cache_type = OFF;”,然后执行“select sleep(10) from book limit 1”,这需要10秒。然后执行“select benchmark('select sleep(10) from book limit 1');”,这将立即返回(或至少在我的 MySQL 上执行。查看文档,BENCHMARK() 根本没有设计为了这。 (4认同)