我有一个访客统计表,如下所示:
CREATE TABLE `stats` (
`key` int(11) NOT NULL AUTO_INCREMENT,
`u_id` int(11) NOT NULL,
`app` varchar(20) NOT NULL,
`type` varchar(20) DEFAULT '',
`category` varchar(80) DEFAULT '',
`sub_category` varchar(80) DEFAULT '',
`date` int(11) NOT NULL,
`ip` varchar(20) NOT NULL
PRIMARY KEY (`key`)
) ENGINE=MyISAM AUTO_INCREMENT=41094490 DEFAULT CHARSET=utf8;
它是几年前没有想太多就创建的,从那时起就一直在收集数据。它现在有大约 4000 万行。
通过“app”选择需要大约 1 分钟才能完成,这太慢了。我通常参与 PHP 和 Javascript,但我的 MYSQL 知识非常有限。
该表将只需要向其中添加行并进行选择查询。选择查询用于在前端生成使用统计图。
典型的查询将通过匹配 2-4 列值来选择,并且将始终使用日期范围进行选择。通常我希望日期范围为 1 周到 6 个月,但在某些情况下用户可能希望查看几年的数据。优先考虑的是优化前者。
我不介意有一个单独的数据库,根据日期将这些数据分成不同的表,所以每个月的数据可能有一个表。我可以看到这将如何帮助一次查询几个月(使用连接),但是当涉及到几年的数据时,它会变得更慢。
在表结构方面还有什么我可以改变的来改进的吗?将表格分成列数较少的相关表格会更好吗?
我用来测试性能的查询是:
select * from stats where u_id='123' and app='articles'
对此使用 EXPLAIN 函数我得到:
"id","select_type","table","type","possible_keys","key","key_len","ref","rows","Extra"
1,"SIMPLE","stats","ALL",NULL,NULL,NULL,NULL,37462750,"Using where"