10

主キーを持たないレガシー システムのテーブルがあります。工場で資材を出庫するためのトランザクション データを記録します。

簡単にするために、各行に job_number、part_number、quantity & date_issued が含まれているとします。

発行日欄に索引を追加しました。EXPLAIN SELECT * FROM issue_parts WHERE date_issued > '20100101' を実行すると、次のように表示されます。

+----+-------------+----------------+------+------ ---+------+---------+------+---------+-- -----------+
| | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ |
+----+-------------+----------------+------+------ ---+------+---------+------+---------+-- -----------+
| | 1 | シンプル | 発行済みパーツ | すべて | date_issued_alloc | ヌル | ヌル | ヌル | 9724620 | where | の使用
+----+-------------+----------------+------+------ ---+------+---------+------+---------+-- -----------+

鍵は見えますが、使用しませんか? 誰かが理由を説明できますか?

4

3 に答える 3

10

MySQL Query Optimizer が正しく決定したことがわかります。

ここにあなたが言うことができる方法があります。これらを実行します。

行数

SELECT COUNT(1) FROM issued_parts;

クエリに一致する行数

SELECT COUNT(1) FROM issued_parts WHERE date_issued > '20100101';

実際に取得する行数がテーブルの合計数の 5% を超える場合、MySQL クエリ オプティマイザーは、完全なテーブル スキャンを実行する方が労力が少ないと判断します。

たとえば、クエリがより正確な場合は、次のようになります。

SELECT * FROM issued_parts WHERE date_issued = '20100101';

その後、まったく別の EXPLAIN プランを取得します。

于 2011-03-31T18:33:32.310 に答える
0

インデックスには複数の種類があります(インデックス?)。ハッシュインデックスは、特定の値が指定されたアイテムをすばやく検索する方法です。クエリ対象の目立たない値が多数ある場合(たとえば、10個の日付のリスト)、それらの値ごとにハッシュを計算し、インデックスで検索できます。特定の値を検索するのではなく、比較を行うため、ハッシュインデックスは役に立ちません。

一方、Bツリーインデックスは、インデックスを作成している要素に順序を付けるため、役立ちます。たとえば、次を参照してください: mysqlのhttp://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html(Bツリーインデックスの特性を検索)。テーブルがそのインデックス列にbツリーインデックスを使用していることを確認することをお勧めします。

于 2011-03-31T18:56:12.207 に答える
0

possible_keys関連する列を含むキーに名前を付けますが、それはその中の各キーがクエリに役立つという意味ではありません。この場合、どれもありません。

于 2011-03-31T18:44:25.517 に答える