これはインタビューの際に出た質問です。MySQLデータベース内の単一の列インデックスのスペースに複数の列をインデックスする方法
は、あなたが列を含むデータベースを与えられていると仮定します。 "payload_data"、および "TIME_STAMP"、 "はをROW_ID"。しかし、一度に1つの列のインデックスしか保持することはできません。
"row_id"と "time_stamp"の両方のインデックスを保持する方法はありますか?
これはインタビューの際に出た質問です。MySQLデータベース内の単一の列インデックスのスペースに複数の列をインデックスする方法
は、あなたが列を含むデータベースを与えられていると仮定します。 "payload_data"、および "TIME_STAMP"、 "はをROW_ID"。しかし、一度に1つの列のインデックスしか保持することはできません。
"row_id"と "time_stamp"の両方のインデックスを保持する方法はありますか?
私は質問が「スマート」になるはずと期待される答えはあったと思う:
が
row_id
テーブルの主キーを作成し、time_stamp
にインデックスを作成します。
このようにして、このテーブルにはインデックスが1つだけ追加されます。とにかく、主キーが必要とされ、作成されます。
テーブルには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の内部をテストすることになるかもしれません。
InnoDBがすべてのインデックス(隠しカラム)に 'PK'カラムを含むのは間違いですが、このようなインデックスを使用して' PK'カラムの値で検索することはできません。 – axiac
はい、インデックスの一番左の列を使用する必要があります。しかし、もしあなたがtime_stamp *と* row_idの両方の検索語を持っていれば、それは依然としてインデックスのみのクエリとして修飾されます。 –
これは意味をなさない。おそらくインタビュアーはあなたよりも知識があまりなかったでしょう。 –