我有一个mysql表,它存储从一些“日志文件”解析的信息。该表包含以下列
Table "logfiles"
log_id INT (PRIMARY)
logfile_name TEXT
date DATE (INDEX)
username TEXT (INDEX)
field1 FLOAT
field2 FLOAT
field3 FLOAT
我想做一个统计查询,按年份进行汇总,如下所示:
SELECT
YEAR(date) AS year,
COUNT(DISTINCT date) AS active_days,
COUNT(log_id) AS total_logs,
COUNT(DISTINCT username) AS active_users,
SUM(field1) AS total_field1,
SUM(field2) AS total_field2
FROM
logfiles
GROUP BY
year
ORDER BY
year ASC
索引此表以快速运行查询(并使用索引)的最佳方法是什么。
目前,100000行的查询需要3秒钟。从explain查询中,我可以理解它没有使用索引。
id 1
select_type SIMPLE
table logfile_list
type ALL
possible_keys NULL
key NULL
key_len NULL
ref NULL
rows 88963
Extra Using filesort
谢谢你的帮助,向皮科特问好
1条答案
按热度按时间7dl7o3gd1#
尤其是因为
COUNT(DISTINCT...)
需要阅读每一行。因此将创建一个临时表。
由于
TEXT
,它必须在磁盘(myisam)上,而不是在内存(memory)中。因此,改变
username TEXT
至username VARCHAR(55)
(或一些合理的大小)可能会加快查询速度,可能会提高两倍。没有
COUNT(DISTINCT...)
,通过使用摘要表,您可以获得10倍的加速比。这是复杂的,但有可能得到相当精确的总结
COUNT(DISTINCT...)
. 看到这里了吗