2012-05-18 17 views
1

我有一個真正的奇怪的問題使用PDO的Mysql在PHP中。PDO PHP的Mysql緩慢的特定查詢

我有一張約30,000行的表格。

如果我嘗試和運行此查詢:

SELECT card_data.name,MAX(card_data.set_order)FROM card_data, theme_decks WHERE card_data.name = '魔力流失' 和card_data.enabled = 1 GROUP BY card_data.name ORDER BY card_data.name

(其如何製造)

SELECT card_data.name, max(card_data.set_order) FROM card_data, theme_decks 
WHERE card_data.name = ? and 
card_data.enabled = 1 GROUP BY card_data.name ORDER BY card_data.name ASC 

$paramArray = array("Mana Leak"); 
$sth->execute($paramArray); 

通過PDO它需要大約10秒執行!然而,如果我運行phpMyAdmin的,雖然它需要不到一秒鐘相同的查詢..

怪異的一部分是低於這個查詢會比第二個雖然PDO少:

SELECT card_data.name, max(card_data.set_order) FROM card_data, theme_decks WHERE 
(card_data.name = 'Extraplanar Lens' OR card_data.name = 'Mana Leak' OR card_data.name = 
'overgrowth') and card_data.enabled = 1 GROUP BY card_data.name ORDER BY card_data.name ASC 

(其如何製造)

SELECT card_data.name, max(card_data.set_order) FROM card_data, theme_decks WHERE 
    (card_data.name = ? OR card_data.name = ? OR card_data.name = 
    ?) and card_data.enabled = 1 GROUP BY card_data.name ORDER BY card_data.name ASC 

    $paramArray = array("Extraplanar Lens","Mana Leak","overgrowth"); 
    $sth->execute($paramArray); 

我不能爲我的生活鍛鍊爲什麼一個單一的「名」搜索將多個名稱搜索時,需要10秒只需要大約一秒鐘的0.4 ...

編輯:情節變厚。我刪除了參數化的語句和硬編碼的文本搜索

SELECT card_data.name, max(card_data.set_order) FROM card_data, theme_decks WHERE 
card_data.name = Mana Leak and card_data.enabled = 1 GROUP BY card_data.name ORDER BY 
card_data.name ASC 

讚賞0.000384092330933秒與PDO查詢!

BUT

SELECT card_data.name, max(card_data.set_order) FROM card_data, theme_decks WHERE 
card_data.name = 'Mana Leak' and card_data.enabled = 1 GROUP BY card_data.name ORDER BY 
card_data.name ASC 

注意到11.00254秒到與PDO查詢!!

+0

您的表card_data.name中是否有任何字段? –

+0

對不起,我不明白你的意思?該字段是表中的名稱card_data – james

+0

出於興趣,如果您將查詢存儲在存儲過程中並通過PDO和PHPMyAdmin運行,您是否得到相同的延遲? – Gavin

回答

3

慢通常意味着您需要索引。我看到你在card_data.set_order上有一個max()函數。這意味着你的數據庫必須經過每一個記錄才能找到最大的記錄。

查看該字段是否有索引。如果沒有,請添加一個,看看是否有所改善

+0

添加索引完美運作!非常感謝。雖然我仍然有點困惑,爲什麼搜索一個單一的「名稱」和搜索多個名稱之間的差異幾乎是300倍! – james

+0

我實際上已將索引添加到名稱字段中,這是什麼修復它。只需重新閱讀您所說的內容,並建議將其添加到card_data.set_order字段中? – james

+0

是的,通常在WHERE子句中使用一個字段應該響起索引鍾。但MAX()是一個必須遍歷每條記錄才能找到最大函數的函數。您可以在phpmyadmin中運行「EXPLAIN SELECT ....」以確定查詢的效率並查看我的意思 –