mysql - 高 table 中的兰德

标签 mysql sql

想象一个具有大量行(例如 3 亿行)的 SQL 表。

每行都有一个文本字段,我想随机检索 10 行。

问题在于使用

select key from the_table where enabled=1 order by rand() limit 10

计算兰特值并按该值对所有行进行排序是一个非常高的负载。

有什么办法可以避免这种情况吗?

最佳答案

如果您可以在 SQL 之外生成 key (即使需要使用 15-20 来获取启用的 10 个 key ),您就可以跳过 order(),这几乎肯定是加载时出现的问题

SELECT 键 WHERE key IN [x,y,z....]

其中 x、y、z 是在外部随机生成的。

更好的是,您可以创建一个启用键的表,随机排序,然后以 10 个为一组进行分页。您偶尔需要更新它,并且会占用空间,但这可能没什么大不了的。

还有更复杂的解决方案,但这会让您感动。

关于mysql - 高 table 中的兰德,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10853406/

相关文章:

mysql - 通过给出过程名称来获取参数名称 - MySQL

java - 在 Spring 宠物诊所切换数据库

mysql - 仅将表数据从 MSSQL 迁移到 MySQL

php - 根据sql语句中的其他字段选择正确的字段

sql - 删除外部表会清除从外部表填充的全局临时表

sql - 检测 PostgreSQL 中的孤立行

mysql - 删除 MySQL innodb 中的孤立临时表

sql - sum() 未按预期工作

mysql - 从 MySQL 中的多个列查询多个值

mysql - 如何在不聚合数据的情况下使用 SQL 使用多列对每一行求和?