2011-06-17 9 views
3

インデックスを再定義する方法を入力しようとしている複数の同様の投稿を調べましたが、これを把握することはできません。 ORDER BY文を含めるたびに、ファイルセットを使用して結果セットを返します。mysql単一テーブルSELECTクエリORDER BY原因FILESORT

は、ここでテーブル定義とクエリです:

SELECT 
    `s`.`title`, 
    `s`.`price`, 
    `s`.`price_sale` 
    FROM `style` `s` 
WHERE `s`.`isactive`=1 AND `s`.`department`='women' 
    ORDER 
    BY `s`.`ctime` DESC 



CREATE TABLE IF NOT EXISTS `style` (
    `id` mediumint(6) unsigned NOT NULL auto_increment, 
    `ctime` timestamp NOT NULL default CURRENT_TIMESTAMP, 
    `department` char(5) NOT NULL, 
    `isactive` tinyint(1) unsigned NOT NULL, 
    `price` float(8,2) unsigned NOT NULL, 
    `price_sale` float(8,2) unsigned NOT NULL, 
    `title` varchar(200) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `idx_grid_default` (`isactive`,`department`,`ctime`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=47 ; 

はまた、ここで私が手を説明し、結果セットです:

+----+-------------+-------+------+---------------+----------+---------+-------------+------+-----------------------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra      | 
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-----------------------------+ 
| 1 | SIMPLE  | s  | ref | idx_grid  | idx_grid | 6  | const,const | 3 | Using where; Using filesort | 
+----+-------------+-------+------+---------------+----------+---------+-------------+------+-----------------------------+ 
+0

私はあなたの設定をテストしました。インデックスはうまく使用されているようですが、なぜfilesortが使用されていると思いますか? EXPLAIN SELECT 's'.'title'、... [...] possible_keys:idx_grid_default キー:idx_grid_default エクストラ: – Gryphius

+0

奇妙なその場所を使用して - 私は「ここで使用して、filesortレコードを使用する」を取得する - ので、あなたは 'filesort'を使って何を得る場合、私はのErm – snucky

+1

上記の説明参照してください?あなたはそれであなたを悩ませているのですか?それが間違っていると思いますか?それが何を意味するか知っていますか? –

答えて

3

はなぜs.isactiveをインデックスとして使用されませんか?

MySQL(またはそれに関するSQL)は、カーディナリティが低い場合はキーを使用しません。 普通の英語では、多くの行が同じキーの値を共有する場合、(My)SQLはインデックスを使用せず、代わりに実際のテーブルを使用します。

このため、ブール値フィールドはほとんど決してインデックスとして選択されません。行が多すぎると同じ値を共有します。

なぜMySQLはインデックスをctimeで使用しないのですか?

ctimeは、マルチフィールドまたはcompositeインデックスに含まれています。 MySQLはコンポジットインデックスを使用します。を使用する場合は、そのすべてまたはその一番左の部分を使用します。*)
複合インデックスの中央または右端のフィールドをソートすると、MySQLはインデックスを作成し、filesortに頼らなければなりません。
したがって、order by isactive , departmentはインデックスを使用します。
order by departmentはありません。
order by isactiveまた、はインデックスを使用しますが、ブール値フィールドisactiveのカーディナリティが低すぎるためです。

*)いくつかの例外がありますが、これは97%のケースをカバーしています。

リンク:
カーディナリティウィキペディア:http://en.wikipedia.org/wiki/Cardinality_%28data_modeling%29
http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

1

What does Using filesort mean in MySQL?

それはあなたが一時ファイルを持って意味するものではありません、それはわずか4を無視し、(ソートが行われている悪い名前の意味最初の手紙)。 バロン・シュワルツから

真実はfilesortレコードがひどいという名前が付けられています。索引からソートを実行できないときはいつでも、それはファイル・ソートです。それはファイルとは関係ありません。 Filesortは「並べ替え」と呼ばれるべきです。

関連する問題