Índices MySQL - quais são as melhores práticas de acordo com esta tabela e consultas
Eu tenho esta tabela (linha 500.000)
CREATE TABLE IF NOT EXISTS `listings` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`type` tinyint(1) NOT NULL DEFAULT '1',
`hash` char(32) NOT NULL,
`source_id` int(10) unsigned NOT NULL,
`link` varchar(255) NOT NULL,
`short_link` varchar(255) NOT NULL,
`cat_id` mediumint(5) NOT NULL,
`title` mediumtext NOT NULL,
`description` mediumtext,
`content` mediumtext,
`images` mediumtext,
`videos` mediumtext,
`views` int(10) unsigned NOT NULL,
`comments` int(11) DEFAULT '0',
`comments_update` int(11) NOT NULL DEFAULT '0',
`editor_id` int(11) NOT NULL DEFAULT '0',
`auther_name` varchar(255) DEFAULT NULL,
`createdby_id` int(10) NOT NULL,
`createdon` int(20) NOT NULL,
`editedby_id` int(10) NOT NULL,
`editedon` int(20) NOT NULL,
`deleted` tinyint(1) NOT NULL,
`deletedon` int(20) NOT NULL,
`deletedby_id` int(10) NOT NULL,
`deletedfor` varchar(255) NOT NULL,
`published` tinyint(1) NOT NULL DEFAULT '1',
`publishedon` int(11) unsigned NOT NULL,
`publishedby_id` int(10) NOT NULL,
PRIMARY KEY (`id`),
KEY `hash` (`hash`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Estou pensando em fazer cada consulta pelopublishedon between x and y
(mostrar em todo o site apenas registros de 1 mês)
ao mesmo tempo, quero adicionar com opublishedon
na cláusula wherepublished, cat_id , source_id
algo assim:
SELECT * FROM listings
WHERE (publishedon BETWEEN 1441105258 AND 1443614458)
AND (published = 1)
AND (cat_id in(1,2,3,4,5))
AND (source_id in(1,2,3,4,5))
essa consulta está ok e rápida até agora sem indexação, mas ao tentar usarorder by publishedon
ficou muito lento, então eu usei esse índice
CREATE INDEX `listings_pcs` ON listings(
`publishedon` DESC,
`published` ,
`cat_id` ,
`source_id`
)
funcionou e oorder by publishedon
tornou-se rápido, agora eu queroorder by views
como isso
SELECT * FROM listings
WHERE (publishedon BETWEEN 1441105258 AND 1443614458)
AND (published = 1)
AND (cat_id in(1,2,3,4,5))
AND (source_id in(1,2,3,4,5))
ORDER BY views DESC
esta é a explicaçãoesta consulta é muito lenta por causa deORDER BY views DESC
então eu tentei soltar o índice antigo e adicionar este
CREATE INDEX `listings_pcs` ON listings(
`publishedon` DESC,
`published` ,
`cat_id` ,
`source_id`,
`views` DESC
)
é muito lento também
e se eu usar apenas um índice empublishedon
? que tal usar o índice único em cat_id, source_id, views, Publishedon?
posso alterar as dependências da consulta, como as publicadas em um mês, se eu encontrar outro método de indexação que depende de outras colunas
que tal criar índice (cat_id
, source_id
, publishedon
, published
)? mas em alguns casos vou usar apenas o source_id?
qual é o melhor esquema de indexação para essa tabela