1

次の表があります。

CREATE TABLE `deal_keyword` (
  `deal_id` int(11) unsigned NOT NULL default '0',
  `keyword_id` int(11) unsigned NOT NULL default '0',
  `area_id` int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (`deal_id`,`keyword_id`),
  KEY `area_id` (`area_id`,`keyword_id`,`deal_id`)
) TYPE=MyISAM;

テスト用にいくつかのレコードを入力します。

insert into deal_keyword values(1,2,3);
insert into deal_keyword values(2,2,3);
insert into deal_keyword values(3,2,3);
insert into deal_keyword values(4,1,3);
insert into deal_keyword values(5,1,3);
insert into deal_keyword values(6,1,3);
insert into deal_keyword values(7,3,3);
insert into deal_keyword values(8,3,3);

この SQL を実行すると:

explain select * from `deal_keyword` where `area_id`=3 && `keyword_id` in(1,3) order by `deal_id`;

+--------------+-------+---------------+---------+---------+------+------+------------------------------------------+
| table        | type  | possible_keys | key     | key_len | ref  | rows | Extra                                    |
+--------------+-------+---------------+---------+---------+------+------+------------------------------------------+
| deal_keyword | range | area_id       | area_id |       8 | NULL |    4 | Using where; Using index; Using filesort |
+--------------+-------+---------------+---------+---------+------+------+------------------------------------------+

このSQLの「ファイルソートの使用」を解決するにはどうすればよいですか?

手伝ってくれてありがとう :)

4

1 に答える 1

1

に複合インデックスを作成します(area_id, deal_id, keyword_id)(この順序で)

テーブルに追加の列がある場合、インデックス スキャンは、 を使用しORDER BYないのファイルソートよりも必ずしも優れLIMITているとは限りません。これは、インデックスをトラバースするには、ランダム シークを意味するテーブル ルックアップが必要であり、効率的ではないためです。

于 2012-05-31T18:37:30.927 に答える