0

私は非常に単純なテーブルを持っています:

CREATE TABLE `navigation` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) unsigned DEFAULT NULL,
  `title` varchar(255) NOT NULL COMMENT 'Название ссылки',
  `priority` tinyint(3) NOT NULL COMMENT 'Параметр сортировки'
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

41行しかありません。また、私は非常に単純なクエリを持っています:

mysql> EXPLAIN SELECT t.id, t.parent_id, t.title, t.priority FROM navigation t ORDER BY t.priority ASC;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | t     | ALL  | NULL          | NULL | NULL    | NULL |   41 | Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)

の使用を避けるにはどうすればよいfilesortですか? それとも無理ですか?SOに関する多くのトピックを読みましたが、正しい答えを理解できませんでした。ありがとうございました。

4

3 に答える 3

2

ファイルソートの使用を避けるにはどうすればよいですか? それとも無理ですか?SOに関する多くのトピックを読みましたが、正しい答えを理解できませんでした。

priority列にインデックスが必要です。

ALTER TABLE navigation ADD INDEX (priority);

ただし、MySQL は、そのようなインデックスを使用して結果をソートすると、結果をソートするよりも最終的にコストがかかると計算する可能性がありますfilesort(前者では、テーブルへのランダム I/O を実行するためにインデックス ファイルを順次読み取る必要があるため、後者には、テーブルを順次読み取り、結果に対してメモリ内ソートを実行することが含まれます)。この評価をインデックス ヒントでオーバーライドできます。

SELECT   t.id, t.parent_id, t.title, t.priority
FROM     navigation t FORCE INDEX FOR ORDER BY (priority)
ORDER BY t.priority ASC;

カバリング インデックスを使用すると、テーブルに読み込む必要がまったくないため、インデックス ファイルを順番にたどるだけですぐに結果を返すことができます。したがって、それ以上のヒントなしで、クエリ オプティマイザーによって選択される可能性があります。

ALTER TABLE navigation ADD INDEX(priority, id, parent_id, title);

どちらのアプローチが適切かは、アプリケーションの要件によって異なりますが、Knuth の格言を思い出してください。「時期尚早の最適化は諸悪の根源です」。

于 2013-07-18T14:47:59.327 に答える
1

ファイルソートを回避するには、ほとんどの場合、インデックスを追加する必要があります。あなたの場合、それはpriority列のインデックスを意味します。これは次のように行うことができます。

ALTER TABLE `navigation` ADD INDEX (`priority`);

このインデックスを使用しても、実際にはインデックスを使用するよりも高速である可能性があるため、ファイルソートが使用される可能性があることに注意してください。41 行の場合、インデックスが定義されていても、これが当てはまる可能性があります。

于 2013-07-18T14:44:26.557 に答える
1

このブログ投稿 によるとfilesort、インデックスのない列を並べ替えるたびに発生します。ファイルシステムで行われている実際のソートとは関係ありません。Erik's answerの説明を使用すると、それを取り除く必要があります。

于 2013-07-18T14:45:54.903 に答える