Heim  >  Artikel  >  Datenbank  >  Teilen Sie ein Beispiel für die MySQL-Optimierung

Teilen Sie ein Beispiel für die MySQL-Optimierung

零下一度
零下一度Original
2017-07-17 10:03:331454Durchsuche
  1. 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.

  2. 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn