-1

インデックスを並べ替えて使用しようとしていますが、ファイルソートを使用しているようです

テーブル

CREATE TABLE `teachers` (
`id` int(10) unsigned NOT NULL,
`name` VARCHAR(10) NOT NULL,
`lastName` tinytext NOT NULL,
KEY `lastName` (lastName(10))
)

クエリ

mysql> EXPLAIN SELECT name,lastName FROM teachers ORDER BY lastName DESC;
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | teachers | ALL  | NULL          | NULL | NULL    | NULL | 1546 | Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
4

2 に答える 2

0

カバリングインデックスを作成する必要がありますlast name, name

CREATE TABLE `teachers` (
  `id` int(10) unsigned NOT NULL,
  `name` varchar(10) NOT NULL,
  `lastName` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `last_first` (`lastName`,`name`)
)

今そのクエリ

EXPLAIN SELECT `name`, lastName FROM teachers ORDER BY lastName DESC;

次の結果が生成されます

+----+-------------+----------+-------+---------------+------------+---------+------+------+-------------+
| id | select_type | table    | type  | possible_keys | key        | key_len | ref  | rows | Extra       |
+----+-------------+----------+-------+---------------+------------+---------+------+------+-------------+
|  1 | SIMPLE      | teachers | index | NULL          | last_first | 269     | NULL |    1 | Using index |
+----+-------------+----------+-------+---------------+------------+---------+------+------+-------------+
于 2013-02-10T08:46:47.417 に答える
0

問題はキー定義にあります: KEY lastName(lastName(10))

特に、ここでキーの長さを定義したこと

ORDER BY 句で指定された列のプレフィックスのみにインデックスを付けます。この場合、インデックスを使用してソート順を完全に解決することはできません。たとえば、CHAR(20) 列があり、最初の 10 バイトのみにインデックスを付ける場合、インデックスは 10 番目のバイトを超える値を区別できず、ファイルソートが必要になります

証明リンク

KEY lastName(lastName)を書くことができ、必要に応じて機能します。

于 2013-12-23T11:38:12.610 に答える