Heim >Datenbank >MySQL-Tutorial >Teilen Sie ein Beispiel für die MySQL-Optimierung
Datenbankoperationen sind heute zunehmend zum Leistungsengpass der gesamten Anwendung geworden, insbesondere bei Webanwendungen. Was die Leistung der Datenbank betrifft, ist dies nicht nur etwas, worüber sich Datenbankadministratoren Sorgen machen müssen, sondern auch wir Programmierer müssen darauf achten. Wenn wir die Datenbanktabellenstruktur entwerfen und die Datenbank betreiben (insbesondere SQL-Anweisungen beim Nachschlagen von Tabellen), müssen wir auf die Leistung von Datenoperationen achten. Hier werden wir nicht zu viel über die Optimierung von SQL-Anweisungen sprechen, sondern uns nur auf MySQL konzentrieren, die Datenbank mit den meisten Webanwendungen. Ich hoffe, dass die folgenden Optimierungstipps für Sie nützlich sind.
1. Tabellenstruktur
CREATE TABLE `room_break_history_tmp_test ` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `break_type` INT(11) DEFAULT NULL, `app_id` INT(11) DEFAULT NULL, `room_id` INT(11) DEFAULT NULL, `from_user_id` INT(11) DEFAULT NULL, `to_user_id` INT(11) DEFAULT NULL, `content_type` INT(11) DEFAULT NULL, `content_name` VARCHAR(300) DEFAULT NULL, `source_message` VARCHAR(1536) DEFAULT NULL, `send_message` VARCHAR(1536) DEFAULT NULL, `request_type` INT(4) DEFAULT NULL, `report_relation` VARCHAR(1536) DEFAULT NULL, `handle_type` INT(11) DEFAULT NULL, `handle_uid` INT(11) DEFAULT NULL, `create_time` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_from_user_id` (`room_id`,`from_user_id`,`handle_type`,`create_time`) ) ENGINE=INNODB AUTO_INCREMENT=3416971 DEFAULT CHARSET=utf8mb4
2. Ausführungsanweisung
DESC SELECT COUNT(1) FROM (SELECT COUNT(1) FROM room_break_history_tmp_test WHERE `create_time` BETWEEN '2017-07-01 22:25:33' AND '2017-07-01 22:27:00' AND handle_type = 5 GROUP BY room_id, from_user_id) AS keywordtemp
3. Ausführungsplan
id select_type table type possible_keys key key_len ref rows Extra ------ ----------- ------------------ ------ ---------------- ---------------- ------- ------ ------- -------------------------- 1 PRIMARY <derived2> ALL (NULL) (NULL) (NULL) (NULL) 3438331 (NULL) 2 DERIVED room_break_history index idx_from_user_id idx_from_user_id 21 (NULL) 3438331 Using where; Using index
4. Ausführungszeit:
Ausführungszeit: 17,182 Sek.
Übertragungszeit: 0,001 Sek.
Gesamt Zeit: 17,184 Sek.
5. Was den Ausführungsplan betrifft, sind der Typ index, key und key_len normal. Es scheint, dass der Index entfernt wurde, aber die Zeilen sind fast vollständige Tabellendatensätze (nicht genau, es handelt sich um einen vollständigen Tabellenscan) ), beträgt die Ausführungszeit für mehr als 3 Millionen Daten tatsächlich 17 Sekunden.
Denken: Nachdem die Nullable des Felds auf nicht null geändert wurde, wird key_len kürzer. Wird den Daten die Beurteilungslogik hinzugefügt, ob es leer ist?
Artikel über null:
Verbesserungen:
1. Index hinzufügen
ALTER TABLE `test`.`room_break_history_tmp_test` -> ADD INDEX `idx_handle_time` (`handle_type`, `create_time`);
2. Ausführungsplan
id select_type table type possible_keys key key_len ref rows Extra ------ ----------- --------------------------- ------ -------------------------------- --------------- ------- ------ ------ -------------------------------------------------------- 1 PRIMARY <derived2> ALL (NULL) (NULL) (NULL) (NULL) 2 (NULL) 2 DERIVED room_break_history_tmp_test range idx_from_user_id,idx_handle_time idx_handle_time 7 (NULL) 1 Using index condition; Using temporary; Using filesort
3. Ausführungszeit: 0,178 Sek.
Übertragungszeit: 0 Sek.Gesamtzeit: 0,179 Sek.
Das obige ist der detaillierte Inhalt vonTeilen Sie ein Beispiel für die MySQL-Optimierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!