Sources MySQL
Sources MySQLConsultez toutes les sources
Nombre d'auteurs : 10, nombre de sources : 21, dernière mise à jour : 9 octobre 2010
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 :
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).
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.
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).