我在这里读到,当存在WHERE子句时,ORDER BY只对过滤后的集合进行排序。不过,我看到了一些不同的结果。
我的表有大约550k条记录,以下查询在大约2.5秒内完成:
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
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;发布于 2019-10-13 07:56:28
mysql只对选定的行进行排序。
如果您想知道order by为什么花了这么长时间,特别是在列没有索引的情况下(所以Daniels的建议是有意义的),这是因为mysql创建了一个临时表,其中包含结果并对其进行排序。
如果有人对内部工作原理感兴趣,请阅读了解MySQL内部:发现和改进一个伟大的数据库
但是,当涉及where子句时,您是在哪里听说或读到mysql只对筛选集进行排序的。
发布于 2019-10-17 09:47:16
执行该查询的唯一方式是:
使用WHERE
ORDER BY过滤的整个集合(此处没有索引)。请注意,它必须深入记录才能找到dt,这样它才能排序。如果您删除了WHERE,那么它将对整个表进行排序,或者(如果您有INDEX(dt),它可能会使用索引来避免排序。
如果您只删除ORDER BY和大量匹配的行,那么它将只提供它首先找到的100行。这可能会明显更快。
https://stackoverflow.com/questions/58359223
复制相似问题