Индексы MySQL - каковы лучшие практики согласно этой таблице и запросам

у меня есть эта таблица (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;

я думаю сделать каждый запросpublishedon between x and y (покажи на всем сайте только записи за 1 месяц)

в то же время, я хочу добавить сpublishedon в пункте, гдеpublished, cat_id , source_id

что-то вроде этого:

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 publishedon он стал слишком медленным, поэтому я использовал этот индекс

CREATE INDEX `listings_pcs` ON listings(
    `publishedon` DESC,
    `published` ,
    `cat_id` ,
    `source_id`
)

это сработало иorder by publishedon стало быстро, теперь я хочуorder by views как это

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

это объяснениеэтот запрос слишком медленный из-заORDER BY views DESC

Затем я попытался отбросить старый индекс и добавить это

CREATE INDEX `listings_pcs` ON listings(
    `publishedon` DESC,
    `published` ,
    `cat_id` ,
    `source_id`,
    `views` DESC
)

это слишком медленно

Что делать, если я использую только один индекс наpublishedon? как насчет использования единого индекса для cat_id, source_id, views, опубликованных на?

я могу изменить зависимости запроса, такие как опубликованные, за один месяц, если я обнаружу, что другой метод индексации зависит от других столбцов

как насчет создания индекса в (cat_id, source_id, publishedon, published) но в некоторых случаях я буду использовать только source_id?

Какова лучшая схема индексации для этой таблицы

Ответы на вопрос(4)

Ваш ответ на вопрос