2010-03-04 7 views
3

J'ai une base de données avec plus de 10 000 000 lignes. L'interroger en ce moment peut prendre quelques secondes juste pour trouver des informations de base. Ce n'est pas préférable, je sais que la meilleure façon d'optimiser est de minimiser le nombre de lignes possible, mais pour le moment je n'ai pas le temps de le faire.PHP et MySQL: optimiser la base de données

Quelle est la meilleure façon d'optimiser une base de données MySQL de telle sorte que lors de l'interrogation il, le temps est court?

Je ne me dérange pas de la taille de la base de données, qui ne compte pas vraiment si des optimisations qui augmentent la taille sont très bien. Je ne suis pas très bon avec l'optimisation, en ce moment j'ai des index mis en place, mais je ne suis pas sûr combien je peux obtenir de mieux à partir de là.

Je vais finalement rogner sur la base de données correctement, mais est-il une solution rapide et temporaire?

+0

Peut-être que le problème est la requête ... Peut-être que c'est le matériel du serveur qui ne suffit pas, je pense que nous avons besoin de plus d'informations . –

+0

Existe-t-il un moyen d'améliorer les requêtes de sélection simples? Les requêtes sont littéralement "SELECT * FROM table WHERE colonne =" quelque chose "". Du point de vue matériel, peut-être, mais le serveur ne fonctionne pas à sa capacité maximale, donc je ne sais pas si c'est le cas, bien que le matériel soit bien meilleur :-D – sam

+0

Utilisez EXPLAIN sur vos requêtes pour savoir comment elles sont exécutées par votre base de données serveur. Avec cette information, vous pouvez créer les index dont vous avez besoin. 10M disques n'est pas beaucoup, ne devrait pas donner un sérieux problème. –

Répondre

2

Outre l'indexation qui a déjà été suggéré, vous pouvez regarder aussi dans les tables de partitionnement si elles sont grandes.

Partitioning in MySQL

Il est difficile d'être précis ici, parce que nous avons des informations très limitées, mais l'indexation correcte avec partitionnement peut aller un long chemin. Indexer correctement peut être un sujet long, mais dans un sens très général, vous voudrez indexer les colonnes que vous interrogez.

Par exemple, supposons que vous avez une table d'employés, et vous avez vos colonnes habituelles de SSN, FNAME, LNAME. En plus de ces colonnes, nous dirons que vous avez également 10 colonnes supplémentaires dans le tableau.

Maintenant vous avez cette requête:

SELECT FNAME, LNAME FROM EMPLOYEES WHERE SSN = 'blah'; 

Ignorant le fait que le SSN pourrait probablement être la clé primaire ici et peut-être déjà un index unique sur elle, vous probablement voir un avantage de performance en créant un autre index composite contenant les colonnes (SSN, FNAME, LNAME). La raison en est que la base de données peut satisfaire cette requête en regardant simplement l'index composite car il contient toutes les valeurs nécessaires dans un espace trié et compact. (c'est-à-dire moins d'E/S). Même si l'index sur SSN est seulement une meilleure méthode d'accès pour faire un balayage de table complet, la base de données doit toujours lire les blocs de données pour l'index (E/S), trouver les valeurs qui contiendront des pointeurs vers les enregistrements nécessaire pour satisfaire la requête, il faudra alors lire différents blocs de données (lire: plus d'E/S aléatoires) afin de récupérer les valeurs réelles pour fname et lname.

Ceci est évidemment très simplifié, mais l'utilisation d'index de cette manière peut réduire considérablement les E/S et augmenter les performances de votre base de données.

D'autres liens peuvent vous être utiles:

1

Utilisez les index sur les colonnes que vous recherchez très souvent.

+0

Déjà en train de le faire! Existe-t-il une façon spécifique de le faire qui soit "meilleure"? En ce moment, j'ai les colonnes les plus recherchées (par exemple: WHERE x = y, où x est la colonne que j'ai indexée). – sam

0

Vos requêtes utilisent-elles vos index? Qu'est-ce que l'exécution d'EXPLAIN sur vos requêtes select vous dit?

La première (et la plus simple) étape fera que vos requêtes sont optimisées.

+0

Je viens de lancer "ANALYZE TABLE" pour trouver plus d'informations, mais expliquer sur une requête de base donne: http://pastebin.com/MfNEiqBy – sam

1

Dans votre exemple, « OÙ x = y ', si y est le nom de la colonne, créez un index avec y aussi.

La clé avec indice est le # de résultat de votre requête de sélection devrait être d'environ 3% ~ 5% comparant la table entière et il sera plus rapide.

Aussi la table d'archivage aide. Je ne sais pas comment faire cela, surtout la tâche DBA. Pour DBA c'est une tâche simple s'ils l'ont fait.

2

Comme je peux vous voir demander 40k lignes de la base de données, cette charge de données a besoin de temps pour être transféré.

De même, ne demandez jamais "comment améliorer en général". Il n'y a aucun moyen d'optimisation "générale". L'optimisation est toujours le résultat du profilage et de la recherche de votre cas particulier.

1

Si vous effectuez des commandes ou des requêtes complexes, vous devrez peut-être utiliser des index multi-colonnes. Par exemple, si vous cherchez où x.name = 'y' OU x.phone = 'z' il pourrait être utile de mettre un index sur le nom, téléphone. Exemple simplifié, mais si vous avez besoin de faire cela, vous aurez besoin de rechercher plus loin de toute façon :)

Questions connexes