Salut
bon ça fait des mois que je galères avec ces foutus indexes et requêtes à optimiser et j'aurais vraiment besoin d'un sacré coup de main, car mes projets ne peuvent avancer si je ne règle pas tous ces problèmes d'optimisation de requêtes et d'indexes. :?
Donc je poserais ici une question a la fois, concernant ces soucis d'indexes et optimisation, pour avancer pas par pas.
Je ne comprend pas le fonctionnement de ce fichu optimiseur mysql (et c'est pas faute d'avoir lu de nombreux articles sur le sujet), qui me rend chèvre.
Procédons donc par étape.
Voici ma première question, normalement simple pour une mise en bouche (les autres on verra plus tard quand celle ci sera d'abord résolu)
ma table t_commentaires
voici une requête simple qui devrait poser aucun problème au 1er abord :
avec la clause where et le order by par date je devrais donc utiliser correctement l'index `idx_ligne_date` hors voici le résultat de l'explain
on constate qu'il prend bien la clé idx_ligne_date,mais qu'il ne s'en sert pas correctement.
La preuve :
- il balai toutes les lignes ayant en_ligne=1, soit quasi toutes (rows = 53495), alors qu'on devrait avoir rows = 5
- dans le extra on devrait trouver : Using where, Using index
dans l'index idx_ligne_date il devrait y avoir ceci :
1 dateA
1 dateB
1 dateC
....
0 dateAA
0 dateBB
Par conséquent mysql n'a aucune raison de balayer quasiment tous les enregistrements et devrez utiliser correctement l'index idx_ligne_date.
bon ça fait des mois que je galères avec ces foutus indexes et requêtes à optimiser et j'aurais vraiment besoin d'un sacré coup de main, car mes projets ne peuvent avancer si je ne règle pas tous ces problèmes d'optimisation de requêtes et d'indexes. :?
Donc je poserais ici une question a la fois, concernant ces soucis d'indexes et optimisation, pour avancer pas par pas.
Je ne comprend pas le fonctionnement de ce fichu optimiseur mysql (et c'est pas faute d'avoir lu de nombreux articles sur le sujet), qui me rend chèvre.
Procédons donc par étape.
Voici ma première question, normalement simple pour une mise en bouche (les autres on verra plus tard quand celle ci sera d'abord résolu)
ma table t_commentaires
Code:
CREATE TABLE `t_commentaires` (
`id_commentaire` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_bloc` int(10) unsigned NOT NULL DEFAULT '0',
`id_membre` int(10) unsigned NOT NULL DEFAULT '0',
`pseudo` varchar(15) NOT NULL,
`commentaire` text NOT NULL,
`email` varchar(100) NOT NULL,
`url_perso` varchar(200) NOT NULL,
`ip` varchar(100) NOT NULL,
`date_ajout` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`en_ligne` tinyint(1) unsigned NOT NULL DEFAULT '0',
`id_commentaire_parent` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id_commentaire`),
KEY `id_commentaire_parent` (`id_commentaire_parent`),
KEY `idx_ip_date` (`ip`,`date_ajout`),
KEY `idx_membre_date` (`id_membre`,`en_ligne`,`date_ajout`),
KEY `date_ajout` (`date_ajout`),
KEY `idx_bloc_date` (`id_bloc`,`en_ligne`,`date_ajout`),
KEY `idx_ligne_date` (`en_ligne`,`date_ajout`)
) ENGINE=MyISAM AUTO_INCREMENT=105265 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
voici une requête simple qui devrait poser aucun problème au 1er abord :
Code:
select c.pseudo,c.date_ajout, c.commentaire FROM t_commentaires AS c WHERE c.en_ligne = 1 ORDER BY c.date_ajout DESC LIMIT 0, 5
avec la clause where et le order by par date je devrais donc utiliser correctement l'index `idx_ligne_date` hors voici le résultat de l'explain
Code:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE c ref idx_ligne_date idx_ligne_date 1 const 53495 Using where
on constate qu'il prend bien la clé idx_ligne_date,mais qu'il ne s'en sert pas correctement.
La preuve :
- il balai toutes les lignes ayant en_ligne=1, soit quasi toutes (rows = 53495), alors qu'on devrait avoir rows = 5
- dans le extra on devrait trouver : Using where, Using index
dans l'index idx_ligne_date il devrait y avoir ceci :
1 dateA
1 dateB
1 dateC
....
0 dateAA
0 dateBB
Par conséquent mysql n'a aucune raison de balayer quasiment tous les enregistrements et devrez utiliser correctement l'index idx_ligne_date.