2013-09-30 61 views
0

我在那有成千上萬行的表運行的查詢:在運行PHP如何使MySQL查詢更快

$sql="select * from call_history where extension_number = '0536*002' and flow = 'in' and DATE(initiated) = '".date("Y-m-d")."' "; 

和其採取永遠返回結果。

的SQL本身

select * 
    from call_history 
    where extension_number = '0536*002' 
    and flow = 'in' 
    and DATE(initiated) = 'dateFromYourPHPcode' 

有沒有什麼辦法讓它運行得更快?我應該在哪裏DATE(initiated) = '".date("Y-m-d")."'之前extension_number哪裏條款?

或者我應該選擇所有行,其中DATE(initiated) = '".date("Y-m-d")."'並把它放在while循環中然後運行我所有其他查詢(where extension_number = ...) whthin while循環?

+6

數據庫101:使用EXPLAIN分析SQL查詢,並學習索引你的數據表 –

+0

,你能告訴我們的表結構? –

+0

這裏是一個屏幕截圖:http://postimg.org/image/ukfq9q785/ – user2710234

回答

1

以下是一些建議:

1)你想的唯一領域替換SELECT *

2)在要輸出的表格字段上添加索引。

3)避免在循環中運行查詢。這會導致對SQL Server的多個請求。

4)一次獲取所有數據。

5)在需要時應用LIMIT標籤。不要選擇所有記錄。

6)防火兩個不同的查詢:一個用於用於獲取每頁記錄數(計數記錄總數和其他例如10,20,50,等等)

7)如果適用,創建數據庫視圖並從它們而不是表中獲取數據。 謝謝

+0

什麼是對列,你沒有選擇的指標?索引應放在您排序或過濾的列上。 –

0

你應該添加索引到你的表。這樣MySql將獲取更快。我沒有測試,但命令應該是這樣的:

ALTER TABLE `call_history ` ADD INDEX `callhistory` (`extension_number`,`flow`,`extension_number`,`DATE(initiated)`); 
+0

我只看過在MySQL – user2710234

+0

沒有功能指標將整個數據庫唯一訪問 –

1

WHERE條款的順序與優化無關。

Pro-tip,也被別人建議:除非您有充足的理由這麼做,否則在程序 的查詢中絕對不要使用SELECT *。 「我不想寫出我需要的欄目名稱」並不是一個好的理由。始終枚舉您需要的列。當您需要的數據列表可用時,MySQL和其他數據庫系統通常可以以令人驚訝的方式優化事物。

您的查詢包含此選擇條件。

AND DATE(initiated) = 'dateFromYourPHPcode' 

注意,這個搜索標準的形式爲

FUNCTION(column) = value 

這種形式的搜索違背了使用該列的任何索引。您的initiated列的數據類型爲TIMESTAMP。試試這個:

AND initiated >= 'dateFromYourPHPcode' 
AND initiated < 'dateFromYourPHPcode' + INTERVAL 1 DAY 

這會發現所有在特定日期initiated項目。而且,因爲它並不在列值使用函數可以使用索引範圍掃描要做到這一點,它表現良好。它可能也可能不會幫助沒有索引。值得一試。

我懷疑你的這個特定的搜索理想的指數將

ALTER TABLE call_history 
    ADD INDEX flowExtInit (flow, extension_number, initiated) 

創建你應該問的數據庫管理員,如果您的查詢需要良好的性能添加此指數。