2010-05-02 63 views
2

我有2個表格:Mysql中的基準函數(令人難以置信的結果)

作者擁有3百萬行。

20英里行的書。

所以我一直基準這個查詢與聯接:

SELECT BENCHMARK(100000000, 'SELECT book.title, author.name 
FROM `book` , `author` WHERE book.id = author.book_id ') 

這是結果:

查詢花費0.7438秒

ONLY0.7438秒爲100百萬的查詢與聯接???

我犯了一些錯誤還是這是正確的結果?

回答

3

你的結果聞錯了,我剛剛運行了檢查文檔並運行了我自己的一些基準測試。你實際上沒有對任何事物進行基準測試

BENCHMARK()用於測試標量表達式,它不用於測試查詢運行時。該查詢並未實際執行。在我自己對查詢的測試中,查詢的持續時間與查詢的複雜性無關,僅與要運行的試用量有關。

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

從文檔的一些報價:

「BENCHMARK()是用於測量標量表達式的運行時性能,」

「只有標量表達式可以雖然表達式可以是一個子查詢,但它必須返回一列,最多隻有一行。例如,如果表t有多列或更多列,BENCHMARK(10,(SELECT * FROM t))將失敗比一排「。

你實際上並沒有測量任何東西,絕對不是絕大多數查詢計劃者的時間。

如果要運行基準測試,可能需要從應用程序代碼中完成測試(並且根據您的prod環境的寫入情況,可能使用無緩存指令)。在應用程序代碼中執行此操作時也會計算出水合數據的時間,以及通過線路發送數據的成本等。

+0

我執行了此查詢: SELECT BENCHMARK(100000000,'SELECT book.title,作者姓名 和我有相同的結果 – xRobot 2010-05-02 09:34:13

+3

我向你保證你是我的書,沒有執行/基準測試。首先執行:「SET SESSION query_cache_type = OFF;」,然後執行「從書籍限制1中選擇睡眠(10)」,這將需要10秒鐘。然後執行「select benchmark('select sleep(10)from book limit 1');」,這將立即返回(或者至少在我的MySQL上執行)看看文檔,BENCHMARK()根本沒有設計爲了這。 – Michael 2010-05-02 09:50:06

相關問題