2010-05-02 9 views
2

J'ai 2 tables:Benchmark fonction dans Mysql (résultats Incroyable)

auteur avec 3 millions de lignes.

livre avec des lignes de 20 miles.

.

J'ai donc benchmarkée cette requête avec une jointure:

SELECT BENCHMARK(100000000, 'SELECT book.title, author.name 
FROM `book` , `author` WHERE book.id = author.book_id ') 

Et voici le résultat:

requête a pris 0.7438 sec

SEULEMENT 0.7438 secondes pour 100 millions de requête avec une jointure ???

Est-ce que je fais des erreurs ou est-ce le bon résultat?

Répondre

3

Votre résultat ne va pas, je viens de vérifier la documentation et d'exécuter mes propres tests. Vous ne comparez rien en fait. BENCHMARK() est pour tester les expressions scalaires, ce n'est pas pour tester les temps d'exécution des requêtes. La requête n'est pas en cours d'exécution. Dans mes propres tests de requêtes, la durée prise n'était pas du tout liée à la complexité de la requête, mais seulement à la quantité d'essais à exécuter.

Jetez un oeil à http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_benchmark

Quelques citations de la doc:

"BENCHMARK() est destiné à mesurer les performances d'exécution d'expressions scalaires,"

« Seulement expressions scalaires peut être Bien que l'expression puisse être une sous-requête, elle doit renvoyer une seule colonne et au plus une seule ligne (par exemple, BENCHMARK (10, (SELECT * FROM t)) échouera si la table t a plus d'une colonne ou plus d'une rangée. "

En réalité, vous ne mesurez rien, en dehors du temps le plus absolu des planificateurs de requêtes.

Si vous voulez exécuter des tests de performances, cela vaut probablement la peine de le faire à partir du code de l'application (et possible avec une directive sans cache en fonction de l'impact de votre environnement prod.). Je l'ai fait à partir du code de l'application sera également le temps d'hydrater les données, plus le coût d'envoi des données à travers le fil, etc.

+0

J'ai exécuté cette requête: SELECT BENCHMARK (100000000, 'SELECT book.title, author.name DE 'book',' author' O WH (book.id = author.book_id) ET (book.title = 'Bible') ') et j'ai le même résultat – xRobot

+3

Je vous promets que vous êtes exécuter/benchmarking rien. Exécutez d'abord: "SET SESSION query_cache_type = OFF;", puis exécutez "select sleep (10) from book limit 1", cela prendra 10 secondes. Ensuite, exécutez "select benchmark" (sélectionnez "sleep (10) from book limit 1"); ", cela retournera instantanément (ou du moins sur mon MySQL.) Jetez un oeil à travers les docs, BENCHMARK() n'était pas du tout conçu pour ça. – Michael