[英]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.