Upload
neuros
View
944
Download
0
Embed Size (px)
DESCRIPTION
Présentation à la nAcademy (Avril 2014) : Améliorer les performances SQL par Christophe Villeneuve
Citation preview
nAcademy Le 2 avril 2014 Neuros -
Sommaire
• Comment tuer SQL ?
• Améliorés les idées mal reçues
• Des pistes
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 -
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 -
Les pistes
• Hardware / Systemes
• Configuration... SQL
• Design BDD
• Monitoring
• Maintenance
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
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 : codemysql> 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: SIMPLEtable: ctype: ALLpossible_keys: PRIMARYkey: NULLkey_len: NULLref: NULLrows: 16Extra:*************************** 2. row ***************************select_type: SIMPLEtable: fctype: refpossible_keys: PRIMARY,fk_film_category_categorykey: fk_film_category_categorykey_len: 1ref: sakila.c.category_idrows: 1Extra: Using temporary; Using index*************************** 3. row ***************************select_type: SIMPLEtable: ftype: eq_refpossible_keys: PRIMARY,idx_titlekey: PRIMARYkey_len: 2ref: sakila.fc.film_idrows: 1Extra: 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 OrdersWHERE TO_DAYS(CURRENT_DATE())– TO_DAYS(order_created) <= 7;
Mauvaise idée... Risque de nombreux problèmes...
SELECT * FROM OrdersWHERE order_created>= CURRENT_DATE() INTERVAL7 DAY;
Mieux... sauf pour order_created
SELECT order_id, order_created, customerFROM OrdersWHERE 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 -
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 = 200query_cache_type = 0query_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 = 5000key_buffer = 320M
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
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
nAcademy Le 2 avril 2014 Neuros -
Monitoring
• Outils–MySQL entreprise Monitor
– Perconat Monitoring
– Galeria
– Query Analyzer
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