2011-10-19 2 views
0

J'ai une application Java et je voudrais obtenir des données d'une table et afficher dans l'application.requête mysql lente quand la limite passe aux derniers enregistrements

J'ai des millions d'enregistrements, et la requête devient vraiment lente quand je vais aux derniers enregistrements. il faut quelques bonnes minutes pour obtenir les résultats.

select Id from Table1x where description like '%error%' and Id between 0 and 1329999 limit 0, 1000 

La requête ci-dessus renvoie un résultat rapide. C'est la première page qui revient rapidement. Mais quand je bouge les dernières pages, ça devient lent.

select Id from Table1x where description like '%error%' and Id between 0 and 1329999 limit 644000, 1000. 

Cette requête est lente et prend 17 secondes.

Des idées sur la façon d'accélérer les choses? Id est la clé primaire de table1x.

+0

duplication possible de [Pourquoi le décalage LIMIT supérieur de MYSQL ralentit la requête?] (Http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query- vers le bas) –

Répondre

1

Le problème est dans le même genre. Pour obtenir les 1000 premiers enregistrements, la base de données doit uniquement filtrer la base de données jusqu'à ce qu'elle trouve 1000 enregistrements correspondant à la recherche. Pour l'autre requête, la base de données doit correspondre aux enregistrements jusqu'à ce qu'elle ait 645000 enregistrements, ce qui la rend beaucoup plus lente. Il n'y a pas de tri ou de filtrage, donc l'index sur ID ne sert à rien.

Un index sur description aiderait, mais pas si vous démarrez la recherche avec un caractère générique, comme vous le faites maintenant.

Je vois deux solutions.

La première option consiste à ajouter un index FULLTEXT dans le champ de description. Il permet de rechercher le mot error en utilisant MATCH plutôt que LIKE. Je pense que ce sera beaucoup plus rapide, mais l'indice deviendra plus grand aussi, et je ne suis pas sûr des optimisations à long terme.

Deuxième solution: Puisque vous êtes évidemment à la recherche d'erreurs (je pense que vous construisez un rapport sur une table de journal?), Vous pouvez ajouter une colonne avec un type d'enregistrement. Vous pouvez donner à chaque enregistrement un type (juste un entier) qui indique où cet enregistrement contient une erreur ou non. Vous devrez mettre à jour votre table une fois, et insérer le type avec de nouveaux enregistrements, mais cela rendra votre requête plus rapide.

Je dois admettre que cette deuxième solution est basée sur des hypothèses sur les données et votre objectif. Si je me trompe à ce sujet, s'il vous plaît fournir des informations supplémentaires et je peux trouver une solution qui vous convient mieux.