2010-10-03 5 views
0

Avec les données étant mis en cache si souvent maintenant et la base de données est seulement accessible quand il y a de nouvelles données (et puis ces données sont mises en cache lol) y a-t-il une différence de performance réelle? clés primaires. Par exemple, supposons que nous construisons NetFlix. Un nouveau film est ajouté à la base de données, et la liste des films ainsi que les données associées sont mises dans un cache.Touches primaires UUID et Memcached

La recherche de l'utilisateur pour un film (un serveur de recherche gère cela), puis trouve une liste, clique dessus et les données sont extraites du cache.

Dans tout ce processus, la base de données n'est jamais lue.

Que pensez-vous?

Répondre

1

Je suis l'architecte un site majeur similaire à Netflix et vous êtes pour la plupart correct, presque toutes les données non-transactionnelles sont mises en cache donc l'optimisation des bases de données ad nauseum ne paie pas toujours. Tous nos titres de films sont pré-chargés dans memcached par une tâche récurrente, donc pour la partie bibliothèque du système, la base de données n'est jamais touchée par un client réel.

Néanmoins, nous ne sommes pas en reste lors de la conception de la structure de base de données et des requêtes car nous voulons que le préchargement s'exécute aussi rapidement et efficacement que possible.

+0

Hey Chris, est-il possible que je peux vous contacter. Je suis intéressé par votre service de streaming de films. –

0

Je préfère utiliser UUID (GuidComb s actuellement) pour les clés primaires. Certes, cela gonfle les indices mais avec des SGBDR 64bits partout et la mémoire étant assez bon marché, je considère que les avantages l'emportent largement sur les inconvénients. Ne pas avoir à attendre que vous insériez pour savoir ce que sera votre PK est mon préféré.

0

Je supporte la réponse de Chris, mais je tiens également à souligner que si vous essayez de charger beaucoup de clés en mémoire à la fois, alors vous utiliserez beaucoup de RAM.

Comparer:

6ba7b810-9dad-11d1-80b4-00c04fd430c8 - 37 octets, soit 38 si \ 0 terminaison

Lorsque, à un nombre entier de 64 bits est seulement 8 octets. Et peut éventuellement être stocké dans un seul registre.

Pour passer au niveau suivant. Supposons que vous souhaitiez charger 100 000 ID dans le RAM.

Cela va être 800 000 octets (64 bits ints), ou 3 800 000 octets!

Mise à jour: 8 octobre 2010.

En outre, la validation d'une chaîne UUID est un peu plus difficile, vous devez utiliser une expression régulière. Cependant, la validation d'un nombre entier est simple. intval() php, ou .to_i ruby, et int() pour perl.

Cela améliore la sécurité par rapport à d'autres personnes envoyant vous soupçonnez données (robots web)