Mysql 对具有6M+;记录,即使有索引
我最近将旧记录从一个设计令人不安的表迁移到了一个新的表中,并且我需要根据给定的时间框架过滤记录——比如说,我需要从2017年1月1日到2017年12月31日的所有记录。从2014年到现在,上述表格显然有超过600万条记录 一个非常基本的查询大约需要20秒。我还在Mysql 对具有6M+;记录,即使有索引,mysql,Mysql,我最近将旧记录从一个设计令人不安的表迁移到了一个新的表中,并且我需要根据给定的时间框架过滤记录——比如说,我需要从2017年1月1日到2017年12月31日的所有记录。从2014年到现在,上述表格显然有超过600万条记录 一个非常基本的查询大约需要20秒。我还在WHERE子句中引用的列上添加了一个索引,但是MySQL似乎没有使用它。我需要表中的所有列(我可以制作一个复合索引,但我只需要几列) 以下是我的疑问: SELECT pt.* -- no index utilized at all
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
我的解决办法是
WHERE
pt.out_date BETWEEN '2017-01-01 00:00:00' AND '2017-12-31 23:59:59'
因为日期函数可能会变慢我的解决方案是
WHERE
pt.out_date BETWEEN '2017-01-01 00:00:00' AND '2017-12-31 23:59:59'
因为日期功能可能会变慢我实际上在发布之前就已经这样做了。显示数据需要21.726秒。尽管它使用2个索引:out\u date,cmpst\u ndx\u 1:(我明白。你可以尝试在select查询中只获取1个字段。或者第二种方法,你可以在my.ini文件中查看mysql配置。我应该修改哪种具体配置。你也可以使用限制和偏移量,但这取决于你的要求。我在发布之前实际上已经这样做了。数据显示需要21.726秒。虽然在索引:过期,cmpst ndx 1:(我理解。您可以尝试在select查询中只获取1个字段。或者第二种方法,您可以查看my.ini文件中的mysql配置。我应该修改哪种具体配置。您也可以使用限制和偏移量,但这取决于您的要求返回多少行?2017年记录大约有2M多行。我非常怀疑这是一个因素。给定填充数百万数据的时间到了,但仍然…永远不要使用date(your_column)stackoverflow.com/a/14104364/12582712返回了多少行?2017年的记录大约有200多万行。我很怀疑这是一个因素。考虑到填充数百万数据的时间,仍然…永远不要使用date(your_column)stackoverflow.com/a/14104364/12582712