2010-02-27 65 views

回答

3

我不認爲這兩個查詢之間會有太大的區別:區別在於選擇一個字段(這是索引的一部分)在第二種情況下,並在第一行計算一行......沒有太大區別。

不過,出於好奇,我在我的電腦上的數據庫上做了一個非常快速的基準查詢。- 請注意,帖子表中只有7行,所以可能不是這樣接近真實情況,但是因爲id上有一個PK,這意味着一個索引...

這裏就是我的了:

mysql> select benchmark(10000000000, 'select sql_no_cache id from post where id = 1'); 
+-------------------------------------------------------------------------+ 
| benchmark(10000000000, 'select sql_no_cache id from post where id = 1') | 
+-------------------------------------------------------------------------+ 
|                  0 | 
+-------------------------------------------------------------------------+ 
1 row in set (1 min 0,25 sec) 

mysql> select benchmark(10000000000, 'select sql_no_cache count(1) from post where id = 1'); 
+-------------------------------------------------------------------------------+ 
| benchmark(10000000000, 'select sql_no_cache count(1) from post where id = 1') | 
+-------------------------------------------------------------------------------+ 
|                    0 | 
+-------------------------------------------------------------------------------+ 
1 row in set (1 min 0,23 sec) 

所以,真的沒有太大的差別,似乎^^

0

第二條語句是可能更快。但出於實際的目的,差異將可以忽略

1

雖然Pascal是正確的在他的簡歷,他的例子是錯誤的。

benchmark(10000000000, 'select sql_no_cache id from post where id = 1') 

上述語句對字符串聲明,而不是在SELECT語句本身。爲BENCHMARK功能的正確語法是:

benchmark(10000000000, (select sql_no_cache id from post where id = 1)) 

此外,至少在MySQL 5.5.22,在一個錯誤提供的基準測試結果的聲明使用SQL_NO_CACHE:

mysql> SELECT BENCHMARK(1000000000,(SELECT SQL_NO_CACHE COUNT(1) FROM players WHERE id=1)); 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'COUNT(1) FROM players WHERE id=1))' at line 1 
mysql> SELECT BENCHMARK(1000000000,(SELECT SQL_NO_CACHE id FROM players WHERE id=1)); 
ERROR 1054 (42S22): Unknown column 'SQL_NO_CACHE' in 'field list' 

然而,使用實際語句,40000記錄表和查詢緩存關閉的實驗證實COUNT的工作速度比檢索ID快一點,即使差異可能被忽略。

mysql> set query_cache_type=0; 
Query OK, 0 rows affected (0.00 sec) 
mysql> SELECT SQL_NO_CACHE benchmark(1000000000,(SELECT id FROM test WHERE id=1)); 
+-----------------------------------------------------------+ 
| benchmark(1000000000,(SELECT id FROM players WHERE id=1)) | 
+-----------------------------------------------------------+ 
|               0 | 
+-----------------------------------------------------------+ 
1 row in set (23.17 sec) 

mysql> SELECT SQL_NO_CACHE benchmark(1000000000,(SELECT COUNT(1) FROM test WHERE id=1)); 
+-----------------------------------------------------------------+ 
| benchmark(1000000000,(SELECT COUNT(1) FROM players WHERE id=1)) | 
+-----------------------------------------------------------------+ 
|                0 | 
+-----------------------------------------------------------------+ 
1 row in set (22.50 sec) 
相關問題