MySQL - 在条件不起作用的情况下随机化

时间:2014-08-22 10:40:25

标签: mysql sql sqlperformance

我在内存中创建了一个MySQL表(使用ENGINE = MEMORY),其中 500万条记录。 该表有50多列,仅使用1列(INSTRUMENT_ID)进行索引。

我想使用此表检查数据库的性能。为此,我考虑使用以下SQL重复执行,其中WHERE子句使用简单的逻辑进行随机化。

SELECT * 
from ATSDN_TRA_TRADE_PRINT 
where INSTRUMENT_ID = (SELECT CONCAT('PERFINS',(SELECT LPAD((ROUND(RAND()*10000)),5,'0'))))
order by TRADE_DATE
LIMIT 1000;

INSTRUMENT_IDs如下

PERFINS000001
PERFINS000002
PERFINS000003
..
..
..
PERFINS009997
PERFINS009998
PERFINS009999

以上返回记录,但问题是每条记录显示不同的INSTRUMENT_ID值而不是相同的INSTRUMENT_ID。

另外我注意到上面的SQL需要更多的时间来执行,而不是像我下面给出的直接SQL那样

SELECT * 
from ATSDN_TRA_TRADE_PRINT 
where INSTRUMENT_ID = (SELECT'PERFINS03943')
order by TRADE_DATE
LIMIT 1000;

有人可以帮我弄明白为什么......我对MYSQL的了解非常有限。感谢。

2 个答案:

答案 0 :(得分:1)

由于您的RAND()子句中有WHERE,因此会对表中的每一行执行该操作。这很慢。相反,你可能想要这样的东西:

SELECT * 
FROM ATSDN_TRA_TRADE_PRINT
CROSS JOIN (SELECT @my_rand := ROUND(RAND()*10000)) var_init
WHERE INSTRUMENT_ID = CONCAT('PERFINS', LPAD(@my_rand, 5, '0'))
ORDER BY TRADE_DATE
LIMIT 1000;

答案 1 :(得分:1)

如果您希望获得每行测试的相同工具ID,则只需拨打rand()一次。您可以使用变量执行此操作:

SELECT attp.*
from ATSDN_TRA_TRADE_PRINT attp CROSS JOIN
     (select @id := CONCAT('PERFINS', LPAD((ROUND(RAND()*10000)), 5, '0')) ) vars
where attp.INSTRUMENT_ID = @id
order by attp.TRADE_DATE
LIMIT 1000;

顺便说一句,您在没有必要的地方使用select。您只需调用函数并使用值,而无需额外的子查询层。