2011-10-20 15 views
0

私は数億行のテーブルを持っています。列の1つは`status` varchar(10)です。2つの同じ列を持つMySQLインデックス

ステータスのほとんどの値は1文字ですが、値は10までです。ただし、値のサブセットには独自のパターンがあります。ステータス値の全体のグループは、1文字の先頭に「c」が続き、0から10,000までの数字が続きます。

私は、インデックスに次で、このコラムをしたいと思います:

ALTER TABLE tbl ADD KEY (status(1), status); 

これは、2つの個々のキー、status(1)上の1(全体の列の最初の文字)と第二statusを持つよりも良いだろう。一緒に彼らは常により速くなります。

しかしMySQLは、そのようなを作成するから私を禁止:

ERROR 1060 (42S21): Duplicate column name 'status' 

どのように私はこの問題を解決することができますか?

答えて

1

statusとは別にstatus(1)をインデックスする理由はありません。 statusに作成された1つのインデックスは、両方の状況を同じように処理する必要があります。

+0

電話帳の個々の名前のインデックスがあるような私にとっては、索引をデータベースとして検索するのにかなりの時間がかかります。これは間違った考えですか? – Mikhail

+0

@Mikhailはい、その考え方は間違っています。どのようにフォーマットされているかとは無関係に、 'status'の検索はインデックスを利用することができます。 –

+0

私はそれがそれを利用できることを理解します。あなたが言っていることは、最初のキャラクターを見上げることです、そして、残りの価値はそれほど速くはありませんか? – Mikhail

1

テーブルに2番目の列を作成し、もう1つの列の最初の文字を入力して、それぞれにインデックスを作成することができます。しかし、これは選択性に乏しく、そのすべてが有用であるとは限りません。

+0

私はそれについて考えましたが、この新しい列を利用するためには、これを使用するすべてのコードを書き直さなければならないでしょう。 – Mikhail

+1

''%c ''のようなタイプを選択している場合、それらが一緒に発注されるときに別々の指標となる。しかし、最後の文字を検索したい場合は、2番目の列を分割するようなものが便利かもしれません。なぜなら、 'like'の先頭に%を使用すると、項目の' ALL'を走査する必要があるからです。 – Poodlehat

関連する問題