【发布时间】:2011-06-10 01:05:32
【问题描述】:
我有一个保存 Google 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
解释选择
- id:1
- select_type:简单
- 表格:analytics_data
- 类型:参考
- possible_keys:ga_profile_id
- 键:ga_profile_id
- 参考:常量
- 行:219555
- extra:使用where;使用临时的;使用文件排序
平均执行时间:1 秒。
我们在虚拟专用服务器上,大多数查询在 0.0003 - 0.03 秒内执行。长查询(我打算在某个时候优化)通常是 0.3 秒。
我尝试过调整键,忽略一些,更改一些值,但似乎没有任何积极的影响。考虑到这是页面上众多查询之一。
我正在考虑将 MyISAM 更改为记忆 - 欢迎任何想法。
【问题讨论】:
-
如果创建复合索引
ga_profile_id + date会怎样?来自 EXPLAIN 的key_length(如果我没记错的话)可能会有用 -
您的查询有点奇怪:每隔一秒您就会得到一个分组。这真的是你想要的吗?这似乎是一个很好的分解。
-
看看在stackoverflow.com/questions/6236416/…中提到的优化技巧。
-
@zerkms,我展示了来自 EXPLAIN 的所有信息——仅此而已。
-
@Bohemian - 每个日期都有一个分组 - 这是一个日期字段,而不是日期时间 :)