我在内存中创建了一个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的了解非常有限。感谢。
答案 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
。您只需调用函数并使用值,而无需额外的子查询层。