mysql - 我如何解决此 SQL 的 "Using filesort"?

标签 mysql sql sql-optimization

有表格:

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 的“使用文件排序”问题?

感谢您的帮助:)

最佳答案

(area_id, deal_id, keyword_id) 上创建复合索引(按此顺序)

请注意,如果您的表中有其他列,对于没有 LIMITORDER BY,索引扫描不一定比文件排序更好,因为遍历索引需要表查找,这意味着随机查找并且效率不高。

关于mysql - 我如何解决此 SQL 的 "Using filesort"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10838450/

相关文章:

用于在列中搜索字符串的特定部分的 SQL 查询

mysql - 当表之间没有物理连接时优化 SQL 查询

php - Android,使用 PHP : Null Pointer exception 连接到 MySQL

mysql - 一个查询中的两个选择

php - 将数字格式设置为缩写数字

mysql - 使用多个 AND 优化连接查询的最佳方法是什么?

mysql - 是否可以进一步优化这些查询?

mysql 提交 block 中的事务

mysql - 在 MariaDB/MySQL 中无锁地删除?`(InnoDB)

mysql - SQL选择: How to multiply a column with the count of an ID