1

次のような500K行のテーブルがあります: http: //d.pr/njFJ

ここに画像の説明を入力してください

このようなクエリは、2秒以上かかることがよくあります。

SELECT * 
FROM `alerts` 
WHERE `a_timestamp` > '2012-04-15' AND `a_timestamp` <= '2012-04-16'  
   AND a_company_id IN(64,65,69,70,71,72,73,74,75,76,83,86,106,108,109,116,148) ORDER BY a_id DESC

説明クエリは次のとおりです:http://d.pr/z20b

ここに画像の説明を入力してください

誰かが私が間違っていることを指摘できますか?多分私は何かが欠けています。こんな小さなテーブルでそんなに時間がかかるのでしょうか?

4

3 に答える 3

2

INKingFisher が述べたように、句 (通常はクエリ パフォーマンスのボトルネック) を取り除き、それを に置き換えJOINますが、一時テーブルは使用しないでください。これを行う方法は次のとおりです。

SELECT alerts.* FROM (
    (SELECT 64 AS id) UNION (SELECT 65) UNION (SELECT 69) UNION (SELECT 70)
    UNION (SELECT 71) UNION (SELECT 72) UNION (SELECT 73) UNION ...
) AS ids
INNER JOIN alerts ON (ids.id = alerts.a_company_id)
WHERE alerts.a_timestamp > '2012-04-15' AND alerts.a_timestamp <= '2012-04-16'
ORDER BY ids.id DESC

にインデックスがあることを確認してくださいa_company_id

于 2012-04-15T18:46:57.513 に答える
1

IN句を削除してみてください。テーブル全体をスキャンして値ごと IN clauseにパフォーマンスを低下させます。

inIDを格納するために一時テーブルを使用し、句を使用する代わりに一時テーブルでIDを使用してJOINを使用できます。

于 2012-04-15T18:36:02.700 に答える
1

(a_company_id, a_timestamp) にインデックスを作成してみてください... type_ts_company インデックスの逆順です。

于 2012-06-02T14:51:44.953 に答える