Need for Speed: Indexierung unter MySQL

Ähnliche Dokumente
MySQL Performance Tuning für Entwickler

MySQL Performance Tuning für Entwickler

MySQL Cluster mit Galera

MySQL Replikation - Die Eier legende Wollmilchsau?

MySQL High Availability. DOAG 2013 Datenbank. 14. Mai 2013, Düsseldorf. Oli Sennhauser

MySQL Performance Tuning

DBS ::: SERIE 5. Join Right Semi- Join Left Semi-Join Projektion Selektion Fremdschlüssel. Kreuzprodukt

SQL und MySQL. Kristian Köhntopp

MySQL Backup und Restore

Beispiel 1: Filmdatenbank

Performance Tuning & Scale-Out mit MySQL

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

mit Musterlösungen Prof. Dr. Gerd Stumme, Dipl.-Inform. Christoph Schmitz 11. Juni 2007

MIN oder MAX Bildung per B*Tree Index Hint

MySQL New Features 5.6

Einstieg in das SQL- und Datenbanktuning Loblied auf den Tabellen-Index!

Datenbanken Microsoft Access 2010

Oracle 9i Einführung Performance Tuning

MySQL: Einfaches Rechnen.

MySQL Replikation Neue Features in 5.5 und 5.6

Urs Meier Art der Info Technical Info (Februar 2002) Aus unserer Projekterfahrung und Forschung

Informatik 12 Datenbanken SQL-Einführung

Datenbanken für Online Untersuchungen

MySQL Query Tuning. DOAG K & A 2017, Nürnberg. Oli Sennhauser. Senior MySQL Berater, FromDual GmbH.

SQL für Trolle. mag.e. Dienstag, Qt-Seminar

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser

Cassandra Query Language (CQL)

Datumsangaben, enthält mindestens Jahr, Monat, Tag

SQL. strukturierte Datenbankabfragesprache eine Datenbanksprache zur. Structured Query Language:

PostgreSQL in großen Installationen

Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum:

Referenzielle Integrität SQL

Datenbanksysteme 2 Frühjahr-/Sommersemester Mai 2014

SQL structured query language

Indexing und Performance Tuning

Im Original veränderbare Word-Dateien

MySQL 5.1. Kristian Köhntopp

Grundlagen Datenbanken Sommersemester 2008

Fakultät für Informatik & Wirtschaftsinformatik DB & IS II - SS Metadaten

SQL Teil 2. SELECT Projektion Selektion Vereinigung, Schnitt, Differenz Verbund Komplexer SELECT-Ausdruck

Aufgaben zu XPath und XQuery

Projektbericht Gruppe 12. Datenbanksysteme WS 05/ 06. Gruppe 12. Martin Tintel Tatjana Triebl. Seite 1 von 11

Mengenvergleiche: Alle Konten außer das, mit dem größten Saldo.

Hinweise zur Installation von MySQL

SQL: statische Integrität

HA Architekturen mit MySQL

Einführung in SQL. Sprachumfang: Indizes. Datensätzen. Zugriffsrechten

Kapitel 33. Der xml-datentyp. In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023

Universität Augsburg, Institut für Informatik WS 2006/2007 Dr. W.-T. Balke 27. Nov M. Endres, A. Huhn, T. Preisinger Lösungsblatt 5

Relationales Modell: SQL-DDL. SQL als Definitionssprache. 7. Datenbankdefinitionssprachen. Anforderungen an eine relationale DDL

SQL-Optimizer und Optimierung bei DB2

<script type="text/javascript"> <! <%= page(page.searchsuggestionsscript) %> // > </script>

Labor 3 - Datenbank mit MySQL

Deutsches Rotes Kreuz. Kopfschmerztagebuch von:

FastBill Automatic. Dokumentation Notifications. FastBill GmbH. Holteyer Straße Essen Telefon Telefax

Professionelle Seminare im Bereich MS-Office

Einrichten einer mehrsprachigen Webseite mit Joomla (3.3.6)

Fachhochschule Deggendorf Platzziffer:...

SQL-Injection. Seite 1 / 16

Tutorium zur Mikroökonomie II WS 02/03 Universität Mannheim Tri Vi Dang. Aufgabenblatt 3 (KW 44) ( )

Die bisher bereits bekannten Aggregatsfunktionen MIN, MAX, SUM, AVG, COUNT, VARIANCE und STDDEV wurden um FIRST und LAST erweitert.

105.3 SQL-Datenverwaltung

Informationsblatt Induktionsbeweis

SQL Tutorial. SQL - Tutorial SS 06. Hubert Baumgartner. INSO - Industrial Software

Webalizer HOWTO. Stand:

Probeklausur im Modul Informationstechnik 1, WS 2003/04. Studiengang IWD 1. Semester Seite 1 von 5

Sie sollen eine Datenbank für Befragungen mittels Online-Fragebögen zu unterschiedlichen Themen erstellen:

Abfrage-Befehle in MySQL -diverse Funktionen -

Bibliografische Informationen digitalisiert durch

Well-Balanced. Performance Tuning

OECD Programme for International Student Assessment PISA Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

CAQ Software für Ihr Qualitätsmanagement. Ablauf für die Erfassung der Fehler in der Fertigung

inviu routes Installation und Erstellung einer ENAiKOON id

E-Finance Java de PF

Anleitung zu GermanLegal 1.3

Mehrere Diagramme zu einer Darstellung kombinieren

MySQL Cluster und MySQL Proxy

Checkliste. zur Gesprächsvorbereitung Mitarbeitergespräch. Aktivität / Frage Handlungsbedarf erledigt

Qualität und Verlässlichkeit Das verstehen die Deutschen unter Geschäftsmoral!

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Kulturelle Evolution 12

ORM & OLAP. Object-oriented Enterprise Application Programming Model for In-Memory Databases. Sebastian Oergel

Whitepaper. Produkt: combit Relationship Manager. Einbindung externer FiBu-/Warenwirtschaftsdaten. combit GmbH Untere Laube Konstanz

Erstellen von x-y-diagrammen in OpenOffice.calc

Laborübung - Task-Manager (Verwalten von Prozessen) in Windows 7

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Aufbau des SELECT-Befehls. Im Folgenden werden zunächst Abfragen aus einer Tabelle vorgenommen.

MySQL Security. DOAG 2013 Datenbank. 14. Mai 2013, Düsseldorf. Oli Sennhauser

Datenbanken Kapitel 2

Abfragen: Grundbausteine

Kieselstein Meditation

Leit-Bild der Sonnenhofschule

Anleitung über den Umgang mit Schildern

Der Klassenrat entscheidet

Anleitung für die Teilnahme an den Platzvergaben "Studio II, Studio IV und Studio VI" im Studiengang Bachelor Architektur SS15

Hardware - Software - Net zwerke

50 Fragen, um Dir das Rauchen abzugewöhnen 1/6

Einrichtung HBCI mit PIN/TAN in VR-NetWorld-Software

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Transkript:

Need for Speed: Indexierung unter MySQL CeBIT 2014, 11. März, Hannover Oli Sennhauser Senior MySQL Berater bei FromDual GmbH oli.sennhauser@fromdual.com 1 / 30

Über FromDual GmbH FromDual bietet neutral und unabhängig: Beratung für MySQL, Galera Cluster, MariaDB und Percona Server Support für MySQL und Galera Cluster Remote-DBA Dienstleistungen MySQL Schulung OSB Alliance Mitglied 2 / 30

Unsere Kunden 3 / 30

MySQL und Indexierung MySQL Dokumentation: The best way to improve the performance of SELECT operations is to create indexes on one or more of the columns that are tested in the query. Grossartig! Aber: Unnecessary indexes waste space and waste time to determine which indexes to use. You must find the right balance to achieve fast queries using the optimal set of indexes.... hmmm, somit müssen wir wohl ein bisschen denken... :-( 4 / 30

Was ist ein Index? Adams, Douglas: The Hitchhiker's Guide to the Galaxy? Sennhauser, Oli, Uster? 5 / 30

Index technisch gesehen MyISAM InnoDB 6 / 30

MySQL nutzt Indizes: Um Eindeutigkeit zu erzwingen (PRIMARY KEY, UNIQUE KEY) Um schnell auf Zeilen zuzugreifen und diese zu filtern (WHERE) Um Joins schnell auszuführen (JOIN) Um MIN() und MAX() Werte schnell zu finden Für Sortier- und Gruppier-Operationen (ORDER BY, GROUP BY) Um Joins mittels eines Covering Index zu vermeiden Um FOREIGN KEY Constraints (FOREIGN KEY) zu erzwingen 7 / 30

WHERE Klausel 1 SELECT * FROM customers SHOW CREATE TABLE customers\g WHERE name = 'FromDual'; CREATE TABLE `customers` ( `customer_id` smallint(5) unsigned, `name` varchar(64) DEFAULT NULL, PRIMARY KEY (`customer_id`) ) EXPLAIN SELECT * FROM customers WHERE name = 'FromDual'; + + + + + + + table type possible_keys key rows Extra + + + + + + + customers ALL NULL NULL 31978 Using where + + + + + + + 8 / 30

Wie legt man Indices an? ALTER TABLE ADD PRIMARY KEY (id); ADD UNIQUE KEY (uuid); ADD FOREIGN KEY (customer_id) REFERENCES customers (customer_id); ADD INDEX (last_name, first_name); ADD INDEX pre_ind (hash(8)); ADD FULLTEXT INDEX (last_name, first_name); 9 / 30

WHERE Klausel 2 ALTER TABLE customers ADD INDEX (name); CREATE TABLE `customers` ( `customer_id` smallint(5) unsigned Verbesserung: 20 ms 5 ms, `name` varchar(64) DEFAULT NULL, PRIMARY KEY (`customer_id`), KEY `name` (`name`) ) +-----------+------+---------------+------+---------+-------+------+ table type possible_keys key key_len ref rows +-----------+------+---------------+------+---------+-------+------+ customers ref name name 67 const 1 +-----------+------+---------------+------+---------+-------+------+ 10 / 30

JOIN Klausel EXPLAIN SELECT * FROM customers AS c JOIN orders AS o ON c.customer_id = o.customer_id WHERE c.name = 'FromDual'; + + + + + + + + table type possible_keys key key_len ref rows + + + + + + + + c ref PRIMARY,name name 67 const 1 o ALL NULL NULL NULL NULL 1045105 + + + + + + + + Verbesserung: 450 ms 6 ms ALTER TABLE orders ADD INDEX (customer_id); +-------+------+---------------+-------------+---------+---------------+------+ table type possible_keys key key_len ref rows +-------+------+---------------+-------------+---------+---------------+------+ c ref PRIMARY,name name 67 const 1 o ref customer_id customer_id 3 c.customer_id 8 +-------+------+---------------+-------------+---------+---------------+------+ 11 / 30

Tabellen sortieren oder gruppieren ORDER BY, GROUP BY EXPLAIN SELECT * FROM contacts AS c WHERE last_name = 'Sennhauser' ORDER BY last_name, first_name; + + + + + + table type key rows Extra + + + + + + c ref last_name 1561 Using index condition; Using where; Using filesort + + + + + + Verbesserung : 20 ms 7 ms ALTER TABLE contacts ADD INDEX (last_name, first_name); + + + + + + table type key rows Extra + + + + + + c ref last_name_2 1561 Using where; Using index + + + + + + 12 / 30

Covering Indices EXPLAIN SELECT customer_id, amount FROM orders AS o WHERE customer_id = 59349; + + + + + + table type key rows Extra + + + + + + Und jetzt? o ref customer_id 15 NULL + + + + + + ALTER TABLE orders ADD INDEX (customer_id, amount); + + + + + + table type key rows Extra + + + + + + o ref customer_id_2 15 Using index + + + + + + 13 / 30

Vorteil von Covering Indices Warum sind Covering Indices vorteilhaft? ohne mit 14 / 30

Finden von fehlenden Indices ER Diagramm? :-( Hängt hauptsächlich von der Business Logik ab... Wie FINDET man sie? --> Slow Query Log MySQL Variablen: Seit v5.1 on-line! +-------------------------------+----------+ Variable_name Value +-------------------------------+----------+ log_queries_not_using_indexes ON long_query_time 0.250000 min_examined_row_limit 100 slow_query_log ON slow_query_log_file slow.log +-------------------------------+----------+ 15 / 30

Indices sind nicht nur gut! Indices brauchen Platz (Platte, heisse Daten im RAM!) Indices brauchen Zeit für Wartung (CPU, RAM, I/O) Optimizer braucht Zeit um herauszufinden, welchen Index er nehmen soll. Manchmal ist der Optimizer völlig verwirrt und trifft eine falsche Entscheidung wenn zu viele (ähnliche) Indices vorhanden sind. Es gilt die richtige Balance für schnelle Abfragen und optimalen Indices zu finden. 16 / 30

Kleiner Index schnelle Abfrage Passt besser in RAM (weniger I/O) Höhere Datendichte (Rows/Block) Weniger CPU Zyklen Prefixed Index: ADD INDEX pre_ind (hash(8)); 17 / 30

Indices vermeiden Vermeide redundante (daher unnötige) Indices Wie kann so was passieren? Entwickler 1: Kreiert einen Foreign Key Constraint erledigt Entwickler 2: Ouu! Abfrage ist langsam Oli hat gesagt: Index anlegen erledigt Entwickler 3: Ouu! Anfrage ist langsam Entwickler 2 ist ein Idiot! Index anlegen erledigt Frameworks vs. Entwickler Upgrade Prozess vs. DevOps Vermeide Indexes welche nicht benutz/benötigt werden! 18 / 30

Wie findet man solche Indices? SHOW CREATE TABLE...\G mysqldump no data > structure_dump.sql Seit MySQL 5.6: PERFORMANCE_SCHEMA Percona Server / MariaDB: Userstats http://fromdual.com/mysql-performance-schema-hints SELECT FROM WHERE AND ORDER object_schema, object_name, index_name performance_schema.table_io_waits_summary_by_index_usage index_name IS NOT NULL count_star = 0 BY object_schema, object_name; 19 / 30

Vermeide partiell redundante Indices INDEX (city, last_name, first_name) INDEX (city, last_name) INDEX (city) INDEX (last_name, city)??? INDEX (first_name, last_name)!!! 20 / 30

Schlechte Selektivität Weg mit Indices mit schlechter Selektivität (~= geringe Kardinalität) Kandidaten sind: status gender active Wie findet man ob ein Feld eine schlechte Selektivität hat? Indices (und Joins) sind teuer!!! SELECT status, COUNT(*) FROM orders GROUP BY status; +--------+--------+ status cnt +--------+--------+ 0 393216 1 262144 2 12 3 36 4 24 5 4 6 8 +--------+--------+ Break-even zwischen 15% und 66% Schauen wir mal ob der MySQL Optimizer davon weiss... :-) 21 / 30

Optimizer liegt falsch! SELECT * FROM orders WHERE status = 2; +--------+------+---------------+--------+------+ table type possible_keys key rows +--------+------+---------------+--------+------+ orders ref status status 12 +--------+------+---------------+--------+------+ SELECT * FROM orders WHERE status = 0; 1.43 s +--------+------+---------------+--------+--------+ table type possible_keys key rows +--------+------+---------------+--------+--------+ orders ref status status 327469 +--------+------+---------------+--------+--------+ 5.6.12 (nach ANALYZE TABLE) SELECT status, COUNT(*) FROM orders GROUP BY status; +--------+--------+ status cnt +--------+--------+ 0 393216 1 262144 2 12 3 36 4 24 5 4 6 8 +--------+--------+ SELECT * FROM orders IGNORE INDEX (status) WHERE status = 0; 0.44 s +--------+------+---------------+------+--------+ table type possible_keys key rows +--------+------+---------------+------+--------+ orders ALL NULL NULL 654939 +--------+------+---------------+------+--------+ 22 / 30

InnoDB PK und SK InnoDB kennt Primary Keys und Secondary Keys 23 / 30

Geclusterter Index InnoDB: Daten = Blätter des Primary Keys Heisst auch Index Clustered Table (IOT) Daten sind sortiert wie PK (Index ist sortiert)! PK beeinflusst Lokalität der Daten (physische Lage) AUTO_INCREMENT ~= Sortieren nach Zeit! Gut in vielen Fällen Wenn heisse Daten = aktuelle Daten Schlecht für Zeitreihen Wenn heisse Daten = Daten pro Objekt 24 / 30

Beispiel: InnoDB A_I ts v_id xpos ypos... 1 17:30 #42 x, y,... 2 17:30 #43 x, y,... 3 17:30 #44 x, y,... #42 alle 2'... 2001 17:32 #42 x, y,... 2002 17:32 #43 x, y,... 2003 17:32 #44 x, y,... Q1: Δ in Zeilen? ~ 2000 Zeilen A1: 1 Zeile ~ 100 byte Q2: Δ in bytes? ~ 200 kbyte Q3: Default InnoDB block size? default: 16 kbyte Q4: Avg. # Zeilen von LKW #42 in 1 InnoDB block? ~ 1 A2: 3 d und 720 pt/d ~2000 pt ~ 2000 rec ~ 2000 blk Q5: Wie lange dauert das und warum (32 Mbyte)? ~ 2000 IOPS ~ 10s random read!!! S: Alles im RAM oder starkes I/O-System oder? 2000 LKWs die letzten 3 Tage 25 / 30

Geclusterter PK rettet den Tag! ts v_id xpos ypos... 17:30 #42 x, y,... 17:32 #42 x, y,... 17:34 #42 x, y,...... #42 alle 2' 17:30 #43 x, y,... 17:32 #43 x, y,... 17:34 #43 x, y,...... 17:30 #44 x, y,... 2000 LKWs Q1: Avg. # Zeilen von LKW #42 in 1 InnoDB block? ~ 120 A1: 3 d und 720 pt/d ~2000 pt ~ 2000 rec ~ 20 blk Q2: Wie lange dauert das und warum (320 kbyte)? ~ 1-2 IOPS ~ 10-20 ms sequential read! S: Wow f=50 schneller! Nachteile? die letzten 3 Tage 26 / 30

Index Hints MySQL Optimizer liegt manchmal falsch! Wir müssen ihm nachhelfen... Index Hints (Hinweise) sind: USE INDEX (ind1, ind2) Schau nur diese Indices an... FORCE INDEX (ind3) Nimm diesen Index ohne weiter nachzudenken IGNORE INDEX (ind1, ind3) Schau Dir alle Indices ausser diese an Hints nur als allerletzte Rettung verwenden! 27 / 30

MySQL Variablen MySQL Variablen welche Indices beeinflussen MyISAM: key_buffer_size InnoDB: innodb_buffer_pool_size InnoDB Change Buffer innodb_change_buffer_max_size innodb_change_buffering Adaptive Hash Index (AHI) MySQL 5.6.3 / 5.5.14 Indexlänge 767 3072 bytes innodb_large_prefix 28 / 30

Wir suchen noch: Datenbank Enthusiast/in für Support / remote-dba / Beratung 29 / 30

Q&A Fragen? Diskussion? Anschliessend ist noch Zeit für ein persönliches Gespräch... FromDual bietet neutral und unabhängig: MySQL Beratung Remote-DBA Support für MySQL, Galera Cluster, MariaDB und Percona Server MySQL Schulung /presentations 30 / 30