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 ? …
•...
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 ...
nAcademy Le 2 avril 2014 – Neuros
Mauvaise utilisation
• Déplacer de nombreuses données à grandes échelles
– Cache ?
– Rép...
nAcademy Le 2 avril 2014 – Neuros
Mauvaise programmation
• Configuration Mémoire
• Absence de clef Primaire
• Les jointure...
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
• Main...
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 fiab...
nAcademy Le 2 avril 2014 – Neuros
Mémoire
• Liés au volume de données
• Liés aux nombres de connexions à la BDD
• Extra RA...
nAcademy Le 2 avril 2014 – Neuros
Choix du Systeme
• OS
– Linux / windows / Solaris/...
– CPU associé avec l'OS
• Vérifier...
nAcademy Le 2 avril 2014 – Neuros
Stockage
• Matériels
– Disque dur
– SSD
• Formatage
– Ext4
– XFS
– innodb_flush_method
•...
nAcademy Le 2 avril 2014 – Neuros
Et plus
• Si 1 disque
– Cache disque batterie de secours
• Log InnoDB
• Log Binaires
– S...
Configuration... SQL
nAcademy Le 2 avril 2014 – Neuros
Fonction EXPLAIN
• Obtenir des informations sur les SELECT
> EXPLAIN SELECT * FROM nom_d...
nAcademy Le 2 avril 2014 – Neuros
Fonction EXPLAIN : code
mysql> EXPLAIN SELECT f.film_id, f.title, c.name
> FROM film f I...
nAcademy Le 2 avril 2014 – Neuros
Repérer une colonne indexée
SELECT * FROM Orders
WHERE TO_DAYS(CURRENT_DATE())
– TO_DAYS...
nAcademy Le 2 avril 2014 – Neuros
Optimisation colonne indexée
CURRENT_DATE()... en PHP
$sql= « SELECT order_id, order_cre...
nAcademy Le 2 avril 2014 – Neuros
Jointure vs subqueries
• Garder les choses simples
• Manipuler les jeux de données
• Pen...
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 Bi...
nAcademy Le 2 avril 2014 – Neuros
Connexion persistante dans PHP
• Couche Abstraction DB lourde
–ADODB
–MDB2
–PearDB
–ORM
...
nAcademy Le 2 avril 2014 – Neuros
Requête cache
• threads_running... MySQL<=4
• Depuis il y a Query Cache
– query_cache_ty...
nAcademy Le 2 avril 2014 – Neuros
Requête Cache
• Le problème
– qcache_free_blocks > 5-10k
– stage/sql/Waiting for query c...
nAcademy Le 2 avril 2014 – Neuros
Configurer la table de cache
• Définir le nombre de table ouverte
–table_open_cache
–tab...
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_r...
nAcademy Le 2 avril 2014 – Neuros
Choix du moteur
• Moteur Moderne...
– InnoDB vs MyISAM
• InnoDB
– Scalable
– Moteur de t...
nAcademy Le 2 avril 2014 – Neuros
Optimisation dans my.cnf
• Utiliser la mémoire tampon
– innodb_buffer_pool_size
– Active...
Design BDD
nAcademy Le 2 avril 2014 – Neuros
Architectures des tables
• Intégrer les clefs primaires
• UTF-8 par rapport latin 1
• Co...
Monitoring
nAcademy Le 2 avril 2014 – Neuros
Monitoring
• Outils
– MySQL entreprise Monitor
– Perconat Monitoring
– Galeria
– Query A...
Maintenance
nAcademy Le 2 avril 2014 – Neuros
Maintenance
• Au niveau du code
– Fermer les connexions inactives
– Penser aux requêtes ...
nAcademy Le 2 avril 2014 – Neuros
Questions... ?
@hellosct1
@neuro_paris
Sources originales :
- Arnaud Adant
- Jay Pipes
Prochain SlideShare
Chargement dans…5
×

Améliorer les performances SQL

1 560 vues

Publié le

Présentation à la nAcademy (Avril 2014) : Améliorer les performances SQL par Christophe Villeneuve

Publié dans : Internet
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
1 560
Sur SlideShare
0
Issues des intégrations
0
Intégrations
27
Actions
Partages
0
Téléchargements
28
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Améliorer les performances SQL

  1. 1. nAcademy Le 2 avril 2014 – Neuros Améliorer les performances SQL Christophe Villeneuve
  2. 2. nAcademy Le 2 avril 2014 – Neuros Sommaire • Comment tuer SQL ? • Améliorés les idées mal reçues • Des pistes
  3. 3. Tuons SQL
  4. 4. 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 ?
  5. 5. nAcademy Le 2 avril 2014 – Neuros Tuons SQL : 3 raisons • Code • Design • Schema
  6. 6. nAcademy Le 2 avril 2014 – Neuros Mauvaise configuration • Architecture – Choisir le plus petit type de données possibles (BigInt?) – Champs indexés
  7. 7. 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
  8. 8. nAcademy Le 2 avril 2014 – Neuros Mauvaise programmation • Configuration Mémoire • Absence de clef Primaire • Les jointures • Sous requêtes • Alias • Select *...
  9. 9. nAcademy Le 2 avril 2014 – Neuros En résumé Performance != Scalability (Evolution)
  10. 10. Les pistes aux idées mals reçues
  11. 11. nAcademy Le 2 avril 2014 – Neuros Les pistes • Hardware / Systemes • Configuration... SQL • Design BDD • Monitoring • Maintenance
  12. 12. Hardware / Systèmes
  13. 13. nAcademy Le 2 avril 2014 – Neuros Carte mère • Benchmark • Monitoring
  14. 14. nAcademy Le 2 avril 2014 – Neuros CPU • Processeur multi-coeur – 32 à 80 cœurs – Fast CPU • Utile pour du stockage et fiable
  15. 15. 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
  16. 16. 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
  17. 17. nAcademy Le 2 avril 2014 – Neuros Stockage • Matériels – Disque dur – SSD • Formatage – Ext4 – XFS – innodb_flush_method • Vitesse Lecture / Ecriture
  18. 18. 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
  19. 19. Configuration... SQL
  20. 20. nAcademy Le 2 avril 2014 – Neuros Fonction EXPLAIN • Obtenir des informations sur les SELECT > EXPLAIN SELECT * FROM nom_de_table WHERE... •
  21. 21. 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
  22. 22. 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
  23. 23. 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 »;
  24. 24. 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
  25. 25. nAcademy Le 2 avril 2014 – Neuros Exemple : Jointure vs subqueries
  26. 26. 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 ?
  27. 27. 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
  28. 28. 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
  29. 29. nAcademy Le 2 avril 2014 – Neuros Requête Cache • Le problème – qcache_free_blocks > 5-10k – stage/sql/Waiting for query cache lock
  30. 30. 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
  31. 31. nAcademy Le 2 avril 2014 – Neuros Configurer la table de cache
  32. 32. 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
  33. 33. nAcademy Le 2 avril 2014 – Neuros Choix du moteur • Moteur Moderne... – InnoDB vs MyISAM • InnoDB – Scalable – Moteur de texte integral – API Memcache (Haute performance)
  34. 34. 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
  35. 35. Design BDD
  36. 36. 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
  37. 37. Monitoring
  38. 38. nAcademy Le 2 avril 2014 – Neuros Monitoring • Outils – MySQL entreprise Monitor – Perconat Monitoring – Galeria – Query Analyzer
  39. 39. Maintenance
  40. 40. 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
  41. 41. nAcademy Le 2 avril 2014 – Neuros Questions... ? @hellosct1 @neuro_paris Sources originales : - Arnaud Adant - Jay Pipes

×