我有一个包含800万条记录的表,我需要根据名为connect_timestamp
且类型为TIMESTAMP的字段执行DELETE和SELECT等操作。该表名为data
。
然而做类似
的事情SELECT count(*)FROM
data
WHERE unix_timestamp(connect_timestamp
) < 1483272827
花费很长时间并导致NGINX等服务超时,是否有更好的方法使用内置的MySQl函数来处理如此大量的数据?
我认为这是由于unix_timestamp()函数,但是执行DATE_SUB 没有任何帮助
该列确实应用了一个索引。
答案 0 :(得分:0)
提高性能的一种方法是避免使用列上的转换类型(这意味着查询优化器不能最佳地使用索引,或者反复使用数据表进行过滤)所以你应该使用where条件而不进行转换
SELECT count(*)
FROM data WHERE connect_timestamp < '2017-03-03 10:10:10'
答案 1 :(得分:0)
在将时间戳放入查询之前尝试格式化时间戳,然后直接与connect_timestamp进行比较
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Header>headerstring</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:getAccountValidationOutput xmlns:ns1="urn:B2BStandardApi">
<operationParameters>
<TransactionReferenceCode>CICAM-000114</TransactionReferenceCode>
<TransactionDate>2017-03-03 11:02:53+03:00</TransactionDate>
<TotalAmount>0</TotalAmount>
<Currency></Currency>
<AdditionalInfo/>
</operationParameters>
<accountInfo>
<item>
<AccountNumber>0001700200019004</AccountNumber>
<AccountName>Fixed Income</AccountName>
</item>
</accountInfo>
<institution>
<InstitutionCode>CICAM</InstitutionCode>
<InstitutionName>ASSET MANAGEMENT</InstitutionName>
</institution>
</ns1:getAccountValidationOutput>
</SOAP-ENV:Body>
这也计算了1月1日之前的所有数据,如果大量数据在这里,它必须经过所有这些行
答案 2 :(得分:0)
试试这个:
SELECT count(*) FROM data WHERE connect_timestamp < FROM_UNIXTIME(1483272827)