41
nAcademy Le 2 avril 2014 Neuros - Améliorer les performances SQL Christophe Villeneuve

Améliorer les performances SQL

  • 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 -

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 : 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 -

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 = 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 -

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