👁️
pierreinside
  • Introduction
  • Workbench
    • VirtualBox
    • Linux
      • Linux-Paketverwaltung
      • Linux Initialisierung
      • Ubuntu 14.10 LTS
      • Ubuntu 16.04 LTS
      • Ubuntu 18.04 LTS
      • Ubuntu 20.04 LTS
      • Ubuntu - Netzwerk
    • Konsole
      • ssh
      • zsh
      • cygwin
      • Babun
      • terminator
      • Terminal Multiplexer
      • Linux Tools
    • awesome
    • Entwicklungsumgebungen
      • Texteditors
      • Visual Studio Code
      • IntelliJ - IDEA
  • Softwareentwicklungsprozess
    • Schätzungen
    • Eventstorming
    • OKR
  • Architektur
    • Uncle Bob
    • Microservices
    • NoSQL
      • ElasticSearch
    • Hystrix
    • Reactive Programming
    • AngularJS
    • Service Mesh
  • Networking
    • Dependency Injection
  • Programming
    • Java Core/EE
      • Java 8
      • Java Annotationen
      • Bean Validation
      • Enterprise Java Beans Specification
      • Dependency Injection
    • JRebel
    • Webservices
      • HTTP
      • REST
      • Spring MVC REST
      • Swagger
      • Postman
    • Spring Ecosystem
      • Spring Core
      • Spring Boot
        • Programming
        • Production Ready
        • Testing
      • Spring Cloud
      • Spring Cloud Config
      • Spring MVC
      • Spring Data
      • Spring Petclinic
    • NodeJS
    • UI-Technologie
      • Thymeleaf
      • ionic
      • Web Fonts
      • Jinja Templates
      • Twitter Bootstrap
    • Python Ecosystem
      • Python Libraries
      • Python Testing
      • Python Best-Practices
      • Python Snippets
      • Python Selenium
      • Kivy UI
      • FastAPI
      • Typer CLI
      • Django
    • Groovy
    • Persistenz
      • Transactions
        • Java TX
        • JPA TX
      • TX Handling
      • JPA
        • Eclipse Link
      • MySQL
        • MySQL Performance
        • Docker MySQL
      • Hazelcast
    • Glassfish
    • YAML
    • Angular
    • Camel
    • Zeichenkodierung
    • Kinder lernen Programmieren
  • Testen
    • Easymock
    • Mockito
  • Performance & Scalability
    • Java Performance
      • Heapdump Analysis
    • Java Concurrency
    • Instana
  • Sicherheit
    • Authentifizierung
      • OpenID Connect
      • Web-Authentication API
    • Authorisierung
      • OAuth
      • SAML
    • Spring Security
    • Zertifikate
    • Kali Linux
    • VPN
    • Zero-Trust-Networks
  • Build und Deployment
    • Maven
    • Bamboo
    • Jenkins
      • Jenkins Pipelines
      • Jenkins Pipelines Tips und Tricks
      • Jenkins-configuration-as-Code
      • Jenkins IDE
    • Travis CI
    • Shellprogrammierung
      • jq - JSON Parsing
    • Konfiguration Management
    • Vagrant
      • Vagrant-Ansible-Integration
      • Vagrant Box bauen
    • Ansible
      • Getting Started
      • Ansible Details
    • Saltstack
    • LinuxKit
    • Container
      • Docker
        • Docker Getting Started
        • Debugging Docker
        • Docker Build
        • Docker Registry
        • Docker run
          • docker run
          • docker network
        • Docker Compose
        • docker machine
        • Docker@Windows
        • Docker Host
        • Docker Scaling
        • Docker Ressources
        • Docker Logging
        • windowsContainer
      • Cloud Deployment Provider
        • AWS
          • Anwendungsdeployment
          • Workload
          • Permissions
          • Netzwerke
          • AWS CLI
            • aws-vault
          • RDS
          • Static Website Hosting
          • EKS - Elastic Kubernetes Service
          • S3
        • Google Cloud Platform
      • Docker Orchestrierung
        • CoreOS
        • Kubernetes
          • microK8s
          • minikube
          • autoscaler
          • Docker
          • k9s
        • Nomad
    • PHP
  • Operations
    • Proxy
      • NGINX
    • DNS
    • Logging
      • Graylog
      • Fluentd
    • Monitoring
      • Grafana
    • Infrastructure-as-Code
      • Terraform
        • AWS-Provider
        • GitHub-Provider
      • Packer
    • Deployment
      • Vault
      • Consul
        • Consul Template
      • Fabio
  • Rechtliches
    • Software-Lizenzen
  • Git Ecosystem
    • Git
      • Git Lifecycle Hooks
    • GitHub
      • GitHub Organizations
    • GitHub Actions
    • GitHub Pages
    • GitHub CLI
    • GitHub Copilot
    • GitHub-AWS OIDC
    • GitBook
    • GitLab
    • Bitbucket/Stash
  • Publishing
    • WordPress
    • Markdown
    • Static Site Generators
      • Hugo
      • Jekyll
    • Tiddly Wiki
    • Leanpub
    • Animationsfilme
  • Storage
    • Synology 2012
    • Synology 2021
  • Collaboration
    • Übersicht
    • Microsoft Teams
  • Konferenzen
    • Velocity Berlin 2019
  • IT mit Kindern
    • Projekt Sportstracker
    • Scratch
    • Pico Spielekonsole
  • Schule
    • Mathematik
  • Misc
    • Foto/Video
      • Foto/Video Sammlung bis 2023
        • Handbrake
        • Onedrive
      • Foto/Video Sammlung ab 2024
      • Gopro
      • Panasonic FZ1000 ii
        • als Webcam
      • AV Receiver
      • Videos erstellen
        • OBS Studio
        • Touch Portal
        • Game-Streaming
      • Kameratasche
      • Kamera 2020
    • Handy
      • 2016
      • 2018
      • 2019
      • 2021
      • 2022
    • Computer
      • Laptop
        • 2018
        • Chromebook
      • Monitor
        • 4k
      • Software
        • Command Line Interface
        • Google API
        • Plant UML
        • Chromium
        • Passwort-Manager
        • GPG
      • Dell CNF 2665 Farbdrucker
      • Dockingstation
      • Gaming PC 2021
      • Mobiles BĂźro
      • Mobiles Internet
      • Mobiler Router
    • Beamer Benq W1000+
    • Spielekonsole
      • 2017
        • Playstation 4
      • Pico Spielekonsole
    • Gadgets
      • iPad Pro 2015 und 2016
      • iPad Air 2024
      • Macbook Pro
      • Smartwatch
      • Slate
      • Mudi
    • Fahrrad
      • Jonas 2018
      • SQLab
    • Auto
      • Auto 2022
      • Camping
        • Camping Touren Ideen
          • Camping Tour - Gardasee 2021
        • Camper
          • Camper klein - keine StehhĂśhe
            • VW Bus Erfahrungen
          • Camper gross - StehhĂśhe
    • Haus
      • Klimaanlage
      • Swimming Pool
      • Quick Mill Orione 3000
      • SpĂźlmaschine 2021
      • Hebe-SchiebetĂźr
      • Gasgrill
      • Minibar / Mini-KĂźhlschrank
      • Glasfaseranschluss (Fiber-to-the-Home)
      • Smart-Home
        • Raspberry Pi
        • Heimnetzwerk
      • Homeoffice
      • Energie
        • Solar
        • Wärmepumpe
    • Freizeit
      • Musik Streaming
      • Sky
      • Online Lernplattformen
      • eScooter - ePowerFun
    • Fußball
      • Meine Arbeit als Fußball-Trainer
      • Fußball Tools
      • DFB TalentfĂśrderung
    • Google Impact Challenge
  • Englisch
Powered by GitBook
On this page
  • MySQL Performance
  • Analyse
  • Performance Schema
  • MySQL Workbench
  • MySQL Enterprise Manager
  • MySQLTuner-perl
  • Logging
  • Tips
  • Dedicated DB Server
  • Konfiguration
  • analyze table
  • optimize table
  • Selektivität
  • Fragmentierung
  • Partitionierung
  • FAQ
  • count(foo) ist teuer

Was this helpful?

  1. Programming
  2. Persistenz
  3. MySQL

MySQL Performance

MySQL Performance

  • http://www.tecmint.com/mysql-mariadb-performance-tuning-and-optimization/

  • http://www.speedemy.com/mysql-configuration-tuning-handbook/

  • http://speedemy.com/files/mysql/my.cnf

MySQL Community Edition hat brauchbare Default Einstellungen, aber die Konfiguration muß auf jeden Fall an die Bedürfnisse angepaßt werden.


Analyse

Performance Schema

Das Server Feature Performance Schema (seit MySQL 5.5) muß einkonfiguriert sein, damit der Server entsprechende Daten mitloggt (in Datenbanktabellen schreibt). In der MySQL Workbench kann man Über Server - Performance Server Setup den Detailgrad des Loggings definieren.

Mit der MySQL Workbench kĂśnnen die Ergebnisse recht komfortabel ausgewertet werden.

ACHTUNG: die Bereitstellung der Performance-Daten kostet auf jeden Fall Performance auf dem Server!!!

MySQL Workbench

Dieses kostenlose Tool ist schon sehr praktisch, wenn man auf der Suche nach Bottlenecks ist.

MySQL Enterprise Manager

MySQLTuner-perl

  • https://github.com/major/MySQLTuner-perl

  • Perl Skript, das ein paar wesentliche Konfigurationsparameter ĂźberprĂźft und Optimierungsvorschläge macht

Logging

In der Softwareentwicklung verwendet man häufig Prepared Queries, weil deren Execution Plan nur ein einziges mal berechnet werden muß und dann unabhängig von den Parameter-Bindings genutzt werden können. Explain Plan ist eine recht teure Operation und deshalb macht dieses Vorgehen Sinn.

Nachteil dieses Ansatzes ist allerdings, daß Query und Parameter getrennt sind und häufig auch getrennt geloggt werden (z. B. EclipseLink mit eclipselink.logging.level.sql und eclipselink.logging.parameters).

Konfiguriert man das Logging im MySQL Server entsprechend

general_log=0
general_log_file=/var/lib/mysql/general-log-file.log

, dann erhält man im Log vollständige Queries, die man direkt in der MySQL Workbench ausfßhren kann, um den Explain Plan zu untersuchen.

Slow-Query Log

HierĂźber werden langlaufende Queries in eine Datei geloggt:

slow_query_log=0
slow_query_log_file=/var/lib/mysql/slow-query.log
long_query_time=2

Der letzte Parameter bestimmt welche AusfĂźhrungszeit als slow eingestuft wird.

Sehr praktisch!!!


Tips

Dedicated DB Server

Am besten verwendet man einen dedizierten DB-Server, der sich die Ressourcen nicht mit anderen Komponenten (z. B. Application-Server) teilen muß. Der Vorteil darin, daß das Tuning (über entsprechende Konfigurationsparameter) deutlich einfacher ist.

Konfiguration

InnoDB Buffer Pool

  • http://www.tecmint.com/mysql-mariadb-performance-tuning-and-optimization/2/

  • https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool-resize.html

Hierbei handelt es sich um den wichtigsten Konfigurationsparameter. Der Schalter innodb_buffer_pool_size bestimmt wieviel RAM MySQL fĂźr Caching und Indizes verwenden darf. Bei einem MySQL dedicated Rechner sollte man 70-80% des verfĂźgbaren RAM verwenden.

Query Cache Size

Dieser Cache macht Sinn, wenn man immer wieder die gleichen Queries absetzt. Ist das nicht der Fall, dann macht es keinen Sinn. Ist der Wert zu hoch, dann hat das nachteilige Ausweirkungen auf die Performance, weil der Cache gelockt werden muß, um ihn zu aktualisieren, d. h. die Threads der anderen Queries werden auch blockiert. Ein Wert zwischen 64 und 256 MB sollte i. a. ausreichend sein.

Max Connections

Jede Connection (die beispielsweise Ăźber die Konfiguration des Application Server Connection Pool aufgebaut wird) benĂśtigt - auch wenn sie nicht genutzt wird - Speicher auf dem MySQL Server.

OS Swappiness

Defaultmäßig fangen Betriebssysteme bei einer bestimmten RAM-Nutzung (Linux 60% - sysctl vm.swappiness) mit swappen an ... für einen Datenbankserver ist Swapping ganz schlecht - noch schlechter ist es, wenn fachfremde (Betriebssystem) darüber entscheidet welche Teile auf die Festplatte ausgelagert werden. Eine Datenbank ist - im besten Fall - ein hochoptimiertes System, das an der Leistungsgrenze läuft ... da kann man sich keine generischen Auslagerungsstrategien eines Betriebssystems leisten.

DB Filesystem I/O

Eine Datenbank sollte nach mÜglichkeit die meisten Sachen im Hauptspeicher machen und optimal die Festplatte einbinden (lesen/schreiben). Dafßr gibt es entsprechende Konfigurationsparameter, die an die jeweilige Anwendung anzupassen sind - denn der DBA bzw. die Entwickler dieser Anwendnung wissen am besten wie sich die Anwendung verhält und welche Einstellungen dafßr am besten geeignet sind.

Richtiges Filesystem verwenden

Das richtige Filesystem ist von der verwendeten Storage Engine abhängig ... fßr MySQL mit InnoDB Storage Engine werden die Filesysteme XFS, Ext4 und Btrfs empfohlen.

analyze table

Die Ermittlung des optimalen Explain Plan hängt vom Inhalt der Tabellen ab. Das liegt daran, daß häufig - aufgrund von Indexen, die ähnlich sind - verschiedene Zugriffspfade existieren (neben einem FULL TABLE SCAN). Ein analyze table hilft dem Optimizer bessere Execution Plans zu ermitteln. Deshalb sollte man dies auch regelmäßig tun.

Unter Oracle kennt man das als GATHER STATS JOB

Am besten verwendet man ein Script, das alle Tabellen einer Datenbank analyisiert:

mysqlcheck --analyze --databases myDatabase --user=root --password=pwd

Häufig ist diese Analyse auch relativ schnell durch (hängt natürlich von der Datenbankgröße ab).

  • FRAGE: blockiert es???

Per show index myTable kann man auch die Effizienz der Indizes erfahren (in MySQL Workbench sieht an das ßber den Table Inspector). Eine Kardinalität von 0 deutet auf eine schlechte Effizienz hin ... vielleicht verschafft ein analyze table hier Abhilfe.

optimize table

Im Gegensatz zum analyze table greift optimize table in die Speicherorganisation der Datenbank ein (die Fragmentierung wird reduziert).

Selektivität

Das Ziel des Optimizers ist es, mĂśglichst schnell eine Reduktion der zu berĂźcksichtigenden Datenmenge zu erreichen. Das schafft man, indem die WHERE-clauses ausgewertet werden mit den Indizes, die das erreichen.

Kardinalität

Die Kardinalität beschreibt wieviele verschiedene Werte ein Index hat. Beispiele:

  • bei einem Index auf sex kĂśnnte das beispielsweise 2 sein

  • bei einem Index auf (age, sex) kĂśnnten das - angenommen die Personen gehen von 0 Jahre bis 100 Jahre und sind Männer und Frauen - 200 sein

Die Kardinalität in Relation zur Anzahl der Zeilen spiegelt die Selektivität des Index wieder.

Ein Index mit niedriger Kardinalität (sex) kann aber dennoch gute Dienste leisten. Wenn die Verteilung in der Tabelle bei

  • male: 99

  • female: 1

liegt, dann ist ein select * from person where sex = 'female' extrem schnell.

Zusammengesetzte Indizes

Ein Index sollte so gewählt sein, daß die Spalten mit der höchsten Reduktion weit vorne stehen. Ein Beispiel:

  • BESSER: CREATE INDEX idx ON person (age, sex)

  • SCHLECHTER: CREATE INDEX idx ON person (sex, age)

ACHTUNG: besser oder schlechter hängt von der Datenverteilung ab. Wenn ich eine Normalverteilung habe, gelten die Aussagen. Habe ich allerdings nur Personen im Alter von 13 Jahren, dann wäre (sex, age) besser. DESHALB ist es bei der Performanceoptimierung wichtig, mit realistischen Daten zu arbeiten, die mÜglichst die gleiche Verteilung aufweisen wie in Live-Betrieb.

Fragmentierung

  • http://dev.mysql.com/doc/refman/5.0/en/innodb-file-defragmenting.html

Partitionierung

  • https://dev.mysql.com/doc/refman/5.1/en/partitioning-types.html


FAQ

count(foo) ist teuer

  • http://stackoverflow.com/questions/511820/select-count-is-slow-even-with-where-clause

PreviousMySQLNextDocker MySQL

Last updated 3 years ago

Was this helpful?