我最近将旧记录从设计令人不安的表格迁移到新表格,我需要根据给定的时间范围过滤记录 - 比如我需要从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
答案 0 :(得分:1)
我的解决方案是
WHERE
pt.out_date BETWEEN '2017-01-01 00:00:00' AND '2017-12-31 23:59:59'
因为日期功能可能正在放慢