requete simple mais trop longue d'execution
Posté : 07 oct. 2008, 11:45
hello à tous,
pour ceux qui avait suivi ma précedente discution faut t'il ranger les données en lignes ou en colonne pour un table de 200 colonnes (ou plus) et 10 millions de ligne on a décider pour l'instant de laisser en colonnes.
Mais on tombe rapidement sur un problème auquel (meme vous) n'aviez pas penser.
Il est possible d'effectuer des WHERE sur toutes les colonnes (le but final est en grande majorité de compter un nombre de ligne en fonction de condition)
Partont de cette exempe simple : SELECT count(*) FROM grosse_table WHERE (champ1 > 2007 and champ2='oui' ) or (champ1 > 2007 and champ3='SAT')
le probleme c'est que j'ai 10 million de ligne et effectuer des where sur des champs pas indexer pour une table aussi grande ben ca rame (environ 30 secondes, sur un machine très costaud). Si j'indexe les champ1, champ2, et champ3 , eh bien ca ne change rien au résultat. Un explain indique qu'il n'utilise qu'un seul indexe sur 3 trouvés.
1/ Vous comprenez ?
2/ Vous avez des idées pour booster ce genre de requete ?
on a essayé de mettre la table en memoire, on tombe à 10 seconde pour le requete ce qui est toujours trop long
3/ on utilise le moteur myisam. Mais on n'effectue que de la lecture sur cette table, aucune insert update ou delete. Y a t'il d'autre moteur meme non officiel plus rapide pour de la lecture seul ?
Merci pour vos idées et commentaires
(créer à la main juste pour l'exemple je pense pas que les 200 colonnes vous soit utile
)
pour ceux qui avait suivi ma précedente discution faut t'il ranger les données en lignes ou en colonne pour un table de 200 colonnes (ou plus) et 10 millions de ligne on a décider pour l'instant de laisser en colonnes.
Mais on tombe rapidement sur un problème auquel (meme vous) n'aviez pas penser.
Il est possible d'effectuer des WHERE sur toutes les colonnes (le but final est en grande majorité de compter un nombre de ligne en fonction de condition)
Partont de cette exempe simple : SELECT count(*) FROM grosse_table WHERE (champ1 > 2007 and champ2='oui' ) or (champ1 > 2007 and champ3='SAT')
le probleme c'est que j'ai 10 million de ligne et effectuer des where sur des champs pas indexer pour une table aussi grande ben ca rame (environ 30 secondes, sur un machine très costaud). Si j'indexe les champ1, champ2, et champ3 , eh bien ca ne change rien au résultat. Un explain indique qu'il n'utilise qu'un seul indexe sur 3 trouvés.
1/ Vous comprenez ?
2/ Vous avez des idées pour booster ce genre de requete ?
on a essayé de mettre la table en memoire, on tombe à 10 seconde pour le requete ce qui est toujours trop long
3/ on utilise le moteur myisam. Mais on n'effectue que de la lecture sur cette table, aucune insert update ou delete. Y a t'il d'autre moteur meme non officiel plus rapide pour de la lecture seul ?
Merci pour vos idées et commentaires
(créer à la main juste pour l'exemple je pense pas que les 200 colonnes vous soit utile
Code : Tout sélectionner
CREATE TABLE `grosse_table` (
`id_client` int(11) NOT NULL auto_increment,
`champ1` int(11) NOT NULL,
`champ2` text NOT NULL,
`champ3` text NOT NULL,
PRIMARY KEY (`id_client`)
) ENGINE=myisam DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;