繁体   English   中英

MySQL-在条件不起作用的地方随机化

[英]MySQL - randomizing where condition doesn't work

我在内存中创建了一个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_ID如下

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的了解非常有限。 谢谢。

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

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;

如果要为每一行的测试获取相同的仪器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 您可以调用函数并使用值,而无需额外的子查询层。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM