Informações básicas:
Eu tenho uma tabela contendo informações de upload, todos os dias recebo mais e mais uploads, mas a maioria das consultas que faço giram em torno de informações coletadas nos últimos 12 meses; freqüentemente usa uma escala de tempo ainda mais apertada e as consultas são restritas a informações coletadas nos últimos 30 dias
Este sistema existe desde 2004, quando havia 400 uploads, hoje existem mais de 2 milhões
Estrutura da tabela:
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;
Perguntas
Existe uma maneira de particionar a tabela que faria mais sentido? O particionamento faz sentido? Como faço para lidar com novos dados se eu particionar?
Por que você deseja particionar? Seu desempenho não é bom ou você tem outros motivos?
Não vejo um índice para a coluna lastupdatetime e você escreveu que a consulta muito.
Uma alternativa ao particionamento pode ser criar tabelas para cada ano e usar tabelas de mesclagem para acessar os subconjuntos necessários.
Teria acabado de deixar um comentário, infelizmente, reputação não é suficiente.