我正在尝试改进表中大约有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))
答案 0 :(得分:3)
除了询问索引之外,我会将“count(id)”更改为“count(*)”。
我的桌子上还有一个覆盖索引......
(org_id,timestamp,userid)
org_id和时间戳,以涵盖您的标准。使用“userID”将有助于您的计数(不同),并且还具有索引中的所有部分,引擎不必转到原始数据页面以获取任何其他值。因此它可以直接从索引处理您的查询。