サーバーサイドエンジニアの方に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 ステートメント
- Column_name: インデックスのカラム名
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
インデックスの貼り方によって検索効率が大きく変わるらしい。