0

MySQLバージョン5.5.28を使用して、

私はそのように定義されたテーブルを持っています:

CREATE TABLE IF NOT EXISTS `groups` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(80) NOT NULL,
  `desc` text NOT NULL,
  `permissions` varchar(80) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 ;

ご覧のとおり、非常に簡単です。idフィールドに主キーがあります。今、私は次のようなものを使用してそれに対してクエリを実行します。

SELECT permissions FROM groups WHERE id IN ('9', '8', '6','14','11','7','5');

残念ながら、キーの使用を拒否し、遅いクエリログに表示されます。

EXPLAINを実行すると、次のことが可能になります。

mysql> EXPLAIN SELECT permissions FROM groups WHERE id IN ('9', '8', '6','14','11','7','5');
+----+-------------+--------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | groups | ALL  | PRIMARY       | NULL | NULL    | NULL |   16 | Using where |
+----+-------------+--------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

テーブル全体で20行未満しかないため、インデックスを使用しない可能性が高い理由がわかります。しかし、なぜこれがMySQLの「遅いクエリ」になるのでしょうか。

4

1 に答える 1

5

行数が少ない場合、ほとんどの場合、フルスキャンがテーブルにアクセスするための最速の方法になります。また、選択性も重要です。idが一意であっても、クエリはすべての行の約30%を返します(20個あると仮定)。遅いためではなく、インデックスを使用しないため、遅いクエリログに表示されます(その動作を制御するオプションである必要があります。頭のてっぺんから覚えていません)。

更新私はちょうどダブルチェックしました、オプションはlog-queries-not-using-indexesです

于 2012-12-11T20:04:22.407 に答える