MYSQL为统计表编制索引

时间:2018-07-23 06:00:12

标签: mysql indexing

我有一个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 个答案:

答案 0 :(得分:0)

  • 这尤其是因为COUNT(DISTINCT...)需要读取每一行。
  • 因此将创建一个临时表。
  • 由于TEXT的存在,它必定在磁盘(MyISAM)上,而不是在内存(MEMORY)中。

因此,将username TEXT更改为username VARCHAR(55)(或适当大小) 可以加快查询速度,可能会提高两倍。

如果没有COUNT(DISTINCT...),则使用summary tables可以使速度提高10倍。

这很复杂,但是可以对COUNT(DISTINCT...)进行合理精确的总结。参见here