在大型数据集上使用orderby时,MySQL Query占用太长时间

时间:2017-08-21 11:46:06

标签: php mysql datetime

我正在尝试改进表中大约有2000万行的数据库的查询时间:

以下是我正在运行的查询

`select DATE(timestamp) as timestamp, count(id) as authentications, count(distinct userid) as unique_users from `logs` where `org_id` = '54' and `timestamp` between '2016-09-14 09:00:00' and '2017-08-21 09:37:59' group by DATE(timestamp) order by `timestamp` asc`

查询大约需要20-30秒才能完成(特定org id有大约6-7百万条记录完成)

根据剖析器,其95%的时间用于分类结果。

我有一个正在使用的索引(请参阅下面的说明):

1 SIMPLE日志

ref by_org_id_and_timestamp,org_id  by_org_id_and_timestamp 4   const   6231240 Using index condition; Using where; Using filesort  

表结构是:

id  int(10) unsigned    NO  PRI     auto_increment  
org_id  int(11) NO  MUL         
profile varchar(256)    NO              
linehash    varchar(50) NO  UNI         
timestamp   datetime    NO              
userid  varchar(256)    NO              
server_id   varchar(1024)   NO              
access_id   int(11) NO              

关于为什么它需要这么长时间或者20-30秒才能获得最佳效果的任何想法?

感谢您的期待(希望您的帮助!)

------显示创建表日志------

id int(10) unsigned NOT NULL AUTO_INCREMENT, org_id int(11) NOT NULL, profile varchar(256) COLLATE utf8_unicode_ci NOT NULL, linehash varchar(50) COLLATE utf8_unicode_ci NOT NULL, timestamp datetime NOT NULL, userid varchar(256) COLLATE utf8_unicode_ci NOT NULL, server_id varchar(1024) COLLATE utf8_unicode_ci NOT NULL, access_id int(11) NOT NULL, PRIMARY KEY (id), UNIQUE KEY logs_linehash_unique (linehash), KEY by_org_id_and_timestamp (org_id,timestamp), KEY org_id (org_id), KEY by_org_id_and_timestamp_userid (org_id,timestamp,userid(255))

1 个答案:

答案 0 :(得分:3)

除了询问索引之外,我会将“count(id)”更改为“count(*)”。

我的桌子上还有一个覆盖索引......

(org_id,timestamp,userid)

org_id和时间戳,以涵盖您的标准。使用“userID”将有助于您的计数(不同),并且还具有索引中的所有部分,引擎不必转到原始数据页面以获取任何其他值。因此它可以直接从索引处理您的查询。