MySQL

mysql index 検証② force indexを使用

https://qiita.com/ishizuka215/items/bcfb67fb952a50d25792

続き。

| data5 | CREATE TABLE `data5` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `status` tinyint(1) NOT NULL,
  `name` varchar(50) NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_1` (`status`),
  KEY `idx_2` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4194305 DEFAULT CHARSET=latin1

idx_1 (status)、idx_2 (name) それぞれインデックスが存在する。
force indexで強制的に使用するインデックスを指定してあげると
ただしくインデックスが張られていても、使用されない。

mysql> explain  select * from data5 force index(idx_1) where name = "test000000000";
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | data5 | ALL  | NULL          | NULL | NULL    | NULL | 4165246 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
mysql> explain  select * from data5 force index(idx_2) where name = "test000000000";
+----+-------------+-------+------+---------------+-------+---------+-------+------+-----------------------+
| id | select_type | table | type | possible_keys | key   | key_len | ref   | rows | Extra                 |
+----+-------------+-------+------+---------------+-------+---------+-------+------+-----------------------+
|  1 | SIMPLE      | data5 | ref  | idx_2         | idx_2 | 52      | const |    1 | Using index condition |
+----+-------------+-------+------+---------------+-------+---------+-------+------+-----------------------+
1 row in set (0.00 sec)

以前の対応した案件では、1億レコード近いデータから対象のデータを取得する時
性能劣化により、インデックスが使用されないという事態が発生しました。
その際、force indexを使用する事で解決できました。