微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 由rand()查询命令太慢了

我在一个名为offer(超过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子句进行全表扫描.顺序确实会使事情变得更糟 – 取决于通过过滤器的音量.

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

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行,然后选择其中一行.

如果这些不起作用,那么还有其他解决方案逐渐变得更加复杂.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐