2017-10-13 3 views
0

これはインタビューの際に出た質問です。MySQLデータベース内の単一の列インデックスのスペースに複数の列をインデックスする方法

は、あなたが列を含むデータベースを与えられていると仮定します。 "payload_data"、および "TIME_STAMP"、 "をROW_ID"。しかし、一度に1つの列のインデックスしか保持することはできません。

"row_id"と "time_stamp"の両方のインデックスを保持する方法はありますか?

+0

これは意味をなさない。おそらくインタビュアーはあなたよりも知識があまりなかったでしょう。 –

答えて

2

私は質問が「スマート」になるはずと期待される答えはあったと思う:

row_idテーブルの主キーを作成し、time_stampにインデックスを作成します。

このようにして、このテーブルにはインデックスが1つだけ追加されます。とにかく、主キーが必要とされ、作成されます。

テーブルには2つのインデックスがあり、私の意見では、これは質の低いインタビューの質問です。

2

明らかに人工的な要件です。なぜなら、複数列のインデックスを避ける理由がないからです。

解決策の1つは、row_idを連結してtime_stampを連結し、仮想列をインデックスする仮想列を作成することです。

CREATE TABLE `artificial` (
    `row_id` int NOT NULL, 
    `time_stamp` timestamp NULL DEFAULT NULL, 
    `payload_data` text, 
    `row_id_time_stamp` varchar(20) 
     GENERATED ALWAYS AS (concat(`row_id`,':',`time_stamp`)) VIRTUAL, 
    KEY `row_id_time_stamp` (`row_id_time_stamp`) 
) 

しかし、このインデックスはマルチカラムインデックスほど柔軟ではありません。両方の列を検索している場合は機能しますが、=を使用して特定のrow_id値を検索する場合は機能しません。言い換えれば

、このマルチカラムインデックスを使用することができる状態ではなく、連結インデックス:

... WHERE row_id = '1234' 

は、連結インデックスを使用するには、パターン、または連結を検索する必要があると思いますいずれか両方の列の値:

... WHERE row_id_time_stamp LIKE '1234:%' 
... WHERE row_id_time_stamp = '1234:2017-10-12 22:27:00' 

別の可能な解釈があるためInnoDBはセカンダリインデックスを実装する方法のためrow_idが主キーである場合、time_stamp上のセカンダリインデックスは暗黙のうちにrow_idが含まれていることです。だから、MySQL/InnoDBの内部をテストすることになるかもしれません。

+0

InnoDBがすべてのインデックス(隠しカラム)に 'PK'カラムを含むのは間違いですが、このようなインデックスを使用して' PK'カラムの値で検索することはできません。 – axiac

+0

はい、インデックスの一番左の列を使用する必要があります。しかし、もしあなたがtime_stamp *と* row_idの両方の検索語を持っていれば、それは依然としてインデックスのみのクエリとして修飾されます。 –

関連する問題