使用6M +记录快速查询表,即使使用索引

时间:2018-03-09 06:10:53

标签: mysql

我最近将旧记录从设计令人不安的表格迁移到新表格,我需要根据给定的时间范围过滤记录 - 比如我需要从2017年1月1日到2017年12月31日。自2014年至今,该表显然有大约6M +记录。

一个非常基本的查询非常需要大约20秒。我还在WHERE子句引用的列上添加了一个索引,但似乎MySQL没有使用它,因为我需要表中的所有列(我可能已经创建了一个复合索引我只需要几列)。

以下是我的查询:

SELECT
    pt.* -- no index utilized at all @ 24.232s
    --  pt.out_date, pt.pt_id, pt.pi_id, pt.p_id, pt.out_status | makes use of cmpst_ndx_1 @ 9.380s
FROM
    process_trail pt
WHERE
    DATE(pt.out_date) BETWEEN DATE('2017-01-01') AND DATE('2017-12-31');

这将是我的表定义:

Field           Type            Null        Key     Default     Extra
===============================================================================
pt_id           int(11)         NO          PRI                 auto_increment
pi_id           int(11)         NO          MUL     
p_id            int(11)         NO          
in_date         datetime        NO          MUL     
in_by_id        int(11)         NO          
out_date        datetime        NO          MUL     
out_by_id       int(11)         NO          
out_status      varchar(255)    NO          
out_remarks     text            NO          
tech_remarks    text            NO      

接下来是我做的索引:

Name        Fields      Index Type  Index Method    Collation   Cardinality
============================================================================
in_date     in_date     NORMAL      BTREE           A           3094370
out_date    out_date    NORMAL      BTREE           A           3001272
pi_id       pi_id       NORMAL      BTREE           A           302772  

EXPLAIN语法告诉我这个:

id  select_type table   partitions  type    possible_keys   key     key_len     ref     rows        filtered    Extra
==============================================================================================================================
1   SIMPLE      pt      (NULL)      ALL     (NULL)          (NULL)  (NULL)      (NULL)  3246351     100         Using where

1 个答案:

答案 0 :(得分:1)

我的解决方案是

WHERE
    pt.out_date BETWEEN '2017-01-01 00:00:00' AND '2017-12-31 23:59:59'

因为日期功能可能正在放慢