2010-02-24 78 views
0
  1. 以下3個查詢中的哪一個會更快?爲什麼?
  2. 我在我的應用程序中使用了很多其他連接的查詢。那麼有什麼辦法可以衡量他們的速度嗎?如果是的話,你能提一下它是什麼嗎?

查詢1:php&mySQL:以下哪項查詢速度更快?爲什麼?

$q = "SELECT COUNT(books.id) FROM books 
INNER JOIN books_type ON books.id = books_type.id 
WHERE books_type.book_type = 'Comedy'"; 

問題2:

$q = "SELECT COUNT(*) FROM books 
INNER JOIN books_type ON books.id = books_type.id 
WHERE books_type.book_type = 'Comedy'"; 

問題3:

$q = "SELECT books.id FROM books 
INNER JOIN books_type ON books.id = books_type.id 
WHERE books_type.book_type = 'Comedy'"; 

$books_count = mysql_num_rows($q); 

謝謝。

回答

2

你可以試試EXPLAIN query_here找出答案。

例如:

EXPLAIN SELECT books.id FROM books 
INNER JOIN books_type ON books.id = books_type.id 
WHERE books_type = 'Comedy' 

這會給你的每個查詢,以及它們如何進行的一些信息。有關EXPLAIN語句的MySQL手冊中的更多信息:

「當您在關鍵字EXPLAIN之前的SELECT語句之前,MySQL顯示來自優化程序的關於查詢執行計劃的信息,也就是說,MySQL將解釋如何處理SELECT ,其中包括有關如何聯接表及順序」信息

http://dev.mysql.com/doc/refman/5.0/en/using-explain.html

我還建議本教程在數據庫日誌優化的MySQL查詢:

http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing-MySQL-Queries-and-Indexes.htm

1

即使您可以輕鬆地自行測試它,here's這篇文章將介紹原因。據說,第二個應該是最快的。

+0

+1謝謝你的參考。 – Devner 2010-02-24 09:13:21

+0

該文章沒有解釋Count()對連接的行爲。雖然'Count(*)'和'Count(books.id)'在這種情況下具有不同的含義,它們具有相同的結果。由於'INNER JOIN ... ON books.id = books_type.id',因此不會有is_null(books.id)結果。 – VolkerK 2010-02-24 09:29:51

+0

在這種情況下,它們確實具有相同的結果。由於books.id是主鍵(我假設),mysql不必檢查所有行是否爲NOT NULL。 雖然行爲是相同的計數(*)仍然更好。它意在計算行數,這就是你想要做的。 – douwe 2010-02-24 12:20:57