カルボナーラ街道

計測と観察

インデックスを貼るって何?

サーバーサイドエンジニアの方にDBのことを質問していたら、「インデックスを貼る」というフレーズが頻出して分からなかったので調べる。

開発環境

# ホスト
> docker --version
Docker version 20.10.8, build 3967b7d

> docker-compose --version
docker-compose version 1.29.2, build 5becea4c

# コンテナ
root@{CONTAINER_ID}:/# mysql --version
mysql  Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)

結論

インデックスを貼るって何?
→ インデックスを貼ることによって検索効率を高めることが出来る。検索効率を高めるための手段。

前提

テーブル

CREATE TABLE idol
(
    `id` INT(2) AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `name` VARCHAR(30) NOT NULL,
    `latin_alphabet` VARCHAR(30) NOT NULL,
    `age` INT(2) NOT NULL,
    `height` INT(3) NOT NULL,
    `birth_place` VARCHAR(30) NOT NULL,
    `birth_day` VARCHAR(5) NOT NULL,
    `blood_type` VARCHAR(2) NOT NULL
);

中身

mysql> SELECT * FROM idol\G
*************************** 1. row ***************************
            id: 1
          name: 櫻木 真乃
latin_alphabet: mano sakuragi
           age: 16
        height: 155
   birth_place: 東京都
     birth_day: 4/25
    blood_type: A
*************************** 2. row ***************************
# 省略

インデックスを見る

mysql index dev」で調べると上位にSHOWが出てきたので見てみる。

mysql> SHOW INDEX FROM idol\G
*************************** 1. row ***************************
        Table: idol
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 10
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
      Visible: YES
   Expression: NULL
1 row in set (0.00 sec)

読み方 > MySQL :: MySQL 8.0 リファレンスマニュアル :: 13.7.7.22 SHOW INDEX ステートメント

idolテーブルのカラムはidカラムに設定されていることが分かった。

インデックスはいつ貼られる?

通常、テーブル上のすべてのインデックスは、そのテーブル自体が CREATE TABLE で作成された時点で作成します。
https://dev.mysql.com/doc/refman/8.0/ja/create-index.html

どういう基準でどのカラムにインデックスが貼られるかはぱっと見読み取れなかったので今後の課題にする。

インデックスは何に使われる?

インデックスは特定のカラム値のある行をすばやく見つけるために使用されます。
https://dev.mysql.com/doc/refman/8.0/ja/mysql-indexes.html

インデックスの貼り方によって検索効率が大きく変わるらしい。

参考