gpt4 book ai didi

mysql - 在这种情况下我应该使用派生表吗?

转载 作者:行者123 更新时间:2023-11-29 13:02:54 24 4
gpt4 key购买 nike

我需要从表中获取 10 个随机行,下面的查询不会执行此操作,因为它在大规模上会非常慢(我已经阅读了反对它的强有力的论据):

SELECT `title` FROM table1 WHERE id1 = 10527 and id2 = 37821 ORDER BY RAND() LIMIT 10;

EXPLAIN:
select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
------------+-------------+------+---------------+-------+---------+------+------+----------------+
SIMPLE | table1 | ref | id1,id2 | id2 | 5 | const| 7 | Using where; Using temporary; Using filesort

我尝试了以下解决方法:

SELECT * FROM
(SELECT `title`, RAND() as n1
FROM table1
WHERE id1 = 10527 and id2 = 37821) TTA
ORDER BY n1 LIMIT 10;

EXPLAIN:
select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
------------+-------------+------+---------------+-------+---------+------+------+----------------+
PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 7 | Using filesort |
DERIVED | table1 | ref | id1,id2 | id2 | 5 |const | 7 | Using where |

但我也读过一些反对使用派生表的声明。

您能否告诉我后一个查询是否会有任何改进?

最佳答案

您应该尝试第一种方法,看看它是否适合您。如果您在 table1(id1, id2) 上有一个索引,并且 任何给定值对的出现次数不是很多,那么性能可能适合您想要的结果做。

您的第二个查询的性能将比第一个查询要差一些。 order by rand() 的性能问题不是计算随机数所需的时间。问题是 order by,您的第二个查询基本上做同样的事情,但有派生表的额外开销。

如果您知道总是至少有 1000 个匹配值,那么以下通常会运行得更快:

SELECT `title`
FROM table1
WHERE id1 = 10527 and id2 = 37821 and rand() < 0.05
ORDER BY RAND()
LIMIT 10;

这将随机抽取大约 5% 的数据,并且有 1,000 个匹配行,您几乎总是有至少 10 行可供选择。

关于mysql - 在这种情况下我应该使用派生表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23094561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com