mysql - 优化 MySql 查询以避免使用 "Using filesort"

标签 mysql performance optimization query-optimization filesort

我需要你的帮助来优化查询以避免使用“使用文件排序”。查询的工作是选择属于特定标签的所有文章。查询是:

  select title 
    from tag,
         article 
   where tag = 'Riyad' 
     AND tag.article_id = article.id 
order by tag.article_id

表结构如下:

标签表

 CREATE TABLE `tag` (
 `tag` VARCHAR( 30 ) NOT NULL ,
 `article_id` INT NOT NULL ,
 KEY `tag` (`tag`),
 KEY `article_id` (`article_id`)
 ) ENGINE = MYISAM ;

文章表

 CREATE TABLE `article` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `title` VARCHAR( 60 ) NOT NULL
 ) ENGINE = MYISAM 

示例数据

 INSERT INTO `article` VALUES (1, 'About Riyad');
 INSERT INTO `article` VALUES (2, 'About Newyork');
 INSERT INTO `article` VALUES (3, 'About Paris');
 INSERT INTO `article` VALUES (4, 'About London');

 INSERT INTO `tag` VALUES ('Riyad', 1);
 INSERT INTO `tag` VALUES ('Saudia', 1);
 INSERT INTO `tag` VALUES ('Newyork', 2);
 INSERT INTO `tag` VALUES ('USA', 2);
 INSERT INTO `tag` VALUES ('Paris', 3);
 INSERT INTO `tag` VALUES ('France', 3);

最佳答案

在表 tag 中,将 tag 上的键替换为 (tag, article_id) 上的键:

ALTER TABLE `tag` DROP INDEX `tag`, ADD INDEX `tag_article_id` (`tag`, `article_id`)

MySQL 将只使用表上的一个索引来执行查询。目前使用的是tag上的索引,不能使用其他索引进行ORDER BY。如果您将第二列放在索引中,那么它将使用它来帮助处理 ORDER BY。

关于mysql - 优化 MySql 查询以避免使用 "Using filesort",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2939289/

相关文章:

mysql - 使用mysql获取汇总每个组的总和并按元素排序

mysql - match () against () 是否需要 4 个参数才能工作?

mysql - 如何使用本地wamp连接远程数据库?

php - 数据不在表中的相关子查询

performance - 为什么要使用 DataFrame.select 而不是 DataFrame.rdd.map (反之亦然)?

r - 负整数与正整数索引的时间效率

python - Eigen + MKL 或 OpenBLAS 比 Numpy/Scipy + OpenBLAS 慢

c - 这是 Clang 优化器错误还是未定义的行为?

具有多个选项的 PHP Laravel 复杂查询

c++ - 更快的 std::insert,或者,如何优化 Instruments 认为速度很慢的调用?