PHP & MariaDB 
dans le libre
Christophe Villeneuve
@hellosct1
Qui... est Christophe Villeneuve ?
<<
afup – lemug.fr – mysql – mariadb – drupal – demoscene – firefoxos – drupagora – phptour – forumphp – solutionlinux – demoinparis – ici et maintenant – eyrolles – editions eni – programmez – linux pratique – webriver – phptv – neuros ­ elephpant
Les points d'aujourd'hui
● Une histoire simple 
d'un langage et d'une BDD
● MySQL 5.x   MariaDB 5.x←→
● MariaDB 10.x
● Les bases
● MariaDB dans vos développements
PHP
● 2015 : 20 ans
● PHP Tour : 12 & 13 mai 2015
● Forum PHP : 3eme Octobre 2015
● 15 ans AFUP
● PHP 7
   
   
✔ Fondé par
✔ Monty Widenius
✔ David Axmark
✔ 1983 – 1ère idée
✔ Fondé  en 1995 
✔ 2007 Préparation pour 
Nasdaq
✔ 2008 Rachat par Sun
✔ 2009 Sun racheté par Oracle
✔ Promesse de Oracle sur 5 
ans (fin 2014)
L'origine Dates importantes
Une histoire simple
   
✔ N° 1 dans le monde
✔ 500k Download (depuis 
2003)
✔ + 13M installation active
✔ MySQL Oracle
✔ Drizzle
✔ Percona
✔ MariaDB
✔ De nos jours... MySQL Forks
Et maintenant
   
   
✔ Communauté d'amis
✔ 100 % Open source et
compatible MySQL
✔ Plateforme d'innovation
✔ Des commiteurs
✔
Dec 2008 Création de Monty 
Program 
 → Monty Widenius
✔
MariaDB 5.1 (Fev 2010)
✔
MariaDB 5.2 (Nov 2010)
✔
MariaDB 5.3 (Avril 2012)
✔
MariaDB 5.5 (Avril 2012)
✔
MariaDB 10.0 (Nov 2012)
✔
2013 Fondation
✔
MariaDB 10.0.17 (Mars 15)
✔
MariaDB 10.1Galera people
Compression Multimaster 
Replication
MariaDB : un projet mature
   
GO     MariaDB
   
5.x 5.x
Compatibilité
   
✔ MariaDB 5.1   MySQL 5.1→
✔ MariaDB 5.2   MariaDB 5.1→
✔ MariaDB 5.3   MariaDB 5.2→
✔ MariaDB 5.5   MariaDB 5.3 + MySQL 5.5→
✔ MariaDB 10.0   MariaDB 5.5 + MySQL 5.6→
✔ MariaDB 5.6   MariaDB 5.5 + MySQL 5.6→
2015
✔ MariaDB 10.1   MariaDB 10.0 + MySQL 5.6/5.7→
Repère des versions
   
Apprentissage
   
✔ Plus de storages
✔ Vitesse
✔ Innodb, replication, stockage...
✔ Nombreuses extensions et fonctionnalités
✔ Colonnes virtuelles, colonne dynamique, multi...
✔ Plus de tests
✔ Tests correctifs, réactivités...
✔ Code source ouvert
✔ Développé par la communauté
En un mot... MariaDB
   
https://blog.mariadb.org/performance­evaluation­of­mariadb­10­1­and­mysql­5­7­4­labs­tplc/
Performance MariaDB 10.1 et MySQL 5.7.4
   
✔ PHP (driver natif)   BSD licence→
✔ Python
✔ Perl
✔ Ruby
✔ .NET avec MyODBC 
✔ JDBC (basé sur drizzle driver)
✔ C
✔ Oracle connector (licence GPL)
Tous sont LGPL   Aucune licence commerciale→
Différents connecteurs avec MariaDB
   
Solution : Mise à jour 
https://downloads.mariadb.org/mariadb/repositories
✔ Paquet Repositories
   
✔ EasyPHP
✔ Xampp
✔ WampServer
✔ PHPserver
✔ WampMSS
✔ Neard
Outils de dev : Environnement embarqué
3 exemples : 
­ 1 environnement déjà existant (Wampserver)
­ 1 nouvel environnement (Neard)
­ Linux
   
✔ DL MariaDB (http://mariadb.org)
✔ Installer dans 1 dossier MySQL
✔ Déplacer les BDD sauvegardées data
✔ Lancer Wampserver
Exemple 1 : wampserver (1/2)
   
Exemple 1 : Wampserver (2/2) avec phpMyAdmin 
   
✔
DL Neard
✔
http://sourceforge.net/projects/neard
✔
Installation
Exemple 2 : Neard
MySQL
MariaDB
   
✔ sudo apt-get install mariadb-server mariadb-client
✔ Vous retrouvez :
✔ /etc/mysql/my.cnf
✔ > mysql
✔ Au final
Exemple 3 : Linux
   
Au final par le code
<?php
echo phpinfo() ;
?>
   
Outils
✔ MySQL Workbench
✔ SkySQL visual Editor 
(SQLYog)
✔ HeidiSQL
✔ PhpMyAdmin
✔ Toad For MySQL
✔ ...
Pour vos requêtes
✔ MySQLdump
✔ XtraBackup
✔ mysqlhotcopy (MyISAM)
✔ XtraBackup manager (PHP)
✔ ...
Backup
   
 
   
✔ Précision date-heure
✔ Avant
✔ TIME
✔ DATETIME
✔ TIMESTAMP
✔ Dispo MariaDB 5.3+
✔ temporal functions
✔ CAST
✔ dynamic columns
Microseconds
Les fonctions (1/5)
   
✔ Create table t1 (d
DATETIME) ;
✔ Insert INTO t1 values....
✔ Select * from t1 ;
✔ Create table t2 (d
DATETIME (6) ) ;
✔ Insert Into t2 values
('2011-03-11'),
('2012-04-19 13:08:22'),
('2013-07-18 13:44:22.123456');
✔ Select * from t2 ;
Avant MariaDB 5.3+
Exemple (Microseconds)
   
✔ Dispo MariaDB 5.2+
✔ Colonne dans une table
qui sa valeur calculée
automatiquement
✔ 2 types :
✔ VIRTUAL : sur le
principe d'une vue
✔ PERSISTENT : Calculé
lorsque les données sont
insérées et stockées
dans une table
Microseconds
Colonnes virtuelles
Les fonctions (2/5)
Source : https://mariadb.com/kb/en/virtual­columns/
   
✔ CREATE TABLE table1 (
a INT NOT NULL,
b VARCHAR(32),
c INT AS (a mod 10) VIRTUAL,
d VARCHAR(5) AS (left(b,5)) PERSISTENT
);
✔ DESCRIBE table1;
Exemple (Colonnes Virtuelles) (1/2)
   
✔ INSERT INTO table1 VALUES
✔ (1, 'some text',default,default),
✔ (2, 'more text',5,default),
✔ (123, 'even more text',default,'something');
✔ Select * from table1;
Exemple (Colonnes Virtuelles) (2/2)
   
✔ Dispo MariaDB 10.0+
✔ Expressions régulières
✔ Compatible
✔ REGEXP
✔ RLIKE operator
✔ Fonctionne
✔ Multi caractères
Microseconds
Colonnes Virtuelles
PCRE
Les fonctions (3/5)
Source : https://mariadb.com/kb/en/pcre­regular­expressions/
   
✔ Fonction de remplace
✔ SELECT REGEXP_REPLACE('ab12cd','[0-9]','') AS r;
→ abcd
Exemple (PCRE) (1/2)
✔ Retourne 1ère position
✔ SELECT REGEXP_INSTR('abc','b') ;
→ 2
✔ SELECT REGEXP_INSTR('hello','o') ;
→ 5
   
✔ Retourne la partie correspondante d'une chaine
✔ SELECT REGEXP_SUBSTR(
'http://www.jdll.org/pratique/#Train',
'https?://[^/]*')
✔
→ https://www.jdll.org
Exemple (PCRE) (2/2)
   
✔ Dispo MariaDB 5.3+
✔ Pont entre les BDD
relationnelles et non
relationnelles
✔ Toutes les colonnes
stockées dans un 'blob'
✔ Possibilité de manipuler
✔ Possibilité de créer des
index virtuels
Microseconds
Colonnes virtuelles
REG EXP
Les fonctions (4/5)
Colonnes Dynamiques
   
create table newsql( 
id int 
    auto_increment    
    primary key,
nom varchar(40),
type enum 
     ('animal',
     'ordinateur'),
prix int,
nosql blob);
COLUMN_CREATE(
column_nr, 
value [as type],
[
column_nr, 
value [as type]
], 
...)
Exemple (colonne dynamique) 1/3
ID nom type Prix blob
Multi produits
   
Exemple (colonne dynamique) 2/3
>INSERT into newsql values (NULL, 'Atari' ,'ordinateur',500, 
COLUMN_CREATE('couleur', 'Noir', 'type' , 'STe'));
>INSERT into newsql values (NULL, 'elePHPant','animal',20, 
COLUMN_CREATE('taille', 'normal', 'description' , 'peluche'));
>UPDATE newsql SET nosql = COLUMN_ADD(nosql, 'couleur' , 'blue') 
WHERE id=2;
ID Nom type prix couleur type taille description
1 Atari Ordinateur 500 Noir Ste
2 elePHPant animal 20 bleu normal peluche
>SELECT nom, column_list (nosql) FROM newsql;
Multi produits
   
Exemple (colonne dynamique) 3/3
>SELECT nom, COLUMN_JSON(nosql) FROM newsql;
>SELECT id,type,nom,
COLUMN_GET(nosql, 'couleur' as char) AS couleur,prix FROM newsql;
Multi produits
   
✔ Dispo MariaDB 10.0.3+
✔ Une fonction en Storage
Engine
✔ Pas de création & pas de
lecture de table
✔ Principe
✔ Génère à la volée une
séquence de nombres
entiers
✔ Retourne le résultat
✔ Fonction Disparait
✔Plugin : ha_sequence
Microseconds
Colonnes virtuelles
REG EXP
Les fonctions (5/5)
Sequence Engine
REG EXP
Colonnes Dynamiques
   
Exemple (Sequence Engine) 1/2
> select * FROM seq_1_to_3;
> select * FROM seq_5_to_1_step_2;
   
Exemple (Sequence Engine) 2/2
✔ Calcul de date
Ex : Connaître le jour de la semaine d'une date
donnée :
✔ exemple : Le 1er Janvier tombe… Quand ?
> SELECT
DAYNAME('2015-01-01' + INTERVAL (seq) YEAR) day,
'2015-01-01' + INTERVAL (seq) YEAR date
FROM seq_0_to_10;
   
Moteur de stockage
storage engine
   
Insertion de données : TokuDB
● Moteur de stockage
● Natif dans MariaDB 5.5 & MariaDB 10.0+
●
(R)Tokutek & MariaDB
● Technique  utilise l'arbre fractal
– Amélioration indexation
– Amélioration des requêtes
●
Schéma de vitesse
●
Compression
●
Réplication
●
Souple
   
TokuDB : exemple
   
Manipuler les données : Connect
● Dispo MariaDB 10.0+
● ETL : Extract, transform et Load
● Lecture / Ecriture / MAJ
– TXT, DBF, INI, XML
– MS Access, MS Excel, TBL (similaire à MERGE)
– ODBC, MySQL,SQLite, Oracle, DB2, WMI...
● Locale ou distant
● Custom possible
● Accès en parallèle sur multitables
● Installation dans My.cnf
[mysqld]
plugin­load=ha_connect.so
   
Connect : exemple CSV
● Fichier
– first,last,birthday
– "Christophe","Villeneuve","Jan 1"
– "PHP","ODBC","Nov 22"
> CREATE TABLE users_csv (
     first  varchar(32) NOT NULL,
     last   varchar(32) NOT NULL,
     birthday  varchar(50) NOT NULL
) ENGINE=CONNECT  TABLE_TYPE =CSV  FILE_NAME ='/var/lib/mysql/users.csv' 
HEADER=1  SEP_CHAR=','  QUOTED=1;
> SELECT * FROM users_csv;
| first              | last            | birthday  |
+­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+
| Christophe  | Villeneuve | Jan 1      |
| PHP            | ODBC     | Nov 22     |
+­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­­­­­+
   
Connect : exemple ODBC
> create Table table2   
ENGINE=CONNECT TABLE_TYPE=ODBC
SRCDEF='select key, sum(l_quantity) qt from dbt3.table1 group by key'
CONNECTION='DSN=oracle;UID=login;PWD=password';
> MariaDB [dbt3]> select sum(qt) from (select qt  from table2) as 
result;
 → 31444  Valeur de sum(qt)
   
Recherche SphinxSE
● Dispo MariaDB 5.2+
● Recherche Full­text
● Ne stocke pas les données
● Client haut pour permettre à MariaDB de parler à Sphinx 
searchd
● Installation dans My.cnf
[mysqld] 
plugin­load= 'ha_sphinx.so';
   
Exemple SphinxSE
● CREATE TABLE t1 ( 
  id INTEGER UNSIGNED NOT NULL, 
  weight INTEGER NOT NULL, 
  query VARCHAR(3072) NOT NULL, 
  group_id INTEGER, 
  INDEX(query) 
) ENGINE=SPHINX 
CONNECTION="sphinx://localhost:9312/test";
● SELECT * FROM t1 WHERE query='test it;mode=any'; 
Poids
Entier
Votre requete
Indexation 
Requete
Group
   
Ouverture vers le NewSQL
● Moteur de stockage : CassandraSE 
● Dispo MariaDB 10.0+
● Brique de Apache Cassandra
● Données non relationnelles (NoSQL)
● Assurer l'intégration des données SQL / NoSQL
● Mapping possible
● Manipulations : 
static columns, dynamic columns, rowkey 
● Installation dans My.cnf
[mysqld]
plugin­load=ha_cassandra.so
   
CassandraSE : Utilisation (1/2)
> create table t2 (rowkey varchar(36) primary key,
data1 varchar(60),
data2 varchar(60)
) engine=cassandra
keyspace='mariadbtest'
thrift_host='localhost'
column_family='cf1';
 Clé 
primaire 
obligatoire
 Colonnes 
statiques
 Sous ensemble 
des colonnes CF
   
CassandraSE : Utilisation (2/2)
> insert into t1 values 
('rowkey10', 'data1­value', 123456), 
('rowkey11', 'data1­value2', 34543);
> select * from t1 where rowkey='rowkey11';
   
XA en Spider
● Dispo MariaDB 10.0+
●
Moteur de stockage fédérés comme
– Sharding / partitionnement *
– Transactions *
– Intégré dans le pool de connexion
– Haute disponibilité Cluster Shared­Nothing
 
●
Load balancing : 
– Accès par Spider cluster avec plusieurs serveurs 
MariaDB
   
Spider : Exemple
   
Moteur de stockage : Les autres
● XtraDB (MariaDB 10.0.9)
– Fork de InnoDB (Full compatible)
● Aria appelé Maria (MariaDB 5.1)
– Anciennement MyISAM
● Mroonga (MariaDB 10.0)
– fulltext searches with Chinese, Japanese and Korean languages
● Oqgraph (MariaDB 10.0)
– Utilisé pour mettre en œuvre des structures d'arbres
● Sequence (MariaDB 10.0)
– Retourne une séquence de nombres comme un jeu de résultats
● FederatedX (MariaDB 10.0)
– Fork de Federated
https://mariadb.com/kb/en/mariadb/documentation/storage­engines/
   
Futur
● Version majeure 10.1
● Plus de storages
● Encore plus de jSON
● Réplication : Galera Cluster
   
Merci

Php et Mariadb dans le libre - JDLL