我有一个MySQL表保存谷歌Analytics(分析)数据:MySQL查询优化(需要提高速度)
CREATE TABLE IF NOT EXISTS `analytics_data` (
`ga_profile_id` int(11) NOT NULL,
`page` varchar(200) NOT NULL,
`source` varchar(150) NOT NULL,
`medium` varchar(50) NOT NULL,
`keyword` varchar(200) NOT NULL,
`bounces` int(11) NOT NULL,
`entrances` int(11) NOT NULL,
`exits` int(11) NOT NULL,
`new_visits` int(11) NOT NULL,
`page_views` int(11) NOT NULL,
`unique_page_views` int(11) NOT NULL,
`time_on_page` int(11) NOT NULL,
`visits` int(11) NOT NULL,
`date` date NOT NULL,
KEY `ga_profile_id` (`ga_profile_id`,`source`,`medium`,`date`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
我有一个查询来计算访问者根据谷歌分析配置文件ID(ga_profile_id)的总和在给定的时间段内:
SELECT
SUM(`visits`), (UNIX_TIMESTAMP(`date`) - 21600) * 1000 AS date
FROM `analytics_data`
WHERE
`date` >= '2011-05-09' AND `date` <= '2011-06-08' AND `ga_profile_id` = [...]
GROUP BY `date`
我们有450万条记录左右。
索引数据:
Type: BTREE
Fields/Cardinality:
ga_profile_id/100
source/10196
medium/10196
date/149893
EXPLAIN SELECT
- ID:1个
- SELECT_TYPE:SIMPLE
- 表:analytics_data
- TY PE:REF
- possible_keys:ga_profile_id
- 关键:ga_profile_id
- 参考:常量
- 行:219555
- 额外:使用其中;使用临时;使用filesort
平均执行时间:1秒。
我们在一个虚拟的私人服务器上,大多数查询在.0003 - 0.03秒内执行。 LONG查询(我将在某个时间点进行优化)通常为0.3秒。
我尝试调整键,忽略一些,改变一些值,似乎没有任何东西以积极的方式影响它。考虑到这是网页上许多查询中的一个。
我正在寻找将MyISAM更改为内存 - 任何想法都欢迎。
如果您创建了一个组合索引'ga_profile_id + date',该怎么办?另外''key_length'(如果我没记错的话)来自EXPLAIN可能很有用 – zerkms 2011-06-10 01:09:32
你的查询有点奇怪:你会得到一个不同秒的分组。那是*真的吗?你想要什么?这似乎是一个非常好的分解。 – Bohemian 2011-06-10 01:12:50
@ zerkms,我展示了来自EXPLAIN的所有信息 - 这就是它的全部内容。 – 2011-06-10 01:16:51