MySQL Performance Tuning für Entwickler

FromDual GmbH
FromDual GmbHSenior MySQL Consultant and CTO at FromDual GmbH
www.fromdual.com
1 / 18
MySQL Performance Tuning
für Entwickler
Cebit 2015, Hannover
Oli Sennhauser
Senior MySQL Consultant, FromDual GmbH
oli.sennhauser@fromdual.com
www.fromdual.com
2 / 18
FromDual GmbH
Support
remote-DBA
Schulung
Beratung
www.fromdual.com
3 / 18
Datenbank Performance
Über was reden wir eigentlich genau?
● Durchsatz (throughput)
● z. B. Business-Transaktionen pro Minute
● Antwortzeit (Latenz, response time)
● z.B. Business-Transaktion dauert 7.2 Sekunden im Schnitt
Über was redet Marketing?
● Durchsatz, Skalierbarkeit von DB-Queries
Gap!
● 95% der Nutzer haben ein Latenz-Problem
● 5% ein Durchsatz/Skalierungs-Problem
www.fromdual.com
4 / 18
Durchsatz nimmt zu
www.fromdual.com
5 / 18
Antwortzeit nimmt zu!
www.fromdual.com
6 / 18
Wo ist meine Zeit geblieben?
● Antwortzeit meiner Business-Transaktion
● d. h. Zeit messen!!!
● Applikation mit „Probes“ versehen
● Profiler (PHP (XDebug), Java (Jprofiler), ...)
● Profil erstellen:
function x() {
  start = current_time();
  count[x]++;
  …
  end = current_time();
  duration[x] += (end ­ start);
}
function   count   time
x            123     156.25     0.8%
y             19     827.30     4.1%
z              2   19280.00    95.1%
Total        144   20263.55   100.0%
time
a
b
c
d
e
f
g h j
i
www.fromdual.com
7 / 18
End-to-End Profile
● Idealfall: End-to-End Profile:
● Round-Trip pro Business-Transaktion
Web-Client
Network
Web-Server
Application
DB
Network
Fat-Client
Connector
…%
…%
…%
…%
…%
…%
Menge der Daten?
Anzahl Round-Trips?
Queries pro B-trx?
NW-Latenz?
www.fromdual.com
8 / 18
General Query Log
● Alle Queries werden gelogged:
● Gut bei:
● Frameworks
● Fremdapplikationen
● Beispiel:
● CMS: 1 Änderung (30 s)
● → 30'000 Queries in der DB (ca. 1 ms/Query)
+­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+
| Variable_name    | Value       |
+­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+
| general_log      | OFF         |
| general_log_file | general.log |
+­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+
www.fromdual.com
9 / 18
Ist die Datenbank schuld?
● Angenommen die Business-Trx verbringt viel
Zeit in der DB:
● Dann ist NICHT zwingend die DB schuld!
● SISO Prinzip?
● 1 Connection = 1 Query = 1 Thread = 1 Core
● Heute: Viel Memory, SSD
→ Oft ist/wird wieder die CPU der Flaschenhals
● Wie gucken?
vmstat, top, iostat
www.fromdual.com
10 / 18
Performance-Waage
● Wo ansetzen?
● HW, OS, DB Konfiguration, Applikation
Architektur und Design
● Typischerweise NICHT DB-Konfiguration
● (Defaults sind besser geworden!)
● DB Konfiguration: 9 Variablen, dann ist gut!
www.fromdual.com
11 / 18
Des Admins Bazooka
● Wenig Reaktionszeit:
● SHOW [FULL] PROCESSLIST;
● System entspannen:
● KILL [CONNECTION | QUERY] id;
mysql> SHOW PROCESSLIST;
+­­­­­+­­­­­­­+­­­­­­+­­­­­­­­­+­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+
| Id  | User  | db   | Command | Time | State        | Info                                            |
+­­­­­+­­­­­­­+­­­­­­+­­­­­­­­­+­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+
| 146 | live  | live | Query   |  710 | Sending data | SELECT COUNT(*) FROM (SELECT DISTINCT(nid), ... |
| 240 | live  | live | Query   |  467 | Sending data | SELECT COUNT(*) FROM (SELECT DISTINCT(nid), ... |
| 272 | live  | live | Query   |  275 | Sending data | SELECT COUNT(*) FROM (SELECT DISTINCT(nid), ... |
| 323 | live  | live | Query   |   79 | Sending data | SELECT COUNT(*) FROM (SELECT DISTINCT(nid), ... |
| 374 | admin | NULL | Query   |    0 | NULL         | SHOW PROCESSLIST                                |
+­­­­­+­­­­­­­+­­­­­­+­­­­­­­­­+­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+
mysql> KILL CONNECTION 146
www.fromdual.com
12 / 18
Slow Query Log
● Etwas systematischer:
● Slow Query Log
● Auswerten:
● mysqldumpslow ­s t slow.log > profile
+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­+
| Variable_name                          | Value    |
+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­+
| log_queries_not_using_indexes          | ON       |
| long_query_time                        | 0.500000 |
| slow_query_log                         | OFF      |
| slow_query_log_file                    | slow.log |
| min_examined_row_limit                 | 100      |
+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­+
www.fromdual.com
13 / 18
Graphisch: Query Analyzer
www.fromdual.com
14 / 18
Harte Arbeit
● Sammeln und Schauen (Slow Query Log)
● Verstehen (Query Execution Plan (QEP))
● EXPLAIN SELECT COUNT(*) FROM ...
● Denken
● Wo lege ich den Index an...
● Tipp 5.7: EXPLAIN anderer Connection:
EXPLAIN FOR CONNECTION connection_id;
www.fromdual.com
15 / 18
Query Execution Plan (QEP)
EXPLAIN
SELECT domain
  FROM newsite_domain AS nd
  JOIN newsite_main AS nm ON nd.id = nm.id 
 WHERE nm.gbot_indexer = '62'
   AND (nm.state=2 OR nm.state=3 OR nm.state=9)
;
+­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­+
| table | type   | possible_keys      | key        | ref          | rows   | Extra       |
+­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­+
| nm    | range  | PRIMARY,site_state | site_state | NULL         | 150298 | Using where |
| nd    | eq_ref | PRIMARY            | PRIMARY    | jobads.nm.id |      1 |             |
+­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­+
CREATE TABLE `newsite_main` (
  ...
  PRIMARY KEY  (`id`),
  KEY `site_state` (`state`)
);
 
www.fromdual.com
16 / 18
Indexieren
● Der Schlüssel zur besseren Query Performance
sind Indices
● Wo setzen wir Indices:
● Jede Tabelle hat einen Primary Key!
● Dort wo gejoined wird
● Wo gute Filter vorhanden sind (WHERE a = ...)
● Spezialfälle
● Covering Index
● Index zu ORDER BY Optimierung
● PK zur Verbesserung der Lokalität der Daten
www.fromdual.com
17 / 18
Wir suchen noch:
MySQL Datenbank Enthusiast/in für
Support / remote-DBA / Beratung
www.fromdual.com
18 / 18
Q & A
Fragen ?
Diskussion?
Wir haben Zeit für ein persönliches Gespräch...
● FromDual bietet neutral und unabhängig:
● Beratung
● Remote-DBA
● Support für MySQL, Galera, Percona Server und MariaDB
● Schulung
www.fromdual.com/presentations
1 de 18

Recomendados

NoSQL with MySQLNoSQL with MySQL
NoSQL with MySQLFromDual GmbH
636 vistas32 diapositivas
MySQL Backup/RecoveryMySQL Backup/Recovery
MySQL Backup/RecoveryFromDual GmbH
844 vistas26 diapositivas
MySQL BackupMySQL Backup
MySQL BackupFromDual GmbH
1.8K vistas22 diapositivas
MySQL - New Features 5.6MySQL - New Features 5.6
MySQL - New Features 5.6FromDual GmbH
702 vistas20 diapositivas

Más contenido relacionado

La actualidad más candente(20)

DOAG 2011: MySQL ReplicationDOAG 2011: MySQL Replication
DOAG 2011: MySQL Replication
FromDual GmbH678 vistas
DOAG 2011: MySQL Performance TuningDOAG 2011: MySQL Performance Tuning
DOAG 2011: MySQL Performance Tuning
FromDual GmbH576 vistas
MySQL Replication for BeginnersMySQL Replication for Beginners
MySQL Replication for Beginners
FromDual GmbH1K vistas
FROSCON 2011: MySQL Performance TuningFROSCON 2011: MySQL Performance Tuning
FROSCON 2011: MySQL Performance Tuning
FromDual GmbH704 vistas
FROSCON 2011: MySQL ReplicationFROSCON 2011: MySQL Replication
FROSCON 2011: MySQL Replication
FromDual GmbH614 vistas
DAOG SIG: HA Architekturen mit MySQLDAOG SIG: HA Architekturen mit MySQL
DAOG SIG: HA Architekturen mit MySQL
FromDual GmbH531 vistas
MySQL HA and SecurityMySQL HA and Security
MySQL HA and Security
FromDual GmbH473 vistas
MySQL HochverfügbarkeitslösungenMySQL Hochverfügbarkeitslösungen
MySQL Hochverfügbarkeitslösungen
Lenz Grimmer963 vistas
Ausgewählte PL/SQL Packages (1)Ausgewählte PL/SQL Packages (1)
Ausgewählte PL/SQL Packages (1)
Ulrike Schwinn2.6K vistas
Exadata with VM as Consolidation PlattformExadata with VM as Consolidation Plattform
Exadata with VM as Consolidation Plattform
Daniele Massimi872 vistas
HazelcastHazelcast
Hazelcast
Korhan Gülseven420 vistas

Destacado(19)

MySQL Server Settings TuningMySQL Server Settings Tuning
MySQL Server Settings Tuning
guest5ca94b2.2K vistas
Performance TuningPerformance Tuning
Performance Tuning
Ligaya Turmelle1.4K vistas
Perf Tuning ShortPerf Tuning Short
Perf Tuning Short
Ligaya Turmelle17K vistas
MySQL Performance Tuning VariablesMySQL Performance Tuning Variables
MySQL Performance Tuning Variables
FromDual GmbH2.2K vistas
MySQL Performance TuningMySQL Performance Tuning
MySQL Performance Tuning
FromDual GmbH13.3K vistas
Performance Tuning Best PracticesPerformance Tuning Best Practices
Performance Tuning Best Practices
webhostingguy3.5K vistas
MySQL查询优化浅析MySQL查询优化浅析
MySQL查询优化浅析
frogd10.4K vistas
MySQL Manchester TT  - Performance TuningMySQL Manchester TT  - Performance Tuning
MySQL Manchester TT - Performance Tuning
Mark Swarbrick449 vistas
MySQL Performance Tips & Best PracticesMySQL Performance Tips & Best Practices
MySQL Performance Tips & Best Practices
Isaac Mosquera11.7K vistas
Mysql Explain ExplainedMysql Explain Explained
Mysql Explain Explained
Jeremy Coates63K vistas
How to Design Indexes, ReallyHow to Design Indexes, Really
How to Design Indexes, Really
Karwin Software Solutions LLC134.5K vistas
Mysql performance tuningMysql performance tuning
Mysql performance tuning
Philip Zhong1.9K vistas

Similar a MySQL Performance Tuning für Entwickler(20)

AdminCamp 2011 PerformanceAdminCamp 2011 Performance
AdminCamp 2011 Performance
Ulrich Krause2.2K vistas
Datenbank-Hausputz für EinsteigerDatenbank-Hausputz für Einsteiger
Datenbank-Hausputz für Einsteiger
Markus Flechtner22 vistas
Webinar  - SAP GatewayWebinar  - SAP Gateway
Webinar - SAP Gateway
Cadaxo GmbH496 vistas

Más de FromDual GmbH(18)

MariaDB 10.4 New FeaturesMariaDB 10.4 New Features
MariaDB 10.4 New Features
FromDual GmbH406 vistas
MariaDB 10.2 New FeaturesMariaDB 10.2 New Features
MariaDB 10.2 New Features
FromDual GmbH387 vistas
PERFORMANCE_SCHEMA and sys schemaPERFORMANCE_SCHEMA and sys schema
PERFORMANCE_SCHEMA and sys schema
FromDual GmbH909 vistas
MySQL Security SLAC 2015MySQL Security SLAC 2015
MySQL Security SLAC 2015
FromDual GmbH559 vistas
Reading MySQL fingerprintsReading MySQL fingerprints
Reading MySQL fingerprints
FromDual GmbH631 vistas
MySQL always-up with Galera ClusterMySQL always-up with Galera Cluster
MySQL always-up with Galera Cluster
FromDual GmbH1.2K vistas
HA with GaleraHA with Galera
HA with Galera
FromDual GmbH695 vistas
MySQL Indexierung CeBIT 2014MySQL Indexierung CeBIT 2014
MySQL Indexierung CeBIT 2014
FromDual GmbH566 vistas
Need for Speed: Mysql indexingNeed for Speed: Mysql indexing
Need for Speed: Mysql indexing
FromDual GmbH1.3K vistas
MySQL for Oracle DBAsMySQL for Oracle DBAs
MySQL for Oracle DBAs
FromDual GmbH812 vistas
MySQL High Availability SolutionsMySQL High Availability Solutions
MySQL High Availability Solutions
FromDual GmbH956 vistas
MySQL SecurityMySQL Security
MySQL Security
FromDual GmbH461 vistas

MySQL Performance Tuning für Entwickler

  • 1. www.fromdual.com 1 / 18 MySQL Performance Tuning für Entwickler Cebit 2015, Hannover Oli Sennhauser Senior MySQL Consultant, FromDual GmbH oli.sennhauser@fromdual.com
  • 2. www.fromdual.com 2 / 18 FromDual GmbH Support remote-DBA Schulung Beratung
  • 3. www.fromdual.com 3 / 18 Datenbank Performance Über was reden wir eigentlich genau? ● Durchsatz (throughput) ● z. B. Business-Transaktionen pro Minute ● Antwortzeit (Latenz, response time) ● z.B. Business-Transaktion dauert 7.2 Sekunden im Schnitt Über was redet Marketing? ● Durchsatz, Skalierbarkeit von DB-Queries Gap! ● 95% der Nutzer haben ein Latenz-Problem ● 5% ein Durchsatz/Skalierungs-Problem
  • 6. www.fromdual.com 6 / 18 Wo ist meine Zeit geblieben? ● Antwortzeit meiner Business-Transaktion ● d. h. Zeit messen!!! ● Applikation mit „Probes“ versehen ● Profiler (PHP (XDebug), Java (Jprofiler), ...) ● Profil erstellen: function x() {   start = current_time();   count[x]++;   …   end = current_time();   duration[x] += (end ­ start); } function   count   time x            123     156.25     0.8% y             19     827.30     4.1% z              2   19280.00    95.1% Total        144   20263.55   100.0% time a b c d e f g h j i
  • 7. www.fromdual.com 7 / 18 End-to-End Profile ● Idealfall: End-to-End Profile: ● Round-Trip pro Business-Transaktion Web-Client Network Web-Server Application DB Network Fat-Client Connector …% …% …% …% …% …% Menge der Daten? Anzahl Round-Trips? Queries pro B-trx? NW-Latenz?
  • 8. www.fromdual.com 8 / 18 General Query Log ● Alle Queries werden gelogged: ● Gut bei: ● Frameworks ● Fremdapplikationen ● Beispiel: ● CMS: 1 Änderung (30 s) ● → 30'000 Queries in der DB (ca. 1 ms/Query) +­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+ | Variable_name    | Value       | +­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+ | general_log      | OFF         | | general_log_file | general.log | +­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+
  • 9. www.fromdual.com 9 / 18 Ist die Datenbank schuld? ● Angenommen die Business-Trx verbringt viel Zeit in der DB: ● Dann ist NICHT zwingend die DB schuld! ● SISO Prinzip? ● 1 Connection = 1 Query = 1 Thread = 1 Core ● Heute: Viel Memory, SSD → Oft ist/wird wieder die CPU der Flaschenhals ● Wie gucken? vmstat, top, iostat
  • 10. www.fromdual.com 10 / 18 Performance-Waage ● Wo ansetzen? ● HW, OS, DB Konfiguration, Applikation Architektur und Design ● Typischerweise NICHT DB-Konfiguration ● (Defaults sind besser geworden!) ● DB Konfiguration: 9 Variablen, dann ist gut!
  • 11. www.fromdual.com 11 / 18 Des Admins Bazooka ● Wenig Reaktionszeit: ● SHOW [FULL] PROCESSLIST; ● System entspannen: ● KILL [CONNECTION | QUERY] id; mysql> SHOW PROCESSLIST; +­­­­­+­­­­­­­+­­­­­­+­­­­­­­­­+­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | Id  | User  | db   | Command | Time | State        | Info                                            | +­­­­­+­­­­­­­+­­­­­­+­­­­­­­­­+­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | 146 | live  | live | Query   |  710 | Sending data | SELECT COUNT(*) FROM (SELECT DISTINCT(nid), ... | | 240 | live  | live | Query   |  467 | Sending data | SELECT COUNT(*) FROM (SELECT DISTINCT(nid), ... | | 272 | live  | live | Query   |  275 | Sending data | SELECT COUNT(*) FROM (SELECT DISTINCT(nid), ... | | 323 | live  | live | Query   |   79 | Sending data | SELECT COUNT(*) FROM (SELECT DISTINCT(nid), ... | | 374 | admin | NULL | Query   |    0 | NULL         | SHOW PROCESSLIST                                | +­­­­­+­­­­­­­+­­­­­­+­­­­­­­­­+­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ mysql> KILL CONNECTION 146
  • 12. www.fromdual.com 12 / 18 Slow Query Log ● Etwas systematischer: ● Slow Query Log ● Auswerten: ● mysqldumpslow ­s t slow.log > profile +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­+ | Variable_name                          | Value    | +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­+ | log_queries_not_using_indexes          | ON       | | long_query_time                        | 0.500000 | | slow_query_log                         | OFF      | | slow_query_log_file                    | slow.log | | min_examined_row_limit                 | 100      | +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­+
  • 14. www.fromdual.com 14 / 18 Harte Arbeit ● Sammeln und Schauen (Slow Query Log) ● Verstehen (Query Execution Plan (QEP)) ● EXPLAIN SELECT COUNT(*) FROM ... ● Denken ● Wo lege ich den Index an... ● Tipp 5.7: EXPLAIN anderer Connection: EXPLAIN FOR CONNECTION connection_id;
  • 15. www.fromdual.com 15 / 18 Query Execution Plan (QEP) EXPLAIN SELECT domain   FROM newsite_domain AS nd   JOIN newsite_main AS nm ON nd.id = nm.id   WHERE nm.gbot_indexer = '62'    AND (nm.state=2 OR nm.state=3 OR nm.state=9) ; +­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­+ | table | type   | possible_keys      | key        | ref          | rows   | Extra       | +­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­+ | nm    | range  | PRIMARY,site_state | site_state | NULL         | 150298 | Using where | | nd    | eq_ref | PRIMARY            | PRIMARY    | jobads.nm.id |      1 |             | +­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­+ CREATE TABLE `newsite_main` (   ...   PRIMARY KEY  (`id`),   KEY `site_state` (`state`) );  
  • 16. www.fromdual.com 16 / 18 Indexieren ● Der Schlüssel zur besseren Query Performance sind Indices ● Wo setzen wir Indices: ● Jede Tabelle hat einen Primary Key! ● Dort wo gejoined wird ● Wo gute Filter vorhanden sind (WHERE a = ...) ● Spezialfälle ● Covering Index ● Index zu ORDER BY Optimierung ● PK zur Verbesserung der Lokalität der Daten
  • 17. www.fromdual.com 17 / 18 Wir suchen noch: MySQL Datenbank Enthusiast/in für Support / remote-DBA / Beratung
  • 18. www.fromdual.com 18 / 18 Q & A Fragen ? Diskussion? Wir haben Zeit für ein persönliches Gespräch... ● FromDual bietet neutral und unabhängig: ● Beratung ● Remote-DBA ● Support für MySQL, Galera, Percona Server und MariaDB ● Schulung www.fromdual.com/presentations