我有一个MySQL表格,存储着Google Analytics的数据:
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;
我有一个查询,根据Google Analytics的配置文件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
解释SELECT
- id: 1
- select_type: 简单查询
- table: analytics_data
- type: 参考查询
- possible_keys: ga_profile_id
- key: ga_profile_id
- ref: 常量
- rows: 219555
- extra: 使用where子句; 使用临时表; 使用文件排序
平均执行时间:1秒。
我们使用的是一个虚拟专用服务器,大多数查询的执行时间在0.0003-0.03秒之间。长查询(我曾经打算进行优化)一般为0.3秒。
我尝试调整键、忽略一些键、更改一些值,但似乎没有任何积极的影响。考虑到这是页面上的众多查询之一。
我正在思考将MyISAM更改为memory -- 欢迎提出任何想法。
ga_profile_id + date
,会怎样呢?此外,来自 EXPLAIN 的key_length
(如果我记得名字正确的话)可能会很有用。 - zerkms