Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 对具有6M+;记录,即使有索引_Mysql - Fatal编程技术网

Mysql 对具有6M+;记录,即使有索引

Mysql 对具有6M+;记录,即使有索引,mysql,Mysql,我最近将旧记录从一个设计令人不安的表迁移到了一个新的表中,并且我需要根据给定的时间框架过滤记录——比如说,我需要从2017年1月1日到2017年12月31日的所有记录。从2014年到现在,上述表格显然有超过600万条记录 一个非常基本的查询大约需要20秒。我还在WHERE子句中引用的列上添加了一个索引,但是MySQL似乎没有使用它。我需要表中的所有列(我可以制作一个复合索引,但我只需要几列) 以下是我的疑问: SELECT pt.* -- no index utilized at all

我最近将旧记录从一个设计令人不安的表迁移到了一个新的表中,并且我需要根据给定的时间框架过滤记录——比如说,我需要从2017年1月1日到2017年12月31日的所有记录。从2014年到现在,上述表格显然有超过600万条记录

一个非常基本的查询大约需要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
我的解决办法是

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