0

私は Godaddy でホストされており、彼らは私が持っている理解できるクエリに適合しています。このクエリを書き直すためのより良い方法があるかどうか疑問に思っています。リソースを使いやすくする必要があります。

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

私は100万行を超えており、重複があるため、テーブルなどを変更するのではなく、重複を出力して削除する小さなスクリプトを作成しました.

助けてください。

4

3 に答える 3

4

clientid と callerid に個別のインデックスがあると、MySQL は 1 つのインデックスのみを使用するか、場合によってはインデックス マージを試みます (MySQL 5.0 以降)。これらはどちらも、複数列のインデックスを持つほど効率的ではありません。

calleridと列の両方に複数列インデックスを作成すると、 clientidCPU とディスク IO リソースが軽減されますが (テーブル スキャンなし)、ディスク ストレージと RAM の使用量が増加します。試してみて、Godaddy がそれを好むかどうかを確認してください。

于 2012-04-17T00:00:46.517 に答える
1

私が最初に試みることは、 clientid 列にインデックスがあることを確認してから、最初に clientid を探すようにクエリを書き直すことです。これにより、クエリを高速化する考慮事項から行が削除されます。また、Marcus が述べたように、複数列のインデックスを追加すると高速になりますが、mysql はインデックスを左から右に読み取るため、(clientid, callerid) として追加することを忘れないでください。

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

clientid 値から引用符を削除したことに注意してください。これは int データ型である必要があるためです。そうでない場合は、int データ型への変換も高速になるはずです。また、LIKEワイルドカード演算子なしで a を実行している理由がわかりません。それを an=に変更することもできます。

于 2012-04-17T00:06:57.647 に答える
1

私はマーカスの答えが好きですが、最初に だけcalleridで単一のインデックスを試してみ16602158641ます. それほど多くはないため、シングル インデックスはダブル インデックスのパフォーマンスに匹敵するか、それを超える可能性があります。

また、削除LIKEして使用します=

SELECT count(*) as count
FROM aaa_db
WHERE callerid = '16602158641' -- equals instead of like
AND clientid = '41'
于 2012-04-17T00:23:14.530 に答える