2010-05-31 5 views
2

j'ai autour de (1.049.906 au total, la requête a 0,0005 s) dans ma table de x,mysql optimisation des requêtes

Si je récupère simplement essayer de retrive le domaine particulier des dossiers,

Son Touque à peine 6 minutes,

C'est ma requête

SELECT CUSTOMER_CODE FROM X_TBL ; 

CUSTOMER_CODE => UNIQUE

CI-DESSUS QUERY PRIS 6min,

Tel me conseils d'optimisation pour cela,

également dans une situation de recherche client, je l'ai utilisé le CUSTOMER_CODE dans comme,

select CUSTOMER_CODE de X_TBL OÙ CUSTOMER_CODE LIKE « $ KEY_WORD% "

oui j'ai index.

Comment vérifier le calendrier d'exécution de script ... en php,

j'ai utilisé ci-dessous extrait mais montrant toujours vers de plus en plus ..

list ($msec, $sec) = explode(' ', microtime()); 
$microtime = (float)$msec + (float)$sec; 

Cordialement Bharanikumar

+0

Vérifiez si vous avez des index sur ces champs. – hgulyan

+0

Quelle fonction/méthode utilisez-vous pour exécuter les requêtes? (mysql_query, pdo-> query, ...?) Pouvez-vous ajouter la sortie de 'SHOW CREATE TABLE X_TBL' à votre question? – VolkerK

+0

Pourquoi avez-vous besoin de 1 million de codes clients? Quelle est la longueur du code client? Peut être, il peut être raccourci? J'espère que vous n'utilisez pas VARCHAR (255) pour cela? –

Répondre

2

Si je comprends bien, vous avez plus d'un million d'enregistrements d'une table et je me demandais pourquoi il faut 6 minutes pour obtenir CUSTOMER_CODE de tous d'entre eux à une fois que? Il n'y a rien à « optimiser », très probablement vous avez besoin de construire différentes requêtes quelque chose comme

SELECT CUSTOMER_CODE FROM X_TBL LIMIT 0, 100; 

ou

SELECT COUNT(CUSTOMER_CODE) FROM X_TBL; 

ou autre, en fonction de la tâche que vous essayez de résoudre.

À partir de la recherche par CUSTOMER_CODE, en cas de LIKE "$KEY_WORD%" index simple sur CUSTOMER_CODE aidera, mais encore une fois, ne pas essayer de sélectionner tous enregistrements à la fois, à l'exception des cas où vous avez vraiment besoin de cela.

0

Peut-être que le transfert de données réel est le goulot d'étranglement. On évite généralement de transférer toutes les données dans une base de données relationnelle à un autre endroit (processus).

Mais, pour des arguments et des tests si cela est vraiment le goulot d'étranglement: Vous pouvez essayer une requête unbuffered, à savoir utiliser une fonction/méthode qui ne transfère pas toutes les données avant de revenir, voir PDO::MYSQL_ATTR_USE_BUFFERED_QUERY et mysql_unbuffered_query.
Et pendant que nous y sommes, vous pouvez également essayer MySQL's EXPLAIN et voir si cela apporte un peu de lumière sur le problème.

$pdo = new PDO("mysql:host=localhost;dbname=test", 'localonly', 'localonly'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$KEY_WORD = 'something%'; 

foreach($pdo->query("EXPLAIN SELECT CUSTOMER_CODE FROM X_TBL WHERE CUSTOMER_CODE LIKE '$KEY_WORD'", PDO::FETCH_ASSOC) as $row) { 
    foreach($row as $k=>$v) { 
    echo "$k=$v | "; 
    } 
    echo "<br />\n"; 
} 


$start = microtime(true); 
// test #1 
if (true) { // set this to false after the first test 
    $stmt = $pdo->prepare('SELECT CUSTOMER_CODE FROM X_TBL', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)); 
    $stmt->execute(); 
} 
// test #2 
else { 
    $stmt = $pdo->prepare('SELECT CUSTOMER_CODE FROM X_TBL WHERE CUSTOMER_CODE LIKE :search', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)); 
    $stmt->execute(array(':search'=>$KEY_WORD)); 
} 
$end = microtime(true); 

echo 'time: ', $end-$start; 
0

si vous avez tant d'enregistrements de la table, alors la première chose est de changer le moteur de table InnoDB si elle n'InnoDB, parce que pour un grand nombre d'enregistrements InnoDB est beaucoup plus rapide car il met en cache les données de table alors qu'au contraire, le moteur myisam ne met en cache que les index, donc chaque fois qu'il doit effectuer une analyse de table complète à partir du disque si les données requises ne peuvent pas être extraites de l'index. Deuxièmement, si vous voulez rester avec myisam, créez un index sur la colonne CUSTOMER_CODE. Cela rendrait la requête rapide car tout ce que mysql doit faire est de récupérer l'index de la requête:

SELECT CUSTOMER_CODE FROM X_TBL