2009-12-06 5 views
9

Pour un stockage InnoDB est-il préférable de compter le nombre total d'enregistrements parlignes de comptage Optimisation des performances

  • En utilisant mysql_num_rows sur

    select * from tbl where pk = 1 
    

ou par

  • aller chercher le tableau et ret Rieve la valeur "totale" de

    select count(*) as total from tbl where pk = 1 
    

?

Répondre

13

Absolument ce dernier. Il peut saisir la valeur directement à partir de l'index du PK, alors que le premier nécessite presque un scan de table (sauf si chaque colonne fait partie d'un index, et même alors, il doit saisir des valeurs de tous les index). Ensuite, selon la façon dont vous vous connectez à la base de données, il y a une grande quantité de transit de données juste pour obtenir un compte.

explain peut aider ici. Dans ce cas, il vous dira que le select est optimisé.

1

Ce dernier est le plus susceptible de fonctionner mieux puisque vous ne transmettez qu'un seul nombre entier, alors que, dans le premier scénario, vous enverrez beaucoup plus de données.

+1

MySQL ne transmet pas vraiment de données avant d'appeler 'mysql_fetch_array' – Andomar

+0

alors dans ce cas pourquoi pas le premier un meilleur? – Wolfgang

+0

MySQL aura toujours les résultats de la requête en mémoire tampon jusqu'à ce que les données soient complètement récupérées. –

4

En plus de la réponse de Zxpro, il y a aussi l'effort interne MySQL:

select * from tbl where pk = 1 

forces MySQL pour récupérer des lignes correspondant physiquement; tandis que

select count(*) as total from tbl where pk = 1 

permet MySQL de compter les entrées dans la clé primaire, sans récupérer toutes les lignes de table

1

Si « pk » est la clé primaire, il ne peut y avoir un enregistrement, alors la réponse va être 0 ou 1, donc vous n'avez pas vraiment besoin de les compter de toute façon.

Mais oui, ce dernier. InnoDB ne suffit pas de vérifier l'index, il doit également vérifier que la ou les lignes sont visibles à la transaction en cours, à cause de MVCC. Mais ceci est un détail. Il utilisera quand même un index de couverture (ce qui n'est pas important si pk est la clé primaire, car il est toujours groupé)

Questions connexes