2010-11-04 5 views
1

Contextemysql :: quel type si insérer?

J'ai essentiellement un tableau,

ce tableau a le format suivant

 
Array 
(
    [0] => Array 
     (
      [co_id] => 1 
      [co_fname] => First 
      [co_lname] => Last 
      [co_company] => Company 
      [co_address] => Address 
      [co_ddi] => ddinumber 
      [co_mobile] => mobilenumber 
      [co_fax] => 
      [co_email] => [email protected] 
      [co_usms] => 1 
      [co_ufax] => 0 
      [co_uemail] => 1 
      [a_id] => 3 
     ) 
)

Je bouclez ce tableau et je crée des instructions d'insertion.

Il existe trois tables, Message_email, Message_fax, Message_sms. Si un contact a co_u (sms/fax/email) comme 1 j'ajoute l'ID de contacts, et les informations de contact respectives (co_mobile/co_fax/co_email) à son tableau respectif ($ mobile/$ fax/$ sms) .

Les informations du tableau sont ensuite ajoutées aux tables.


Question

Ces tableaux peuvent être assez grand (pensez 200k + contacts).

Si I.

a) Créer une seule instruction d'insertion en bloc.
b) Créez plusieurs instructions d'insertion en masse plus petites.
c) Faites une instruction d'insertion pour chaque contact.

La vitesse est bonne mais pas tellement un problème. La fiabilité est la grande.

Matt

Répondre

0

je fais généralement des lots en fonction de la longueur de la requête SQL. Je construis la requête, annexant à chaque fois jusqu'à ce qu'il atteigne une longueur facile (10000 caractères est une belle longueur), puis rincer au serveur:

$query = 'INSERT INTO FOO (values) VALUES '; 
$separator = ''; 
$values = ''; 
foreach ($rows as $row) { 
    $values .= $separator . '('.$row.')'; 
    $separator = ', '; 
    if (strlen($values) >= 10000) { 
     query($query . $values); 
     $values = ''; 
     $separator = ''; 
    } 
} 
if (!empty($values)) query($query . $values); 

Il est agréable car il compense les petits inserts (int, int) et les plus gros (int, text, text) ... De plus, vous ne risquez pas que la requête prenne trop de temps et retarde votre connexion (ou bloque les autres utilisateurs pendant trop longtemps). Avec mes ensembles de données, les caractères 10k semblent être un bon point. Puisque MAX_PACKET est habituellement de 1 mb, vous pouvez aller jusqu'à 750k ou plus et avoir encore beaucoup de place pour l'erreur (en fonction de votre jeu de données). Mais je préférerais utiliser un tas de plus petits lots qu'un énorme ...

0

Insertion par lots est une bonne idée car le cache de votre requête se fait prendre beaucoup moins par opposition aux inserts faisant un par un