1
CREATE TABLE `TEST` (
`ID1` mediumint(8) NOT NULL default '0',
`ID2` mediumint(8) NOT NULL default '0',
`DATE` datetime NOT NULL default '0000-00-00 00:00:00',
 UNIQUE KEY `COMBO_INDEX` (`ID1`,`ID2`),
 KEY `ID2` (`ID2`)
) ENGINE=InnoDB`

このテーブルには約16196496レコードがあります

EXPLAIN SELECT * FROM TEST WHERE ID1 IN ('8518582',  '5398912',  '6120243',  '6841316',  '7580078',  '7671953',  '7775737',  '7792470',  '7887985',  '7888375',  '7946516',  '8008760',  '8111722',  '8211235',  '8262746',  '8365675',  '8396853', '8399818',  '8410062',  '8459079',  '8490683')

私は次のように出力を取得しています

+----+-------------+------------------------+------+---------------+------+---------+------+----------+-------------+
| id | select_type | table                  | type | possible_keys | key  | key_len | ref  | rows     | Extra       |
+----+-------------+------------------------+------+---------------+------+---------+------+----------+-------------+
|  1 | SIMPLE      | TEST                   | ALL  | ID1           | NULL | NULL    | NULL | 16196496 | Using where |
+----+-------------+------------------------+------+---------------+------+---------+------+----------+-------------+

クエリがキーを使用していない理由がわかりません。

また、このinnodbテーブルでこのクエリを実行すると、329秒(MySQLバージョン5.0.45-log)の膨大な時間がかかります。

myisamテーブルで同じクエリを実行すると、2秒しかかかりません(同じ結果が表示されることを説明していますが)。MySQLバージョン5.5を使用しています。

クエリがキーを受け取らないのはなぜですか?

4

2 に答える 2

1

innodbインデックスで見つかった行を高速でシークするには、主キーが必要です。あなたが何も持っていない限り-mysqlはそれを行うことができないので、フルスキャンを好みます。

http://dev.mysql.com/doc/refman/5.6/en/innodb-table-and-index.html

インデックス検索はすべての行データを含むページに直接つながるため、クラスター化インデックスを介して行にアクセスするのは高速です。テーブルが大きい場合、クラスター化インデックスアーキテクチャは、インデックスレコードとは異なるページを使用して行データを格納するストレージ組織と比較して、ディスクI/O操作を節約することがよくあります。(たとえば、MyISAMは1つのファイルをデータ行に使用し、別のファイルをインデックスレコードに使用します。)

したがって、明らかな解決策は、一意のキーを主キーに置き換えることです(個人的には、自然な主キー、特に複合的な自然な主キーは好きではありません)。

PS:文字列の代わりに数字を使用することについてのコメントで私の推測が役に立ったようです。主キーを追加することについてのアドバイスはまだ実行中ですが、パフォーマンスをさらに向上させるためにそれを行ってください。

于 2013-01-14T11:21:35.123 に答える
0

よくわかりませんが、「インデックスをロードしてフルスキャンするのに十分なメモリがない場合があるかもしれません」という別の理由があります

于 2013-01-15T07:36:42.430 に答える