table MySQL : optimisation / structure

Répondre
i M@N
le 14/12/2005 à 17:17
i M@N
Hello !

Je suis pas trop au point sur les choix de type de champ MySQL aussi je me pose la question du meilleur format de chaque champ pour plusieurs tables MySQL.

J'ai plusieurs tables similaires avec cette structure :
## 
## Structure de la table `catalogue`
##

DROP TABLE IF EXISTS `catalogue`;
CREATE TABLE IF NOT EXISTS `catalogue` (
/*sans commentaire*/
`id` int(6) NOT NULL auto_increment,
/*contenu = soit 1 chiffre + 1 lettre
soit 2chiffres + 1lettre
soit 3 lettres*/
`format` char(3) NOT NULL default '10p',
/*chiffres ou lettres*/
`label` text NOT NULL,
/*pareil*/ `artiste` text NOT NULL,
`titre` text NOT NULL,
/*pareil mais par défaut doit être = x*/
`riddim` char(50) NOT NULL default 'x',
/*un prix variable entre 1.00 et 20.00€*/
`prix` text NOT NULL,
/*lettres par défaut doit être = x*/
`type` char(50) NOT NULL default 'x',
/*binaire : 0 ou 1*/
`new` int(3) NOT NULL default '0',
/*chiffres seulement*/
`quantity` int(3) NOT NULL default '1',
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM;
Donc la question que je me pose vu que les enregistrement sont de l'odre de plusieurs milliers c'est si la table a une structure adéquate et optimisée histoire de gagner du temps dans l'exécution des requêtes.

Merci d'avance pour vos remarques.

@+...
One Love, One Heart, One Unity.
LA GLOBULE
le 14/12/2005 à 19:37
LA GLOBULE
Pour le binaire, fait un enum, pour tout ce qui est texte, vérifie que ca ne peut pas rentrer dans un varchar.

Apres, pour que ca soit rapide, c'est pas en mettant un varchar 200 au lieu d'un varchar 255 que ca sera plus rapide.
Fais des index.
manu56
le 14/12/2005 à 20:26
manu56
Salut !
Je profite du topic pour demander l'utilité des index, je vois pas vraiment sa fonction ...

Merci
LA GLOBULE
le 14/12/2005 à 21:06
LA GLOBULE
Ben ca accelere grandement les requetes !

Pour schematiser, au lieu de lire un livre page par page pour trouver une info, tu lis le sommaire.
LupusMic
le 15/12/2005 à 06:57
LupusMic
DROP TABLE IF EXISTS `catalogue`;
CREATE TABLE IF NOT EXISTS `catalogue`
( `id` int(6) NOT NULL auto_increment
, `format` char(3) NOT NULL default '10p' /* ~ (\d[\w\D]|\d{2}[\w\D]|[\w\D]{3}) */
, `label` text NOT NULL /* ~ \w* */
, `artiste` text NOT NULL /* ~ \w* */
, `titre` text NOT NULL /* ~ \w* */
, `riddim` char(50) NOT NULL default 'x' /* ~ \w* */
, `prix` float(2,2) NOT NULL /* ~ \d{2},\d{2} */
, `type` char(50) NOT NULL default 'x' /* ~ \w* */
, `new` boolean NOT NULL default false /* ~ (false|true) */
, `quantity` int(3) NOT NULL default '1' /* ~ \d* */
) ENGINE=MyISAM;


Unique key est inutile lorsque tu as un auto_increment, car il est par défaut la clé primaire.

Est-ce que les formats sont connus d'avance et en nombre réduit ? Si oui, il suffit d'en faire une énumération.

Es-tu certain de ne pas avoir plus de 100.000 articles dans ton catalogue ? :-D

label, artiste et titre devrait plutôt être des varchar : ils ont vocation à être cours comme libellé, non ?
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
i M@N
le 15/12/2005 à 18:12
i M@N
Hello !

Merci déjà pour les réponses.

les formats sont au nombre de 6 : 7p, 10p, 12p, lp, cd, dvd. > Je mets le champs en enum c'est ça?

Doit y avoir genre 20.000 entrées.

Pour label wé c'est court, mais artiste et titre y'en a qui font plus de 50 caractères.

@+...
One Love, One Heart, One Unity.
i M@N
le 15/12/2005 à 19:36
i M@N
Reuh ...

N'empêche que 4 secondes pour générer une page c'est un peu long quand même ...

@+...
One Love, One Heart, One Unity.
LA GLOBULE
le 15/12/2005 à 22:31
LA GLOBULE
C'est meme enorme !

Au boulot, je fais des select sur une table à 3 000 000 d'entrée avec des jointures sur d'autres tables, mes pages s'affichent en 10 ms.
i M@N
le 16/12/2005 à 11:14
i M@N
Hello !

Bah wé ... le script en question est hébergé chez unetun.com et fait une requête sur environ 5.000 enregistrements de la table : ça prend entre 3 et 4 secondes.

En bref y'a deux requêtes comme ça :
<?php
$sql = 'SELECT count(*) FROM cat_'.$format.'
WHERE label = "'.$label.'" AND qty >= "1"'
...
$sql = 'SELECT * FROM cat_'.$format.'
WHERE label = "'.$label.'"
AND qty >= "1"
ORDER BY label,artiste,riddim
LIMIT '.$debut.','.$nb_affichage_par_page.'';
?>
J'ai gardé le SELECT * vu que j'ai besoin de tous les champs de l'enregistrement.

Je me demande si c'est mon code qui pue ou si c'est l'hébergeur ... à priori ça vient de unetun.com parce que chez moi le script s'exécute en moins d'une seconde.

@+...
One Love, One Heart, One Unity.
Répondre
LoadingChargement en cours