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

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

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...