背景资料:
我有一个包含上传信息的表格,每天我都会收到越来越多的上传,但我运行的大部分查询都围绕着过去 12 个月内收集的信息;它经常使用更严格的时间范围,并且查询仅限于过去 30 天内收集的信息
该系统从 2004 年开始存在,当时有 400 个上传,今天有 2+ 百万
表结构:
CREATE TABLE `data_mediagallery` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` tinyint(3) unsigned NOT NULL DEFAULT '0',
`contenttype` char(40) NOT NULL DEFAULT '',
`filename` varchar(100) NOT NULL DEFAULT '',
`injector` char(40) NOT NULL DEFAULT '',
`hits` int(11) DEFAULT '0',
`message` longtext,
`date` datetime DEFAULT NULL,
`title` varchar(80) NOT NULL DEFAULT '',
`tags` varchar(255) NOT NULL DEFAULT '',
`metadata` blob,
`location` char(8) NOT NULL DEFAULT '',
`uid` int(11) unsigned NOT NULL DEFAULT '0',
`filesize` bigint(20) NOT NULL DEFAULT '0',
`upload` datetime DEFAULT NULL,
`privacy` tinyint(3) unsigned NOT NULL DEFAULT '0',
`width` int(10) unsigned NOT NULL DEFAULT '0',
`height` int(10) unsigned NOT NULL DEFAULT '0',
`offensive` int(10) unsigned NOT NULL DEFAULT '0',
`sourcelocation` char(8) NOT NULL DEFAULT '',
`autoblog` tinyint(1) NOT NULL DEFAULT '0',
`extension` char(10) NOT NULL DEFAULT '',
`filetype` tinyint(3) unsigned NOT NULL DEFAULT '0',
`conversiontime` float NOT NULL DEFAULT '0',
`converttime` datetime DEFAULT NULL,
`sender` varchar(100) NOT NULL DEFAULT '',
`vhost` int(10) unsigned NOT NULL DEFAULT '0',
`channel` int(10) unsigned NOT NULL DEFAULT '0',
`rotation` tinyint(3) unsigned NOT NULL DEFAULT '0',
`ofilesize` bigint(20) NOT NULL DEFAULT '0',
`moderationstatus` tinyint(3) unsigned NOT NULL DEFAULT '0',
`rating` decimal(8,6) DEFAULT NULL,
`votecount` int(10) unsigned NOT NULL DEFAULT '0',
`url` varchar(150) NOT NULL DEFAULT '',
`geo_latitude` double DEFAULT NULL,
`geo_longitude` double DEFAULT NULL,
`length` decimal(8,2) DEFAULT '0.00',
`parentid` int(11) NOT NULL DEFAULT '0',
`language` char(2) NOT NULL DEFAULT '',
`author` varchar(100) NOT NULL DEFAULT '',
`context` tinyint(3) unsigned NOT NULL DEFAULT '0',
`externalid` varchar(255) DEFAULT NULL,
`originalsaved` bit(1) NOT NULL DEFAULT b'1',
`hidden` tinyint(4) NOT NULL DEFAULT '0',
`commentcount` int(11) NOT NULL DEFAULT '0',
`approvedcomments` int(11) NOT NULL DEFAULT '0',
`notdeniedcomments` int(11) NOT NULL DEFAULT '0',
`lastupdatetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`channelleft` int(10) unsigned NOT NULL DEFAULT '0',
`originalLocation` char(8) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `upload` (`upload`),
KEY `vhostupload` (`vhost`,`upload`),
KEY `vhostmodstatus` (`vhost`,`status`,`moderationstatus`,`uid`),
KEY `complexfiletype` (`vhost`,`status`,`moderationstatus`,`filetype`,`channel`),
KEY `vhostcontext` (`vhost`,`moderationstatus`,`context`,`parentid`,`status`,`filetype`),
KEY `externalid` (`externalid`),
KEY `externalcomments`.
KEY `vhostchannel` (`vhost`,`status`,`moderationstatus`,`context`,`channelleft`)
) ENGINE=InnoDB;
问题
有没有一种方法可以对最有意义的表进行分区?分区甚至有意义吗?如果做分区,新数据怎么处理?
为什么要分区?是你成绩不好,还是有其他原因?
我没有看到 lastupdatetime 列的索引,并且您写道您经常查询它。
分区的替代方法是为每年创建表,并使用合并表来访问您需要的子集。
本来就留个评论,唉,名气不够。