2010-11-29 79 views
1

我有如下表(包含超过一百万行):优化MySQL的选择查询以获得一个随机行WHERE子句

**MyTable** 
id - int(10) 
externalId - smallint(5) 
description - varchar(250) 
status - smallint(6) 
entrydate - int(10) (unix timestamp) 

我希望能够选择一个随机行(我只需要值在结果的ID)从该表具有以下where子句:

/* The number of external ids here can range from 1 to around 50 */ 
WHERE externalId in (1,2,3,4,x,x,x) 
/* Status is fixed at 2 for all calls */ 
AND status = 2 
/* Entry date is typically (now - 30 days) or may be excluded all together */ 
AND entrydate > 1279887765 

显而易见的解决方案是使用兰特(),但是我发现,这种性能上有所欠缺,这是相当有据可查。那么是否有人有其他解决方案?为了给出一点背景:我打算在一个PHP驱动的网站上使用这个查询,并且输入参数取决于用户,所以这些将从用户变为用户。还值得一提的是,我根本无法改变表格结构。

在此先感谢。

回答

0

你可以做两个查询 - 一个得到所有可能的行数,然后使用该计数在PHP中生成从零到($ count - 1)的随机整数,然后在第二个查询的末尾添加“LIMIT $ rand,1”。

1

当你说,你使用PHP,为什么不用语言来做?

说你知道你有100.000行,生成PHP中的随机数,在此范围内的,并执行限制查询

SELECT * FROM mytable ORDER BY id LIMIT $randomNumber, 1; 
+0

问题在于ID的顺序不一样,可能会有很大的差距。 – MrEyes 2010-11-29 13:21:44