【发布时间】:2021-07-03 07:07:17
【问题描述】:
是否可以从表中快速选择随机行,同时还使用 where 条件?
例子:
SELECT * FROM geo WHERE placeRef = 1 ORDER BY RAND() LIMIT 1
这可能需要 10 多秒。
我发现了这个,有时很快,有时很慢:
(SELECT *
FROM geo
INNER JOIN ( SELECT RAND() * ( SELECT MAX( nameRef ) FROM geo ) AS ID ) AS t ON geo.nameRef >= t.ID
WHERE geo.placeRef = 1
ORDER BY geo.nameRef
LIMIT 1)
This 提供快速结果,前提是没有额外的 where 条件。
这是创建表:
CREATE TABLE `geo` (
`nameRef` int(8) DEFAULT NULL,
`placeRef` mediumint(7) unsigned DEFAULT NULL,
`category` enum('continent','country','region','subregion') COLLATE utf8_bin DEFAULT NULL,
`parentRef` mediumint(7) DEFAULT NULL,
`incidence` int(9) unsigned NOT NULL,
`percent` decimal(11,9) unsigned DEFAULT NULL,
`ratio` int(11) NOT NULL,
`rank` mediumint(7) unsigned DEFAULT NULL,
KEY `placeRef_rank` (`placeRef`,`rank`),
KEY `nameRef_category` (`nameRef`,`category`),
KEY `nameRef_parentRef` (`nameRef`,`parentRef`),
KEY `nameRef_placeRef` (`nameRef`,`placeRef`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin
注意该表有大约 5.5 亿行。
期望查询:查询placeRef = x的表;然后快速返回一行。
问题:像SELECT * FROM geo WHERE placeRef = 1 这样的查询最多可以提供大约 1500 万条结果。所以选择单个随机行很慢。
【问题讨论】:
标签: mysql random sql-order-by where-clause