2012-04-07 6 views
1

Je travaille sur une classe de base de données basée sur pdo, la base de données utilisée est une base de données mysql, mais je veux mettre en cache la base de données pour obtenir plus de performance. Serait-ce une bonne idée de mettre en cache la base de données dans une base de données en mémoire SQlite et de faire les SELECT sur ce (et mettre à jour la base de données sur un INSERT, UPDATE, ...) db? Mais, quand j'écris "cache = new PDO ('sqlite: memory');" en crée-t-il un nouveau ou utilise-t-il le db existant? En outre, si un serveur héberge plusieurs sites Web, comment utiliser différentes bases de données en mémoire?PHP: Cache de base de données (avec sqlite in-memory)

+1

vous savez que mysql a un moteur de mémoire, non? –

+1

mais SQlite est local et mysql peut être distant (-> lent) – joschua011

Répondre

2

Chaque base de données SQLite en mémoire est spécifique à la connexion. Même lorsque vous ouvrez deux connexions à : memory: dans le même processus deux bases de données en mémoire distinctes sont créées. La réponse est donc qu'une nouvelle base de données est toujours créée et n'utilise jamais une base de données existante.

Soyez prudent lorsque vous utilisez un nom correct pour créer une base de données en mémoire. Tout autre nom que : mémoire: (comme : memorry: ou mémoire ou /: mémoire:) ne crée pas en mémoire la base de données, mais une base de données de fichiers réguliers. Cela arrive silencieusement.

Le gain de performances que vous obtiendrez avec la mise en cache suggérée est susceptible d'être faible. Si vous choisissez MySQL et que l'ordinateur dispose de suffisamment de mémoire, il est probable que les données soient déjà dans la RAM en raison de la mise en mémoire tampon du disque du système d'exploitation. Donc, l'ajout d'une autre couche de RAM sous la forme d'une base de données en mémoire SQLite n'aidera pas beaucoup.

La mise en cache suggérée conduit facilement à une logique de mise en cache complexe ou incorrecte si le système n'est pas en lecture seule. Si un processus effectue une mise à jour de données, il doit mettre à jour son cache, mettre à jour la base de données MySQL et créer un mécanisme pour indiquer aux autres processus que leurs caches ne sont plus valides et qu'ils doivent lire les données de MySQL. Sinon, vos données deviennent rapidement un gâchis. Et pensez-vous que se passe-t-il lorsque deux processus décident de mettre à jour les mêmes données en même temps mais à des valeurs différentes? Vous avez un conflit.

Pour obtenir plus de performance, je voudrais d'abord régler le serveur et MySQL. Si ce n'est pas assez, je voudrais ajouter un cache comme Memcached qui n'est pas spécifique au processus d'application mais un processus séparé. Même dans ce cas, vous devez veiller à créer la logique de l'application de manière à ce que les données restent cohérentes lors des mises à jour. Si vous n'utilisez que MySQL et que vous faites des transactions correctes avec InnoDB, MySQL le fait pour vous.