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

Antworten auf die Frage(8)

Ihre Antwort auf die Frage