nAcademy Le 2 avril 2014 – Neuros
Améliorer les performances SQL
Christophe Villeneuve
nAcademy Le 2 avril 2014 – Neuros
Sommaire
• Comment tuer SQL ?
• Améliorés les idées mal reçues
• Des pistes
Tuons SQL
nAcademy Le 2 avril 2014 – Neuros
Tuons SQL : Sans connaissance
• Base de données
– PostgreSQL ? SQL Server ? Oracle ? …
• Version 
– 4.x / 5.1 / 5.5 / 5.6 / 5.7
• Storage
– MyISAM ? InnoDB ? Falcon ? PBXT ?...
• Qui gère la Base de données
– Developer ? DBA ? Mix ?
nAcademy Le 2 avril 2014 – Neuros
Tuons SQL : 3 raisons
• Code
• Design
• Schema
nAcademy Le 2 avril 2014 – Neuros
Mauvaise configuration
• Architecture
– Choisir le plus petit type de données possibles (BigInt?)
– Champs indexés
nAcademy Le 2 avril 2014 – Neuros
Mauvaise utilisation
• Déplacer de nombreuses données à grandes échelles
– Cache ?
– Réplication
– Conserver les données de session pour les transitions
– Absence Clef primaire
– Index Merge
nAcademy Le 2 avril 2014 – Neuros
Mauvaise programmation
• Configuration Mémoire
• Absence de clef Primaire
• Les jointures
• Sous requêtes
• Alias
• Select *...
nAcademy Le 2 avril 2014 – Neuros
En résumé
Performance
!=
Scalability
(Evolution)
Les pistes aux idées mals reçues
nAcademy Le 2 avril 2014 – Neuros
Les pistes
• Hardware / Systemes
• Configuration... SQL
• Design BDD
• Monitoring
• Maintenance
Hardware / Systèmes
nAcademy Le 2 avril 2014 – Neuros
Carte mère
• Benchmark
• Monitoring
nAcademy Le 2 avril 2014 – Neuros
CPU
• Processeur multi-coeur
– 32 à 80 cœurs
– Fast CPU
• Utile pour du stockage et fiable
nAcademy Le 2 avril 2014 – Neuros
Mémoire
• Liés au volume de données
• Liés aux nombres de connexions à la BDD
• Extra RAM
• FS Cache
• Ram disk
• ECC
nAcademy Le 2 avril 2014 – Neuros
Choix du Systeme
• OS
– Linux / windows / Solaris/...
– CPU associé avec l'OS
• Vérifier la performance
– L pour Lamp
• Alternative à Malloc
– Jemalloc
– Tcmalloc
[mysqld_safe]
malloc-lib=tcmalloc
nAcademy Le 2 avril 2014 – Neuros
Stockage
• Matériels
– Disque dur
– SSD
• Formatage
– Ext4
– XFS
– innodb_flush_method
• Vitesse Lecture / Ecriture
nAcademy Le 2 avril 2014 – Neuros
Et plus
• Si 1 disque
– Cache disque batterie de secours
• Log InnoDB
• Log Binaires
– Sécurité crash
– Vérifié durée de vie
• Plusieurs disques
– Equilibrer la charge
– 1 disk pour la lecture et 1 disk pour l'écriture
• Datadir
• innodb_data_file_path
• innodb_undo_directory
• innodb_log_group_home_dir
• log-bin
• tmpdir
Random, SSD
Sequential, spinning
Random, SSD, tmpfs
Configuration... SQL
nAcademy Le 2 avril 2014 – Neuros
Fonction EXPLAIN
• Obtenir des informations sur les SELECT
> EXPLAIN SELECT * FROM nom_de_table
WHERE...
•
nAcademy Le 2 avril 2014 – Neuros
Fonction EXPLAIN : code
mysql> EXPLAIN SELECT f.film_id, f.title, c.name
> FROM film f INNER JOIN film_category fc
> ON f.film_id=fc.film_id INNER JOIN category c
> ON fc.category_id=c.category_id WHERE f.title LIKE 'T%' G
*************************** 1. row ***************************
select_type: SIMPLE
table: c
type: ALL
possible_keys: PRIMARY
key: NULL
key_len: NULL
ref: NULL
rows: 16
Extra:
*************************** 2. row ***************************
select_type: SIMPLE
table: fc
type: ref
possible_keys: PRIMARY,fk_film_category_category
key: fk_film_category_category
key_len: 1
ref: sakila.c.category_id
rows: 1
Extra: Using temporary; Using index
*************************** 3. row ***************************
select_type: SIMPLE
table: f
type: eq_ref
possible_keys: PRIMARY,idx_title
key: PRIMARY
key_len: 2
ref: sakila.fc.film_id
rows: 1
Extra: Using where
Une estimation de rangées dans cette série
Table temporaire avec 1
index
Attention
Une estimation de rangées dans cette série
nAcademy Le 2 avril 2014 – Neuros
Repérer une colonne indexée
SELECT * FROM Orders
WHERE TO_DAYS(CURRENT_DATE())
– TO_DAYS(order_created) <= 7;
Mauvaise idée... Risque de nombreux problèmes...
SELECT * FROM Orders
WHERE order_created
>= CURRENT_DATE() INTERVAL
7 DAY;
Mieux... sauf pour order_created
SELECT order_id, order_created, customer
FROM Orders
WHERE order_created
>= '20140402' INTERVAL 7 DAY;
ok... La requête peut être mise en cache
nAcademy Le 2 avril 2014 – Neuros
Optimisation colonne indexée
CURRENT_DATE()... en PHP
$sql= « SELECT order_id, order_created, customer FROM Orders
WHERE order_created >= ' »
. date('Y-m-d') .
« ' - INTERVAL 7 DAY »;
nAcademy Le 2 avril 2014 – Neuros
Jointure vs subqueries
• Garder les choses simples
• Manipuler les jeux de données
• Penser aux boucles
• Les jointures... une solution
nAcademy Le 2 avril 2014 – Neuros
Exemple : Jointure vs subqueries
nAcademy Le 2 avril 2014 – Neuros
Valeur des champs
• Définir le plus petit type de données
– Vraiment utile d'utiliser BigINT ?
• Définition Petit
– 1 seul bloc mémoire utilisé
• Champs indexés ?
• Int / Char ?
nAcademy Le 2 avril 2014 – Neuros
Connexion persistante dans PHP
• Couche Abstraction DB lourde
–ADODB
–MDB2
–PearDB
–ORM
• Couche Abstraction légère
–PDO
–MySQLND
–Bibliothèque / Librairie
nAcademy Le 2 avril 2014 – Neuros
Requête cache
• threads_running... MySQL<=4
• Depuis il y a Query Cache
– query_cache_type = 0
– query_cache_size =0
thread_cache = 200
query_cache_type = 0
query_cache_size =64M
nAcademy Le 2 avril 2014 – Neuros
Requête Cache
• Le problème
– qcache_free_blocks > 5-10k
– stage/sql/Waiting for query cache lock
nAcademy Le 2 avril 2014 – Neuros
Configurer la table de cache
• Définir le nombre de table ouverte
–table_open_cache
–table_definition_cache
–opened_table_definitions / sec
–table_cache_instances = 8 or 16
–innodb_open_files
–mdl_hash_instances = 256
table_cache = 5000
key_buffer = 320M
nAcademy Le 2 avril 2014 – Neuros
Configurer la table de cache
nAcademy Le 2 avril 2014 – Neuros
Réduire la consommation de la mémoire
max_used_connections * (
read_buffer_size +
read_rnd_buffer_size +
join_buffer_size +
sort_buffer_size +
binlog_cache_size +
thread_stack +
2 * net_buffer_length …
)
Augmentation possible
nAcademy Le 2 avril 2014 – Neuros
Choix du moteur
• Moteur Moderne...
– InnoDB vs MyISAM
• InnoDB
– Scalable
– Moteur de texte integral
– API Memcache (Haute performance)
nAcademy Le 2 avril 2014 – Neuros
Optimisation dans my.cnf
• Utiliser la mémoire tampon
– innodb_buffer_pool_size
– Active data <= innodb_buffer_pool_size <= 0.8 * RAM
• Reduire the buffer pool contention
– innodb_buffer_pool_instances >= 8
– innodb_spin_wait_delay = 96 on high concurrency
• Lecture/Ecriture les transactions (ex : logs)
– innodb_log_file_size = 2047M … Avant 5.6
– innodb_log_file_size >= 2047M … Apres 5.6
Design BDD
nAcademy Le 2 avril 2014 – Neuros
Architectures des tables
• Intégrer les clefs primaires
• UTF-8 par rapport latin 1
• Compression des champs
– Blob
– Varchar
– Text
Monitoring
nAcademy Le 2 avril 2014 – Neuros
Monitoring
• Outils
– MySQL entreprise Monitor
– Perconat Monitoring
– Galeria
– Query Analyzer
Maintenance
nAcademy Le 2 avril 2014 – Neuros
Maintenance
• Au niveau du code
– Fermer les connexions inactives
– Penser aux requêtes préparées
• Backup de la base de données
• Optimiser les tables et les données
• Mise à jour régulière BDD
• Faire des tests de performances
nAcademy Le 2 avril 2014 – Neuros
Questions... ?
@hellosct1
@neuro_paris
Sources originales :
- Arnaud Adant
- Jay Pipes

Améliorer les performances SQL

  • 1.
    nAcademy Le 2avril 2014 – Neuros Améliorer les performances SQL Christophe Villeneuve
  • 2.
    nAcademy Le 2avril 2014 – Neuros Sommaire • Comment tuer SQL ? • Améliorés les idées mal reçues • Des pistes
  • 3.
  • 4.
    nAcademy Le 2avril 2014 – Neuros Tuons SQL : Sans connaissance • Base de données – PostgreSQL ? SQL Server ? Oracle ? … • Version  – 4.x / 5.1 / 5.5 / 5.6 / 5.7 • Storage – MyISAM ? InnoDB ? Falcon ? PBXT ?... • Qui gère la Base de données – Developer ? DBA ? Mix ?
  • 5.
    nAcademy Le 2avril 2014 – Neuros Tuons SQL : 3 raisons • Code • Design • Schema
  • 6.
    nAcademy Le 2avril 2014 – Neuros Mauvaise configuration • Architecture – Choisir le plus petit type de données possibles (BigInt?) – Champs indexés
  • 7.
    nAcademy Le 2avril 2014 – Neuros Mauvaise utilisation • Déplacer de nombreuses données à grandes échelles – Cache ? – Réplication – Conserver les données de session pour les transitions – Absence Clef primaire – Index Merge
  • 8.
    nAcademy Le 2avril 2014 – Neuros Mauvaise programmation • Configuration Mémoire • Absence de clef Primaire • Les jointures • Sous requêtes • Alias • Select *...
  • 9.
    nAcademy Le 2avril 2014 – Neuros En résumé Performance != Scalability (Evolution)
  • 10.
    Les pistes auxidées mals reçues
  • 11.
    nAcademy Le 2avril 2014 – Neuros Les pistes • Hardware / Systemes • Configuration... SQL • Design BDD • Monitoring • Maintenance
  • 12.
  • 13.
    nAcademy Le 2avril 2014 – Neuros Carte mère • Benchmark • Monitoring
  • 14.
    nAcademy Le 2avril 2014 – Neuros CPU • Processeur multi-coeur – 32 à 80 cœurs – Fast CPU • Utile pour du stockage et fiable
  • 15.
    nAcademy Le 2avril 2014 – Neuros Mémoire • Liés au volume de données • Liés aux nombres de connexions à la BDD • Extra RAM • FS Cache • Ram disk • ECC
  • 16.
    nAcademy Le 2avril 2014 – Neuros Choix du Systeme • OS – Linux / windows / Solaris/... – CPU associé avec l'OS • Vérifier la performance – L pour Lamp • Alternative à Malloc – Jemalloc – Tcmalloc [mysqld_safe] malloc-lib=tcmalloc
  • 17.
    nAcademy Le 2avril 2014 – Neuros Stockage • Matériels – Disque dur – SSD • Formatage – Ext4 – XFS – innodb_flush_method • Vitesse Lecture / Ecriture
  • 18.
    nAcademy Le 2avril 2014 – Neuros Et plus • Si 1 disque – Cache disque batterie de secours • Log InnoDB • Log Binaires – Sécurité crash – Vérifié durée de vie • Plusieurs disques – Equilibrer la charge – 1 disk pour la lecture et 1 disk pour l'écriture • Datadir • innodb_data_file_path • innodb_undo_directory • innodb_log_group_home_dir • log-bin • tmpdir Random, SSD Sequential, spinning Random, SSD, tmpfs
  • 19.
  • 20.
    nAcademy Le 2avril 2014 – Neuros Fonction EXPLAIN • Obtenir des informations sur les SELECT > EXPLAIN SELECT * FROM nom_de_table WHERE... •
  • 21.
    nAcademy Le 2avril 2014 – Neuros Fonction EXPLAIN : code mysql> EXPLAIN SELECT f.film_id, f.title, c.name > FROM film f INNER JOIN film_category fc > ON f.film_id=fc.film_id INNER JOIN category c > ON fc.category_id=c.category_id WHERE f.title LIKE 'T%' G *************************** 1. row *************************** select_type: SIMPLE table: c type: ALL possible_keys: PRIMARY key: NULL key_len: NULL ref: NULL rows: 16 Extra: *************************** 2. row *************************** select_type: SIMPLE table: fc type: ref possible_keys: PRIMARY,fk_film_category_category key: fk_film_category_category key_len: 1 ref: sakila.c.category_id rows: 1 Extra: Using temporary; Using index *************************** 3. row *************************** select_type: SIMPLE table: f type: eq_ref possible_keys: PRIMARY,idx_title key: PRIMARY key_len: 2 ref: sakila.fc.film_id rows: 1 Extra: Using where Une estimation de rangées dans cette série Table temporaire avec 1 index Attention Une estimation de rangées dans cette série
  • 22.
    nAcademy Le 2avril 2014 – Neuros Repérer une colonne indexée SELECT * FROM Orders WHERE TO_DAYS(CURRENT_DATE()) – TO_DAYS(order_created) <= 7; Mauvaise idée... Risque de nombreux problèmes... SELECT * FROM Orders WHERE order_created >= CURRENT_DATE() INTERVAL 7 DAY; Mieux... sauf pour order_created SELECT order_id, order_created, customer FROM Orders WHERE order_created >= '20140402' INTERVAL 7 DAY; ok... La requête peut être mise en cache
  • 23.
    nAcademy Le 2avril 2014 – Neuros Optimisation colonne indexée CURRENT_DATE()... en PHP $sql= « SELECT order_id, order_created, customer FROM Orders WHERE order_created >= ' » . date('Y-m-d') . « ' - INTERVAL 7 DAY »;
  • 24.
    nAcademy Le 2avril 2014 – Neuros Jointure vs subqueries • Garder les choses simples • Manipuler les jeux de données • Penser aux boucles • Les jointures... une solution
  • 25.
    nAcademy Le 2avril 2014 – Neuros Exemple : Jointure vs subqueries
  • 26.
    nAcademy Le 2avril 2014 – Neuros Valeur des champs • Définir le plus petit type de données – Vraiment utile d'utiliser BigINT ? • Définition Petit – 1 seul bloc mémoire utilisé • Champs indexés ? • Int / Char ?
  • 27.
    nAcademy Le 2avril 2014 – Neuros Connexion persistante dans PHP • Couche Abstraction DB lourde –ADODB –MDB2 –PearDB –ORM • Couche Abstraction légère –PDO –MySQLND –Bibliothèque / Librairie
  • 28.
    nAcademy Le 2avril 2014 – Neuros Requête cache • threads_running... MySQL<=4 • Depuis il y a Query Cache – query_cache_type = 0 – query_cache_size =0 thread_cache = 200 query_cache_type = 0 query_cache_size =64M
  • 29.
    nAcademy Le 2avril 2014 – Neuros Requête Cache • Le problème – qcache_free_blocks > 5-10k – stage/sql/Waiting for query cache lock
  • 30.
    nAcademy Le 2avril 2014 – Neuros Configurer la table de cache • Définir le nombre de table ouverte –table_open_cache –table_definition_cache –opened_table_definitions / sec –table_cache_instances = 8 or 16 –innodb_open_files –mdl_hash_instances = 256 table_cache = 5000 key_buffer = 320M
  • 31.
    nAcademy Le 2avril 2014 – Neuros Configurer la table de cache
  • 32.
    nAcademy Le 2avril 2014 – Neuros Réduire la consommation de la mémoire max_used_connections * ( read_buffer_size + read_rnd_buffer_size + join_buffer_size + sort_buffer_size + binlog_cache_size + thread_stack + 2 * net_buffer_length … ) Augmentation possible
  • 33.
    nAcademy Le 2avril 2014 – Neuros Choix du moteur • Moteur Moderne... – InnoDB vs MyISAM • InnoDB – Scalable – Moteur de texte integral – API Memcache (Haute performance)
  • 34.
    nAcademy Le 2avril 2014 – Neuros Optimisation dans my.cnf • Utiliser la mémoire tampon – innodb_buffer_pool_size – Active data <= innodb_buffer_pool_size <= 0.8 * RAM • Reduire the buffer pool contention – innodb_buffer_pool_instances >= 8 – innodb_spin_wait_delay = 96 on high concurrency • Lecture/Ecriture les transactions (ex : logs) – innodb_log_file_size = 2047M … Avant 5.6 – innodb_log_file_size >= 2047M … Apres 5.6
  • 35.
  • 36.
    nAcademy Le 2avril 2014 – Neuros Architectures des tables • Intégrer les clefs primaires • UTF-8 par rapport latin 1 • Compression des champs – Blob – Varchar – Text
  • 37.
  • 38.
    nAcademy Le 2avril 2014 – Neuros Monitoring • Outils – MySQL entreprise Monitor – Perconat Monitoring – Galeria – Query Analyzer
  • 39.
  • 40.
    nAcademy Le 2avril 2014 – Neuros Maintenance • Au niveau du code – Fermer les connexions inactives – Penser aux requêtes préparées • Backup de la base de données • Optimiser les tables et les données • Mise à jour régulière BDD • Faire des tests de performances
  • 41.
    nAcademy Le 2avril 2014 – Neuros Questions... ? @hellosct1 @neuro_paris Sources originales : - Arnaud Adant - Jay Pipes