2012-04-16 5 views
0

私はGodaddyでホストされており、彼らは私にわかりやすいクエリを与えてくれています。私はそれが友好的資源にする必要があり、このクエリを書き換えについて移動する良い方法がある場合、私は疑問に思って:より良いクエリを選択するカウント

SELECT count(*) as count 
FROM 'aaa_db' 
WHERE 'callerid' LIKE '16602158641' AND 'clientid'='41' 

私は100万人以上の行を持っている、との重複はので、私は出力に重複を小さなスクリプトを書いていますテーブルを変更するのではなく削除してください。

助けてください。

+1

あなたは 'clientid'と' callerid'にインデックスを持っていますか?あなたのデータは '' LIKE'の代わりに '='を使用するのに十分な形で整えられていますか? – grossvogel

+0

MySQLは何百万ものレコードでうまくやっていないので、アーカイブしてみてください。 –

+1

aaa_dbの主キーは何ですか? callerid列とclientid列の列の種類は何ですか? –

答えて

4

clientidとcalleridで別々のインデックスを使用すると、MySQLはインデックスを1つだけ使用したり、場合によってはインデックスのマージ(MySQL 5.0+)を試みます。これらのどちらもマルチカラムインデックスを持つほど効率的ではありません。

calleridclientidの両方の列に複数列のインデックスを作成すると、CPUとディスクのIOリソース(テーブルスキャンなし)が軽減されますが、ディスクの記憶域とRAMの使用量が増加します。私はあなたがそれを撃つことができ、Godaddyがそれを他のものよりも好むかどうか見ることができると思います。

+1

マーカスは正しいです。しかし、なぜ 'callerid'カラムにマッチさせるために' LIKE'を使用しているのか把握してください。私はGoDaddyでホストされていることは関係ありませんが、あなたのmySQLインスタンスを非常に少量のメモリに制限しない限り、そうは思いません。 –

+0

こんにちは、aaa_dbの私のインデックスは、calleridとclientidを一意にしています... Godaddyには、無制限のすべてのものを持ち、パッケージをホスティングしている同時接続が600個ある新しいホスティングパッケージがあります。しかし、この行を実行するだけで、私のアカウントはシャットダウンされることになってしまいます。 – thevoipman

1

最初に私が試みるのは、あなたがclientid列にインデックスを持っていることを確認してから、最初にclientidを探すようにクエリを書き直すことです。また、Marcusが述べたように、マルチカラムインデックスを追加する方が高速ですが、mysqlがインデックスを左から右に読み込むので、(clientid、callerid)として追加することを忘れないでください。

SELECT count(*) as count 
FROM aaa_db 
WHERE clientid = 41 and callerid LIKE '16602158641'; 

お知らせそれがない場合は、データ型をintに変換することも速くする必要があり、intデータ型でなければなりませんように私は、ClientID値から引用符を削除しました。また、LIKEをワイルドカード演算子なしで使用している理由がわからない場合は、=に変更すると便利です。

+1

+1左から右に使用されているインデックスについての良い点。それは何かを考慮する。 LIKE値が定数(ワイルドカードなし)なので、索引の順序は問合せで順序付けされる方法に関してはここでは重要ではありませんが、 '='と '' LIKE''は関係ありませんが、カーディナリティー(ほとんどの一意性)は、パフォーマンスを向上させるために、索引の先頭にある必要があります。LIKEでワイルドカードが使用される可能性がある場合は、常に使用できるように、clientID sholdが必ず最初のインデックスになるようにしてください。範囲でインデックスの使用を無効にするので、範囲が最も適切であるはずです。 –

+0

@MarcusAdams:入力いただきありがとうございます。私の経験では、クエリが遅いクエリに変換する非intデータ型(おそらくvarchar)としてcalleridの設定を持っていると思われます。それでは、注文が依然として問題ではない異種のデータ型があるとしますか? –

+0

マイク、今あなたは私を困らせてしまった。それは私が知らないものです。私はいつもカーディナリティが型を上回っていると思っています:) –

1

私はMarcusの回答が好きですが、16602158641のような値で100万のうちどれだけ一致する可能性があるので、最初にcalleridで1つのインデックスを試してみますか?それほど多くないので、単一の索引は倍精度索引のパフォーマンスと同じかそれを超えることができます。

また、LIKEを削除し、=を使用します。

SELECT count(*) as count 
FROM aaa_db 
WHERE callerid = '16602158641' -- equals instead of like 
AND clientid = '41' 
+1

私は同意します。これは行く方法かもしれない。それを試してみてください。ここでのパフォーマンスの向上は、より速く読み込まれ、メモリを消費する小さなインデックスから発生します。 –

+0

ありがとう。私はこれを試み、Godaddyが何かを言うかどうか見る。 – thevoipman

関連する問題