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. nAcademy Le 2 avril 2014 – Neuros
Tuons SQL : 3 raisons
• Code
• Design
• Schema
6. nAcademy Le 2 avril 2014 – Neuros
Mauvaise configuration
• Architecture
– Choisir le plus petit type de données possibles (BigInt?)
– Champs indexés
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. nAcademy Le 2 avril 2014 – Neuros
Mauvaise programmation
• Configuration Mémoire
• Absence de clef Primaire
• Les jointures
• Sous requêtes
• Alias
• Select *...
9. nAcademy Le 2 avril 2014 – Neuros
En résumé
Performance
!=
Scalability
(Evolution)
13. nAcademy Le 2 avril 2014 – Neuros
Carte mère
• Benchmark
• Monitoring
14. nAcademy Le 2 avril 2014 – Neuros
CPU
• Processeur multi-coeur
– 32 à 80 cœurs
– Fast CPU
• Utile pour du stockage et fiable
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. 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
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
20. nAcademy Le 2 avril 2014 – Neuros
Fonction EXPLAIN
• Obtenir des informations sur les SELECT
> EXPLAIN SELECT * FROM nom_de_table
WHERE...
•
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. 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. 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. 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. nAcademy Le 2 avril 2014 – Neuros
Exemple : Jointure vs subqueries
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. 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. 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. 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. 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. nAcademy Le 2 avril 2014 – Neuros
Configurer la table de cache
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. 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. 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
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
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. nAcademy Le 2 avril 2014 – Neuros
Questions... ?
@hellosct1
@neuro_paris
Sources originales :
- Arnaud Adant
- Jay Pipes