首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何仅对筛选的结果集进行排序,而不是对整个表进行排序

问如何仅对筛选的结果集进行排序,而不是对整个表进行排序
EN

Stack Overflow用户
提问于 2019-10-13 06:50:08
回答 2查看 33关注 0票数 0

我在这里读到,当存在WHERE子句时,ORDER BY只对过滤后的集合进行排序。不过,我看到了一些不同的结果。

我的表有大约550k条记录,以下查询在大约2.5秒内完成:

代码语言:javascript
复制
SELECT
    *
FROM
    scrapings
WHERE MATCH (title, descr) AGAINST ("young" IN BOOLEAN MODE)
ORDER BY
    dt DESC
LIMIT 100

通过删除ORDER BY子句,时间减少到大约0.1秒。如何让它只对过滤后的结果进行排序?

哦,我还尝试删除了WHERE子句,以确保它不会花费大约2.5秒的时间对过滤后的结果进行排序。

哦2:这是EXPLAINed:

​

哦3:这是DDL

代码语言:javascript
复制
CREATE TABLE `scrapings` (
  `url` varchar(512) NOT NULL,
  `dt` int(11) NOT NULL,
  `title` text CHARACTER SET utf8mb4,
  `descr` text CHARACTER SET utf8mb4,
  `image` varchar(1024) DEFAULT NULL,
  `domain` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`url`,`dt`),
  UNIQUE KEY `image` (`image`),
  FULLTEXT KEY `title` (`title`,`descr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
EN

回答 2

Stack Overflow用户

发布于 2019-10-13 07:56:28

mysql只对选定的行进行排序。

如果您想知道order by为什么花了这么长时间,特别是在列没有索引的情况下(所以Daniels的建议是有意义的),这是因为mysql创建了一个临时表,其中包含结果并对其进行排序。

如果有人对内部工作原理感兴趣,请阅读了解MySQL内部:发现和改进一个伟大的数据库

但是,当涉及where子句时,您是在哪里听说或读到mysql只对筛选集进行排序的。

票数 0
EN

Stack Overflow用户

发布于 2019-10-17 09:47:16

执行该查询的唯一方式是:

使用WHERE

  • Sort的
  1. 过滤器由ORDER BY过滤的整个集合(此处没有索引)。请注意,它必须深入记录才能找到dt,这样它才能排序。
  2. 提供前100 (限制)

如果您删除了WHERE,那么它将对整个表进行排序,或者(如果您有INDEX(dt),它可能会使用索引来避免排序。

如果您只删除ORDER BY和大量匹配的行,那么它将只提供它首先找到的100行。这可能会明显更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58359223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档