MySQL-Indizes - Was sind die empfohlenen Vorgehensweisen für diese Tabelle und Abfragen
Ich habe diese Tabelle (500.000 Zeilen)
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;
Ich denke, jede Abfrage von der @ zu machpublishedon between x and y
(Auf der gesamten Website nur Aufzeichnungen von 1 Monat anzeigen)
gleichzeitig möchte ich mit dem @ hinzufügpublishedon
in der where-Klauselpublished, cat_id , source_id
etwas wie das
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))
diese Abfrage ist in Ordnung und schnell, bis jetzt ohne Indizierung, aber wenn Sie versuchen, @ zu verwendorder by publishedon
Es ist zu langsam geworden, also habe ich diesen Index benutzt
CREATE INDEX `listings_pcs` ON listings(
`publishedon` DESC,
`published` ,
`cat_id` ,
`source_id`
)
s hat funktioniert und dasorder by publishedon
wurde schnell, jetzt möchte ichorder by views
so wa
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
dies ist die Erklärung Diese Abfrage ist zu langsam wegenORDER BY views DESC
then Ich bin versucht, den alten Index zu löschen und diese hinzufügen
CREATE INDEX `listings_pcs` ON listings(
`publishedon` DESC,
`published` ,
`cat_id` ,
`source_id`,
`views` DESC
)
s ist auch zu langs
Was ist, wenn ich nur einen Index für @ verwendpublishedon
? Was ist mit der Verwendung eines einzelnen Index für cat_id, source_id, views, publishedon?
Ich kann die Abfrage-Abhängigkeiten wie Publishedon in einem Monat ändern, wenn ich herausgefunden habe, dass andere Indizierungsmethoden von anderen Spalten abhängen.
was über Index machen in cat_id
, source_id
, publishedon
, published
)? aber in einigen Fällen verwende ich nur source_id?
was ist das beste Indizierungsschema für diese Tabelle