0

4.000.000レコードのテーブルが1つあります。

男性メンバーを選択するために単一のクエリを実行したい

SELECT * FROM member WHERE gender='0' ORDER BY member_id DESC LIMIT 0,20;

このクエリを実行するのに12秒かかりました。私はすでにgender、member_idフィールドを持つINDEXを持っています。0:オス1:メス

Keyname Type    Unique  Packed  Field   Cardinality
gender  BTREE   No  No  gender  2

だから、どうすればこのクエリをスピードアップできますか:(

4

3 に答える 3

2

2 つのフィールドを持つインデックスが必要です: 性別、メンバー ID DESC

これにより、数分の 1 秒まで高速化されるはずです。

SQL コマンド:

ALTER TABLE  myTable ADD INDEX (  `gender` ,  `memcber_id` DESC )
于 2012-10-10T17:48:18.810 に答える
1

インデックスを作成してみてくださいmember_idのカーディナリティが低いgenderということは、その列のインデックスが役に立たないことを意味します。WHEREただし、句に追加のフィルターを追加できない限り、これは何があってもクエリが遅くなる可能性があります。

詳細については、次を参照してください:優れた MySQL インデックスの条件とは? パート 2: カーディナリティ

于 2012-10-10T17:51:43.613 に答える
0

これだけ時間がかかるはずです。一度に 100K 行のみをスキャンして、その一部をスキャンしてみませんか (制限を使用しないでください。これは役に立ちません)。日付ごとに分割することもできます(インデックスが作成されます)。

チャックを使用する必要があります。いずれにせよ、一度にすべてを必要とするわけではありません。また、キー/重要なデータ用に十分な RAM がない場合もあります。これが今日書いた実際のコードです

var offsetStep=5000;
for(int offset=0; offset<countOrMax; offset+=offsetStep)
{
    using (var tns = conn.BeginTransaction())
    {
        var res = conn.Query<long>("select id from table1 where id>=@l and id<@u and t=@t", new { u = offset + offsetStep, l = offset, t = blah });
        //work with chuck
于 2012-10-10T18:22:29.750 に答える