2010-11-25 1 views
0

Dans un tb avec 1 mil. lignes si je fais (après je redémarre l'ordinateur - donc rien il est mis en mémoire cache):
1. SELECT price,city,state FROM tb1 WHERE zipId=13458;
le résultat est 23rows à 0.270sQuel est le plus rapide, key_cache ou cache du système d'exploitation?

après que je lance « INDEX DE LA CHARGE EN CACHE TB1 » (key_buffer_size = 128M et indice total taille pour tb est 82M): 2. SELECT price,city,state FROM tb1 WHERE zipId=24781;
le résultat est 23rows dans 0.252s, Key_reads reste constante, Key_read_requests est incrémenté avec 23

BUT après je charge 'zipId' dans le cache du système d'exploitation, si je fais tourner de nouveau la requête:
2. SELECT price,city,state FROM tb1 WHERE zipId=20548;
le résultat est 22rows en 0.006s

Ceci est juste un exemple simple, mais je cours des dizaines de tests et de combinaisons. Mais les résultats sont toujours les mêmes.
J'utilise: MySql avec MyISAM, WINDOWS 7 64, et le query_cache est 0; zipId c'est un index régulier (pas la clé primaire)

DEVRAIT PAS key_cache être plus rapide que le cache du système d'exploitation ??
NE DEVRAIT PAS être une énorme différence de vitesse, après avoir chargé l'index dans le cache ??
(dans mon test c'est presque pas de différence).

J'ai lu beaucoup de sites Web, de tutoriels et de blogs à ce sujet, mais aucun d'entre eux ne parle vraiment de la différence de vitesse. Donc, toutes les idées ou les liens seront grandement appréciés.
Merci.

+0

Quelle est la conception de la table? Key Cache ne sera pas rapide si l'index utilisé ne couvre pas le sipid, le prix, la ville et l'état. Otherwize la requête lit l'index, puis la table. –

+0

@Thomas Jones-Low L'indice couvre tous les 3 col. J'ai fait quelques tests et ce n'est pas une différence significative si je choisis 1 ou 3 col. OU si les colonnes sélectionnées sont indexées ou non – silversky

+0

@ Thomas Jones-Low Et aussi pourquoi la même requête c'est beaucoup, beaucoup .. plus vite sur le cache du système d'exploitation? (fondamentalement sont les mêmes étapes impliquées) – silversky

Répondre

0

Sous le traitement de requête normal, MySQL analyse l'index pour les valeurs de la clause where (c'est-à-dire zipId = 13458). Utilise ensuite l'index pour rechercher les valeurs correspondantes de la table principale MyISAM (un second accès au disque). Lorsque vous chargez la table en mémoire, les accès au disque sont tous effectués en mémoire, pas en lisant un vrai disque.

La partie lente de la requête est la recherche de l'index dans la table principale. Ainsi, le chargement de l'index en mémoire peut ne pas améliorer la vitesse de la requête.

Une chose à essayer est Explain Select sur vos requêtes pour voir comment l'index est utilisé.

Modifier: Puisque je ne pense pas que les réponses à vos commentaires s'inséreront dans un espace de commentaire. Je vais leur répondre ici. MyISAM n'a pas de cache en lui-même.

Il repose sur le système d'exploitation pour effectuer la mise en cache du disque. La quantité de votre table mise en cache dépend de ce que vous utilisez dans le système et de la quantité de données que vous lisez. Windows en particulier ne permet pas à l'utilisateur de contrôler les données mises en cache et pendant combien de temps.

Le système d'exploitation met en cache les blocs de disque (fragments 4K ou 8K) du fichier d'index ou du fichier de table complet.

SELECT indexed_col FROM tb1 WHERE zipId+0>1 

requêtes comme celle-ci où vous utilisez des fonctions sur le prédicat (clause Where) peut causer MySQL pour faire des analyses complètes de table plutôt que d'utiliser un indice. Comme je l'ai suggéré ci-dessus, utilisez EXPLAIN SELECT pour voir ce que fait MySQL.

Si vous souhaitez plus de contrôle sur le cache, essayez d'utiliser une table INNODB.Le InnoDB engine crée son propre cache que vous pouvez dimensionner, et fait un meilleur travail en conservant les éléments les plus récents.

+0

J'ai fait beaucoup de recherche et de tests, et maintenant la vitesse est inférieure à 0,000s. Mais une chose je ne suis pas encore sûr si j'ai bien compris: sur cette requête: SELECT indexed_col FROM tb1 WHERE zipId + 0> 1' ou même 'SELECT not_indexed_col FROM tb1 OERE zipId + 0> 1' ou' SELECT zipId FROM tb1 IGNORE INDEX (zipId) 'QU'EST-CE QUE CACHÉ? seulement ce col. ou tout le tb? (car peu importe la requête que j'utilise, MAIS après l'avoir utilisée, chaque SELECT agit comme toute la table dans le cache du système d'exploitation) – silversky

+0

Aussi peut-être pourriez-vous me donner un indice: QUELLE EST LA MEILLEURE MANIÈRE DE CHARGER table dans le cache du système d'exploitation? J'ai le sentiment que les méthodes ci-dessus ne sont pas les meilleurs moyens. ET aussi après un moment, il semble que les requêtes sont plus lentes. Mon explication était que certaines des données de tb sont expulsées du cache du système d'exploitation. Ai-je raison? Est-ce normal? Comment puis-je empêcher cela? – silversky

+0

le sistem a 2G de RAM et quand je le vérifie sur le gestionnaire de tâches habituellement il est environ 40-60%, donc je pense que cela devrait être assez de mémoire. – silversky

Questions connexes