Améliorer les performances SQL

1,565 views

Published on

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

Published in: Internet
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,565
On SlideShare
0
From Embeds
0
Number of Embeds
26
Actions
Shares
0
Downloads
28
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

×