我有一个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
感谢您的帮助 最好的祝福 皮科特
答案 0 :(得分:0)
COUNT(DISTINCT...)
需要读取每一行。TEXT
的存在,它必定在磁盘(MyISAM)上,而不是在内存(MEMORY)中。因此,将username TEXT
更改为username VARCHAR(55)
(或适当大小) 可以加快查询速度,可能会提高两倍。
如果没有COUNT(DISTINCT...)
,则使用summary tables可以使速度提高10倍。
这很复杂,但是可以对COUNT(DISTINCT...)
进行合理精确的总结。参见here