Индексы 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?
Какова лучшая схема индексации для этой таблицы