Select sur X millions de lignes...

jeremy80
Invité n'ayant pas de compte PHPfrance

18 juin 2009, 19:03

Bonjour,

Je suis en train de concevoir une base de données et je me pose quelques questions...

Je sais que ça n'arrivera jamais mais je ne peux pas m'empêcher de le prévoir :D :
=> imaginez qu'une table du type :

Code : Tout sélectionner

CREATE TABLE ma_table( id INT PRIMARY KEY, nom VARCHAR(100) NOT NULL DEFAULT='' );
atteigne un nombre très important de lignes (ex: 5 000 000), combien de temps prendrais une requête du type :

Code : Tout sélectionner

SELECT nom FROM ma_table WHERE id='2285423';
car elle devrait alors parcourir les 5 000 000 de lignes afin de trouver la bonne, serait-ce assez rapide ? ou dois-je réfléchir à une autre conception pour ma base ?

Je n'ai pas d'exemple ni d'extrait à vous montrer, les seules traces sont sur papier pour le moment... :wink:

à vos expériences :lol:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

18 juin 2009, 19:31

Déjà, première chose à faire :

Puisque ton champ id est de type INT, ta requête est mal écrite :
SELECT nom FROM ma_table WHERE id='2285423' // MAL
SELECT nom FROM ma_table WHERE id=2285423   // BIEN
Ensuite, il est utile de placer un index sur les champs servant à faire des recherches,
mais comme id est ta clé primaire, on va dire que c'est déjà fait.

jeremy80
Invité n'ayant pas de compte PHPfrance

18 juin 2009, 19:53

oui autant pour moi pour la syntaxe de la requête... #-o

et donc, est-il judicieux de faire une requête SELECT sur une table à plusieurs millions de lignes ?! ou est-ce que cela prendrais trop de temps ?

Merci de vous pencher sur mon problème :pouce:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

18 juin 2009, 20:07

et donc, est-il judicieux de faire une requête SELECT sur une table à plusieurs millions de lignes ?!
ou est-ce que cela prendrais trop de temps ?
Explique-moi comment tu comptes récupérer des données depuis une table sans passer par un SELECT ?... ;)

Ce que tu peux faire, c'est optimiser ta table pour éviter la charge :
- privilégier les champs numériques aux chaines,
- préférer les relations au redondances,
- placer les index là où c'qu'il faut

Après, vogue la galère !

jeremy80
Invité n'ayant pas de compte PHPfrance

18 juin 2009, 20:18

ok merci chef :merci:

je vais donc me débrouiller pour correctement organiser mes relations et privilégier les champs numériques... au cas où le succès tenterais de me surprendre :lol:

merci d'avoir pris le temps de me répondre et bonne continuation sur le forum ;) a plus !

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

18 juin 2009, 21:17

À bientôt !

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)

jeremy80
Invité n'ayant pas de compte PHPfrance

18 juin 2009, 21:26

Après plusieurs recherches, je suis tombé sur cet article sur le partitionnement (en base de données) :

http://krierjon.developpez.com/mysql/partitionnement/

Je fais donc part de ma trouvaille aux éventuels développeurs se posant la même question que moi \:D/

Je ne vais pas me servir du partitionnement car je ne pense pas atteindre les X millions d'enregistrements mais si cela devait arriver, alors j'opterais pour ce fameux partitionnement :!:

Je ne vous en dit pas plus, tout est bien expliqué dans l'article ci-joint.

A plus et bon :ordi:

ViPHP
ViPHP | 5924 Messages

18 juin 2009, 23:52

C'est ultra spécifique, j'ai eu du mal à comprendre l'intérêt.
Après lecture des motivations de la technique, il faut vraiment très bien connaître le fonctionnement d'un SGBD pour que cela soit utile. Donc je le déconseille, tout simplement. Il y a trop de risque de rater le partitionnement et de pourrir les performances…

ViPHP
ViPHP | 2287 Messages

19 juin 2009, 12:38

Bonjour,
Je suis en train de concevoir une base de données et je me pose quelques questions...

Je sais que ça n'arrivera jamais mais je ne peux pas m'empêcher de le prévoir :D :
=> imaginez qu'une table du type :

Code : Tout sélectionner

CREATE TABLE ma_table( id INT PRIMARY KEY, nom VARCHAR(100) NOT NULL DEFAULT='' );
atteigne un nombre très important de lignes (ex: 5 000 000), combien de temps prendrais une requête du type :

Code : Tout sélectionner

SELECT nom FROM ma_table WHERE id='2285423';
car elle devrait alors parcourir les 5 000 000 de lignes afin de trouver la bonne, serait-ce assez rapide ? ou dois-je réfléchir à une autre conception pour ma base ?
La réponse dépendrait de plein de facteurs que toi seul maîtrise (OS, ressources matérielles de la machine, charge du système au moment du test, version du serveur MySQL et du moteur de stockage utilisé...).

Mais je m'interroge : pourquoi ne pas faire le test toi-même en créant une table avec 5 millions de tuples ? Tu en as pour moins de temps à faire le test qu'à écrire un post dans ce forum.

Yapuka ;-)
if(!@work()){ Nespresso(); } else { what(); }
______________________________