IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Sources MySQL

Sources MySQLConsultez toutes les sources

Nombre d'auteurs : 10, nombre de sources : 21, dernière mise à jour : 9 octobre 2010 

 
OuvrirSommaireAdministration
précédentsommairesuivant
 
 

Cette requête donne la taille (en Mo) occupée par les tables d'une base de données, de la plus à la moins volumineuse :

Requête
Sélectionnez
SELECT
	TABLE_NAME, ROUND((DATA_LENGTH + INDEX_LENGTH) / (1024 * 1024), 2) AS TAILLE
FROM
	INFORMATION_SCHEMA.TABLES
WHERE
	TABLE_SCHEMA = 'nom_base'
ORDER BY
	DATA_LENGTH + INDEX_LENGTH DESC

Cette requête ne fonctionne qu'avec une version de MySQL possédant un catalogue (version 5.0.2 ou postérieure).

Créé le 20 août 2008  par Cédric Duprez

Page de l'auteur
Téléchargez le zip

Comment peut-on évaluer l'efficacité d'un index ?

Un index est efficace si il est placé sur une colonne possédant peu de doublons (NULLs compris). En effet le SGBD indexe les valeurs, ce qui implique que la présence de doublons réduit le nombre d'index.
Autrement dit, un index est performant si la différence entre le nombre de tuples total et le nombre de valeurs distinctes tend vers 0.
Nous chercherons donc à calculer le ratio du nombre de valeurs distinctes sur le nombre total de tuples, plus ce ratio est proche de 1, et plus l'index est performant.

Requête
Sélectionnez
SELECT
	t.TABLE_SCHEMA AS `base`, t.TABLE_NAME AS `table`, s.INDEX_NAME AS `index name`
	, s.COLUMN_NAME AS `champ`, s.SEQ_IN_INDEX `seq in index`, s2.max_columns AS `nb cols`
	, s.CARDINALITY AS `card`, t.TABLE_ROWS AS `nb lignes`
	, ROUND(((s.CARDINALITY / IFNULL(t.TABLE_ROWS, 0.01)) * 100), 2) AS `sel %`
FROM
	INFORMATION_SCHEMA.STATISTICS s
INNER JOIN
	INFORMATION_SCHEMA.TABLES t
	ON
	s.TABLE_SCHEMA = t.TABLE_SCHEMA
	AND s.TABLE_NAME = t.TABLE_NAME
INNER JOIN
	(
  	SELECT
		TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, MAX(SEQ_IN_INDEX) AS max_columns
  	FROM
	  	INFORMATION_SCHEMA.STATISTICS
  	WHERE
	  	TABLE_SCHEMA != 'mysql'
  	GROUP BY
	  	TABLE_SCHEMA, TABLE_NAME, INDEX_NAME
	) AS s2
	ON
	s.TABLE_SCHEMA = s2.TABLE_SCHEMA
	AND s.TABLE_NAME = s2.TABLE_NAME
	AND s.INDEX_NAME = s2.INDEX_NAME

WHERE
	/* exclut la base système 'mysql' */
	t.TABLE_SCHEMA != 'mysql'
	
	/* uniquement les tables avec un minimum de 10 lignes */
	AND t.TABLE_ROWS > 10
	
	/* au moins une valeur non nulle dans la colonne indexée */
	AND s.CARDINALITY IS NOT NULL
	
	/* exclut les index qui n'ont pas de problèmes de performance (ratio = 1) */
	AND (s.CARDINALITY / IFNULL(t.TABLE_ROWS, 0.01)) < 1.00
ORDER BY
	`sel %`, s.TABLE_SCHEMA, s.TABLE_NAME 
LIMIT 10;

Cette requête ne fonctionne qu'avec une version de MySQL possédant un catalogue (version 5.0.2 ou postérieure).

Créé le 20 août 2008  par Jay Pipes

Page de l'auteur
Téléchargez le zip

précédentsommairesuivant
 
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2004 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.