2009-10-30 7 views
-1

Je vais créer 5 tables, à savoir les tables data1, data2, data3, data4 et data5. Chaque table ne peut stocker que 1000 enregistrements de données.Insérer automatiquement sur une nouvelle table?

Quand une nouvelle entrée ou quand je veux insérer une nouvelle donnée, je dois faire un chèque,

$ data1 = mysql_query (SELECT * FROM data1);

<?php 
    if(mysql_num_rows($data1) > 1000){ 
    $data2 = mysql_query(SELECT * FROM data2); 
    if(mysql_num_rows($data2 > 1000){ 
     and so on... 
    } 
    } 

Je pense que ce n'est pas la bonne façon? Je veux dire, si je suis l'utilisateur 4500, il faudrait un certain temps pour faire tout le contrôle. Y a-t-il une meilleure façon de résoudre ce problème?

+2

Pourriez-vous développer le motif de la limite de 1000 enregistrements? – deceze

+0

Je n'ai pas décidé des chiffres, il peut s'agir de 5000 ou 10000 données. La raison en est la flexibilité et la portabilité? Eh bien, un de mes gourou sql me suggère de faire de cette façon – myphpsql00

Répondre

3

paradis j'ai décidé les chiffres, il peut être 5000 ou 10000 données. La raison en est la flexibilité et la portabilité? Eh bien, l'un de mon gourou sql me suggérer de faire de cette façon

À moins que votre gourou parlait quelque chose comme Partitioning, je doute sérieusement ses conseils. Si votre base de données ne peut pas gérer plus de 1000, 5000 ou 10000 lignes, recherchez une autre base de données. À moins que vous n'ayez un exemple vraiment précis sur la façon dont une limite d'enregistrement vous aidera, ce ne sera probablement pas le cas. Avec le montant des frais généraux, il ajoute que cela ne fait que compliquer les choses sans aucun gain.

Une table de base de données correctement configurée peut facilement gérer des millions d'enregistrements. Le découper en tables séparées n'augmentera probablement ni la flexibilité ni la portabilité. Si vous accumulez suffisamment d'enregistrements pour rencontrer des problèmes de performances, félicitez-vous pour un travail bien fait et inquiétez-vous alors.

+2

+1. Vérifiez toujours la validité de ces déclarations. En fait, si la personne en question s'appelle lui-même un gourou, alors ignorez son conseil immédiatement. ;-) – Duroth

+1

+1 parce que je ne vois pas non plus pourquoi. Les requêtes ne sont pas plus rapides, cela n'aide pas à la sécurité des données ... la seule raison à laquelle je pense est que les fichiers de base de données ne devraient pas être plus gros que xxxKB ... mais il n'y a pas de raison non plus. – Bobby

0

Vous pouvez conserver une table de "suivi" pour garder une trace de la table actuelle entre les demandes.

être également en état d'alerte pour conditions de course (opérations d'utilisation, ou InSure un seul processus est en cours d'exécution à la fois.)

Aussi, ne pas $data1 = mysql_query(SELECT * FROM data1); avec imbriqué si ce, faire quelque chose comme:

$i = 1; 
do { 
    $rowCount = mysql_fetch_field(mysql_query("SELECT count(*) FROM data$i")); 
    $i++; 
} while ($rowCount >= 1000); 
1

En savoir plus sur comment count rows in mysql. Selon le moteur de base de données que vous utilisez, effectuer des opérations count (*) sur les tables InnoDB est assez coûteux et ces comptages doivent être effectués par des triggers et suivis dans une table d'informations adjacente.

La structure que vous décrivez est souvent conçue autour d'une table de correspondance. On interroge la table de mappage pour trouver la table de destination associée à une clé primaire.

0

Je serais surpris si MySQL ne dispose pas d'un moyen sophistiqué de gérer cela automatiquement (ou du moins, mieux que ce que je vais proposer), mais voici une façon de le faire.

1. Insert record into 'data' 
2. Check the length of 'data' 
3. If >= 1000, 
    - CREATE TABLE 'dataX' LIKE 'data'; 
     (X will be the number of tables you have + 1) 
    - INSERT INTO 'dataX' SELECT * FROM 'data'; 
    - TRUNCATE 'data'; 

Cela signifie que vous serez toujours insérer dans la table 'données' et 'data1', 'données2', 'data3', etc sont vos versions archivées de cette table.

0

Vous pouvez create a MERGE table comme ceci:

CREATE TABLE all_data ([col_definitions]) ENGINE=MERGE UNION=(data1,data2,data3,data4,data5); 

Ensuite, vous pourrez compter les lignes au total avec une requête comme SELECT COUNT(*) FROM all_data.

Questions connexes