2009-10-13 9 views
0

Je travaille sur un CMS de base/mysql et j'ai quelques questions concernant les performances. Lorsque vous affichez une page de blog (ou d'autres données pouvant être triées) depuis le frontal, je souhaite autoriser l'ajout d'une simple variable de tri à la chaîne de requête, ce qui permet de trier les publications selon n'importe quelle colonne. Évidemment, je ne peux pas accepter quoi que ce soit à partir de la chaîne de requête, et j'ai besoin de m'assurer que la colonne existe sur la table.mysql show table/columns - question de performance

En ce moment je suis en utilisant

SHOW TABLES; 

pour obtenir une liste de toutes les tables de la base de données, en boucle alors le tableau des noms de table et d'effectuer

SHOW COLUMNS; 

sur chacun. Mon inquiétude est que mon CMS pourrait prendre un coup de performance ici. J'ai pensé à utiliser un tableau statique des noms de tables, mais j'ai besoin de le garder flexible car j'implémente un système de plugin.

Quelqu'un at-il des suggestions sur la façon dont je peux garder cela plus concis?

Thankyou

Répondre

3

Si vous utilisez mysql 5+ alors vous trouverez la base de données information_schema utile pour votre tâche. Dans cette base de données, vous pouvez accéder aux informations des tables, colonnes, références par des requêtes SQL simples. Par exemple, vous pouvez trouver s'il y a colonne spécifique à la table:

SELECT count(*) from COLUMNS 
WHERE 
    TABLE_SCHEMA='your_database_name' AND 
    TABLE_NAME='your_table' AND 
    COLUMN_NAME='your_column'; 

Voici la liste des tables avec colonne spécifique existe:

SELECT TABLE_SCHEMA, TABLE_NAME from COLUMNS WHERE COLUMN_NAME='your_column'; 
+0

Intéressant, cela fonctionnera-t-il pour un utilisateur mysql avec des permissions limitées, ou devrai-je accorder l'accès à 'information_schema'? – Rowan

+0

Je pense qu'il peut être configuré. De toute façon c'est un accès en lecture seule. –

+0

était juste en train de vérifier mes anciennes questions et j'ai réalisé que j'avais oublié de marquer une réponse! Merci – Rowan

0

Vous pouvez interroger la table avant et stocker les colonnes dans une couche de cache (à savoir memcache ou APC). Vous pouvez alors définir l'heure d'expiration sur le fichier à l'infini et seulement supprimer et recréer le fichier de cache quand un plugin a été nouvellement ajouté, mis à jour, etc

+0

C'est une bonne idée, mais peut-être pas possible: je suis va devoir installer le système sur les serveurs clients et ne pourra peut-être pas utiliser memcached ou APC. Je pourrais prendre votre idée et essayer de mettre en place un système de mise en cache simple. – Rowan

0

Je suppose que le meilleur pari est de mettre tous ces trucs obtenir à partir de tables de présentation etc dans un fichier déjà et juste l'inclure, au lieu de courir à chaque fois. Ou mettez en place une sorte de cache si le projet est encore en développement et vous pensez que les champs vont changer.

1

Étant donné que vous êtes en train de cliquer deux fois sur la base de données avant d'exécuter votre requête, vous pouvez envisager d'envelopper simplement la requête réelle dans un bloc try{}. Ensuite, si la requête fonctionne, vous n'avez effectué qu'une seule opération au lieu de 3. Et si la requête échoue, vous n'avez gaspillé qu'une seule requête au lieu de potentiellement deux.

La mise en garde importante (comme d'habitude!) Est que toute entrée de l'utilisateur soit nettoyée avant de faire cela.