gpt4 book ai didi

php - rand() 查询顺序太慢

转载 作者:可可西里 更新时间:2023-11-01 07:30:26 27 4
gpt4 key购买 nike

我在名为 offers 的数据库中有一个大表(超过 300.000 行)。

当我执行下面的查询时,它需要超过 3 秒。

$sql = "SELECT * FROM `offers` WHERE (`start_price` / `price` >= 2) ORDER BY RAND() LIMIT 1"; 

表提供

`id` int(11) NOT NULL,
`title` text NOT NULL,
`description` text NOT NULL,
`image` text NOT NULL,
`price` float NOT NULL,
`start_price` float NOT NULL,
`brand` text NOT NULL

有没有办法让它更快?我想选择一个随机行 (start_price/price >= 2)

最佳答案

我认为您的问题是您的查询需要对 WHERE 子句进行全表扫描。 order by 确实让事情变得更糟——这取决于通过过滤器的数量。

您可以考虑将此数字存储在表中并为其添加索引:

alter table offers add column start_to_price float;

update offers
set start_to_price = start_price / price;

create index idx_offers_s2p on offers(start_to_price);

那么,您的查询可能很快:

SELECT o.*
FROM `offers` o
WHERE start_to_price >= 2
ORDER BY RAND()
LIMIT 1;

如果性能仍然是个问题,那么我可能会首先使用 where 子句:

SELECT o.*
FROM `offers` o CROSS JOIN
(select COUNT(*) as cnt from offers where start_to_price >= 2) oo
WHERE rand() <= 10 / cnt
ORDER BY RAND()
LIMIT 1;

这会随机拉取大约 10 行,然后选择其中的一行。

如果这些都不起作用,那么还有其他解决方案会变得越来越复杂。

关于php - rand() 查询顺序太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32180155/

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