2010-11-20 4 views
0

Ich habe eine große MySQL-Tabelle (ca. 5M Zeilen), auf der ich häufig Daten einfügen.Mysql gleichzeitig wählen und langsam die Datenbank einfügen

Diese Tabelle ist das gleiche, ich habe zum Lesen von Daten aus und manchmal auch die gesamte Datenbank wegen der Auswahl Daten langsam wird, während es viele anhängigen Einsätze sind.

Ich habe Indizes für jedes Feld i in der WHERE statment verwenden, so dass ich weiß wirklich nicht, warum wählen Sie so langsam bekommt.

Kann mir jemand einen Hinweis zur Lösung dieses Problems geben?

hier ist die SQL der Tabelle und Abfrage

CREATE TABLE `messages` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `user_id` int(10) unsigned NOT NULL default '0', 
    `dest` varchar(20) character set latin1 default NULL, 
    `body` text character set latin1, 
    `sent_on` timestamp NOT NULL default CURRENT_TIMESTAMP, 
    `md5` varchar(32) character set latin1 NOT NULL default '', 
    `interface` enum('mobile','desktop') default NULL, 
    PRIMARY KEY (`id`), 
    KEY `user_id` (`user_id`), 
    KEY `md5` (`md5`), 
    FULLTEXT KEY `dest` (`dest`,`body`), 
    FULLTEXT KEY `body` (`body`) 
) ENGINE=MyISAM AUTO_INCREMENT=7074256 DEFAULT CHARSET=utf8 

und hier die Abfrage:

EXPLAIN SELECT SQL_CALC_FOUND_ROWS id, sent_on, dest AS who, body,interface FROM messages WHERE user_id = 2 ORDER BY sent_on DESC LIMIT 0,50 \G; 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: messages 
     type: ref 
possible_keys: user_id 
      key: user_id 
     key_len: 4 
      ref: const 
     rows: 13997 
     Extra: Using where; Using filesort 
1 row in set (0.00 sec) 

Antwort

0

Beachten Sie Folgendes in Ihrem EXPLAIN Ausgang abhängen würde:

Extra: Using where; Using filesort 

Die Using filesort bedeutet, dass MySQL Dumping die Abfrage Ergebnisse zu einer Datei, um es zu sortieren, dann lesen Sie die Ergebnisse zurück, um die obersten 50 Zeilen zu erhalten.

Während ich kein Experte bin, denke ich, dass Sie diesen Prozess, indem sie einen Index optimieren könnte, die sowohl die Auswahlkriterien erfüllen können und sortieren, um alle in einem Rutsch; dann kann die Auswahl und Reihenfolge nur durch einen Index-Scan bestimmt werden, ohne jedes Mal das Ergebnis-Set sortieren zu müssen.

In diesem Fall ist Ihr WHERE auf user_id, und Ihr ORDER BY ist auf sent_on. Wenn Sie also für diese beiden Spalten (in dieser Reihenfolge) einen einzelnen Index bereitstellen, kann die Engine die erste Hälfte des Index zum Filtern der Ergebnisse verwenden und weil die zweite Hälfte des Indexes aktiviert ist In der Spalte sent_on sind die Indexergebnisse gemäß dieser Spalte bereits in der richtigen Reihenfolge, sodass MySQL einfach die ersten 50 Ergebnisse aus diesem Index abrufen kann. Keine zusätzliche Sortierung erforderlich.

Haftungsausschluss: Ich bin kein DBA. Ich könnte völlig falsch liegen.

Siehe auch:Mysql.com: Multiple Column Indexes

+0

es könnte eine Lösung sein, habe ich nur einen Index hinzufügen (user_id, sent_on)? – n0cturnal

+0

Probieren Sie es aus und sehen Sie, ob es hilft. ;-P – tylerl

+0

Ich habe diesen Index hinzugefügt, du hast Recht! Filesort ist verschwunden. Ich danke dir sehr! – n0cturnal

0

Vielleicht haben Sie deaktiviert Concurrent Inserts?

+0

So überprüft ...> SHOW VARIABLES LIKE '% gleichzeitiges%'; simultane_insert | 1 – n0cturnal

0

Könnte die ORDER BY Sie verlangsamen? Ich weiß nicht, ob es eine gute Idee zu indizieren sent_on, es auf SELECT vs INSERT Frequenz

+0

ich werde versuchen, diese nacht, es ist unmöglich, so schwere abfrage auf einem großen produktionstisch zu führen. aber danke, ich werde berichten, was passieren wird – n0cturnal