Í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

questionAnswers(4)

yourAnswerToTheQuestion