我在一个名为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行,然后选择其中一行.
如果这些不起作用,那么还有其他解决方案逐渐变得更加复杂.