4

次の構造のテーブルがあります。

id bigNumber           text
1  1200321030011010233 "an item with some text"
2  1200321030011014563 "another item with some more text"
3  3120323434432211133 "more...."
.
.
.

このテーブルには、約 50,000 のレコードが含まれています。次のクエリを実行したいのですが、遅いです:

  SELECT COUNT(*), 
         bigNumber 
    FROM items 
GROUP BY substr(bigNumber, 1, X)

ここで、X は 2 から 19 まで変化します。

インデックスを使用できるようにするために、各列に数値の一部を含む 19 列を作成する方が速いでしょうか?

4

3 に答える 3

2

私は、19の別々の列の代わりに、おそらく3つまたは4つだけを、次のように提案します。

alter table items
add column bignumber_l1 char(1)
, add column bignumber_l3 varchar(3)
, add column bignumber_l6 varchar(6);

update items
set bignumber_l1 = left(bignumber, 1)
 , bignumber_l3 = left(bignumber, 3)
 , bignumber_l6 = left(bignumber, 6);

alter table items
add index bignumber_l1
, add index bignumber_l3
, add index bignumber_l6;

次に、xの長さの文字列をクエリする場合は、長くなることなく、一致するものが最も長いクエリを記述します。

  SELECT COUNT(*), 
         bigNumber 
    FROM items 
GROUP BY bignumber_l3, substr(bigNumber, 1, 4)

このクエリはインデックスを使用でき、パフォーマンスを大幅に向上させる可能性があります。テーブル全体を要求しているため、mysqlは、上記のインデックスを使用してもテーブルスキャンが必要であると判断する場合があり、FORCEINDEXを使用する必要がある場合があることに注意してください

于 2009-10-20T22:09:51.203 に答える
0

列を追加せずにインデックスを使用できます。bigNumber 列にインデックスを作成するだけです。

create index bignum_index on items (bigNumber);

varchar のインデックス (bigNumber は varchar ですよね?) を使用して、任意の文字列プレフィックスを検索できます。

とはいえ、クエリに答えるにはテーブル全体をスキャンする必要があるため、インデックスはそれほど役に立ちません。

于 2009-10-20T21:32:41.010 に答える
-1

あなたが探している結果は LIKE _X% だと思います。ただし、これはインデックスを使用しません。

SELECT count(*) FROM items WHERE bignumber LIKE "_2%"
SELECT count(*) FROM items WHERE bignumber LIKE "_19%"

_ は 1 文字を表します

% は任意の文字数を表します

詳細については、 MySQL のドキュメントを参照してください。

于 2009-10-20T21:27:39.320 に答える