2012-07-17 95 views
0

即時消息在這兩種方法中最有效的方法之一。MySQL/PHP查詢性能?

假設您有查詢連接多個表和查詢上千條記錄。比起來,你必須在所有這些結果中得到總分。

它快嗎?

1)做一個完整的選擇(假設你必須選擇50的列),對行進行計數並且運行另一個帶有限制的查詢? (MySQL緩存是否可以幫助您選擇第一個查詢所需的所有列)

2)首先使用COUNT函數執行查詢,然後執行查詢來選擇您需要的結果。

3)不使用MySQL COUNT函數,而是使用查詢選擇ID的例子並使用PHP函數mysql_num_rows?

  • 我認爲數字2是最好的選擇,使用內置COUNT函數的MySQL,但我知道MySQL使用緩存,所以,選擇第一個查詢的所有結果會更快?

感謝,

+0

關於查詢緩存:它不會幫助你。 MySQL查詢緩存非常簡單;它所做的只是返回完全相同的結果集,如果您進行完全相同的查詢。改變查詢的任何內容,即使它只是所請求的列或LIMIT,都會使它再次運行整個事情。 – duskwuff 2012-07-17 23:33:07

回答

1

看一看Found_Rows()

一個SELECT語句可能包括LIMIT子句限制行服務器返回給客戶端的數量 。在某些情況下,需要知道該語句在沒有LIMIT的情況下返回 的行數,但不需要再次運行該語句,則需要 。爲了獲得這個 行數,包括在SELECT 語句SQL_CALC_FOUND_ROWS選項,然後調用FOUND_ROWS()後:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

第二個SELECT返回一個數字,表示有多少行第一SELECT` 將有如果沒有LIMIT條款,則返回。

+0

請注意,添加SQL_CALC_FOUND_ROWS會顯着減慢某些查詢的速度(因爲它可能會強制服務器運行查詢以完成操作,而不是僅返回第一個匹配的行)。 – duskwuff 2012-07-17 23:16:19

+0

^同意(但如此將檢索計數(),然後執行實際(限制)查詢)。也不是說這不會提高與其他RDBMS的兼容性,因爲這是MySQL特定的。在性能上:[這裏](http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/)是一篇探索性能問題的文章。 – RobIII 2012-07-17 23:17:22

+0

這似乎是一個很好的選擇。謝謝。你知道它是否會比我提供的解決方案更快? – Henrique 2012-07-17 23:42:06

0

我的猜測是2號,但事實是,它完全取決於數據的大小,表,索引,MySQL版本等

找到答案的唯一途徑這是爲了嘗試每一個,並衡量他們需要多長時間。但就像我說的,我的預感是2號。