2017-08-25 10 views
0


私は10列のテーブルを持って、それは約800万行が含まれています。私はこの表で統計的に仕事をしています。問題は、IDが大きくなり、選択クエリがより遅くなったときに、より多くの時間を実行するときです。ここ
はクエリです:
大量の行のMySQLのクエリの選択を遅く

select * from transaction 
where id > :pointer 
AND col_a = :col_a 
AND col_b >= :from 
order by id ASC limit 5000 

クエリ内の3つのフィールドの両方がインデックスを作成されています。
各ループの後、新しいポインタ値でクエリを再実行します。ポインタの値は前の結果セットの最後の行のidです。OFFSETは使用しません。 最後に、このクエリを使用してスクリプトを実行するのに半分かかりました。
このパフォーマンスの問題を解決するにはどうすればよいですか。

+0

どの言語/環境からクエリを実行していますか? –

+0

LIMITを取り除いて、WHERE句に移動できますか?id>:pointer AND id <=:pointer + 5000? –

+0

注文を避けるチャンスがありますか? – Patrick

答えて

1

クエリ内の3つのフィールドのどちらも、MySQLがクエリでテーブルごとに1つだけのインデックスを使用することができ、インデックス

を作成されています。フィールドごとに別々のインデックスを作成した場合、MySQLはそれらのうちの1つだけを使用して、すべてを高速化することはできません。

id, col_a, col_bフィールドに(この順序で)複数列インデックスを作成します。このようにして、whereの条件との3つの条件をすべて満たす単一のインデックスを使用することができます。

各ループの後、私は新しいポインタ値を再クエリを実行します

あなたのコードは、あなたがparametrisedクエリのいくつかの種類を使用することを示唆しているが、それは適切なMySQLの準備文であれば、我々は判断できません。そうでない場合は、このプロセスにMySQLのprepared statementを使用することを検討してください。

ループの前にクエリを準備し、ループ内でパラメータを調整してから、準備された文を再度実行します。このようにして、MySQLはコードがループする毎回ではなく、一度だけクエリを解析します。

+0

ご回答ありがとうございますが、マルチカラムインデックスを追加すると違いはありません – carboncrystal

+0

SHOW CREATE TABLEトランザクションを追加し、SHOW INDEX FROMトランザクションを追加することができれば誰かが助けてくれる可能性があります。 –