1

PHPでMysqlにPDOを使用すると、本当に奇妙な問題が発生します。

約30,000行のテーブルがあります。

このクエリを実行しようとすると、次のようになります。

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

(作り方)

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で同じクエリを実行すると、1秒もかかりません。

奇妙な部分は、以下のこのクエリがPDOを介して1秒未満かかることです。

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);

複数の名前を検索するのに約0.4秒しかかからないのに、1つの「名前」を検索するのに10秒かかるのはなぜですか。

編集:プロットが厚くなります。パラメータ化されたステートメントを削除し、検索するテキストをハードコーディングしました

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

PDOでクエリを実行するのに0.000384092330933秒かかります!!

しかし

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

PDOでクエリを実行するのに11.00254秒かかります!!

4

1 に答える 1

3

遅いとは、通常、インデックスが必要であることを意味します。にmax()関数があるようcard_data.set_orderです。これは、データベースが最大のものを見つけるためにすべてのレコードを調べる必要があることを意味します。

そのフィールドにインデックスがあるかどうかを確認します。そうでない場合は、1つ追加して、それが改善されるかどうかを確認します

于 2012-05-18T12:36:08.963 に答える