こう 聞かれます
- 「インデックスとは
何ですか。 付けすぎると 何が 困りますか」 - 「検索が
遅いと 言われたら、 まず 何を 調べますか」 - 「2 つの
列を まとめた インデックスでは、 列の 順に 意味が ありますか」
面接官が 見ている点
- 「速くなる」だけでなく、
書き込みが 重くなる 引き換えまで話せるか - 複合インデックスは
先頭の 列から 使われる、と 分かっているか - 勘ではなく、
EXPLAIN で 実際に 使われているかを 確かめる、と言えるか
短い答え
- インデックスは
本の 巻末の 索引のような 物で、 表を 頭から 全部読まずに、 条件に 合う 行へ 近道できます。 - そのかわり、
行を 足す、 直す、 消すたびに インデックスも 書き直すので、 書き込みが 重くなり、 置き場所も 使います。 - だから、
よく 使う 検索の 条件に 絞って 付け、 本当に 使われているかを EXPLAIN で 確かめます。
少し 詳しい答え
読む速さと書く手間
インデックスの
ただし、
複合インデックスの列の順
「ある
SQL クエリ
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER,
ordered_on DATE
);
CREATE INDEX idx_orders_cust
ON orders (customer_id,
ordered_on);この
EXPLAIN で確かめる
SELECT の
作った
よく ある間違い
- 「インデックスは
多い ほど 速い」と言う 読むのは 速くなっても、 書き込みの たびに 全部の インデックスを 直すので、 書き込みは 遅くなります - 複合インデックスの
列の 順を 気にしない 先頭の 列を 条件に 使わない 検索には、 効きにくくなります。 よく 使う 条件から 順を決めます - 付けたら
必ず 使われると思う 行が 少ない、 ほとんどの 行が 当てはまる、 などの ときは 使われません。 EXPLAIN で 確かめます
深掘りの問い
- 「インデックスが
あるのに 使われないのは、 どんな ときですか」列に 関数を かけて 比べる、 LIKE '%語'のように途中から 探す、 ほとんどの 行が 当てはまる、 などを挙げます - 「主キーには
インデックスが 要りますか」 主キーや 一意制約を 置くと、 多くの DB が 自動で インデックスを 作る、と 答えます。 外部 キーの 列には 自分で 付ける 必要が ある DB もあります - 「どの
列に 付けるかは、 どう 決めますか」 よく 使う WHERE、 JOIN、 ORDER BY の 列から 考え、 遅い 問いを EXPLAIN で 見て、 足す前と 後を 測って 決める、と答えます