根据时间戳过滤大量行

时间:2017-03-03 08:37:19

标签: mysql mariadb

我有一个包含800万条记录的表,我需要根据名为connect_timestamp且类型为TIMESTAMP的字段执行DELETE和SELECT等操作。该表名为data

然而做类似

的事情
  

SELECT count(*)FROM data WHERE unix_timestamp(connect_timestamp)   < 1483272827

花费很长时间并导致NGINX等服务超时,是否有更好的方法使用内置的MySQl函数来处理如此大量的数据?

我认为这是由于unix_timestamp()函数,但是执行DATE_SUB  没有任何帮助

该列确实应用了一个索引。

3 个答案:

答案 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)