2011-09-17 8 views
0

J'ai un problème avec l'utilisation de mysql. J'ai une table appelée "site" avec 3 champs comme id, nom, rang. Cette table se compose d'environ 1,4m d'enregistrements. quand j'applique requête comme,mysql ordre par requête numéro

select name from site limit 50000,10; 

il renvoie 10 enregistrements en 7.45 secondes [vérifié via le terminal]. Mais quand j'utilise order by dans la requête ci-dessus comme,

select name from site order by id limit 50000,10; 

la requête ne semble jamais être complète. Puisque l'identifiant est défini comme clé primaire, je pensais qu'il n'avait pas besoin d'une autre indexation pour accélérer ma requête. mais je ne sais pas où est l'erreur.

Toute aide grandement appréciée, Merci.

+0

Pouvez-vous poster la sortie de « expliquer sélectionnez le nom de l'ordre du site limite id 50000,10 »? Cela aidera à trouver le problème. – srivani

Répondre

1

Pouvez-vous essayer ceci:

SELECT name 
FROM site 
WHERE id >= (SELECT id 
       FROM site 
       ORDER BY id 
       LIMIT 50000, 1 
      ) 
ORDER BY id 
LIMIT 10 ; 
+0

Flash! c'est tout. Vous avez sauvé ma journée! Merci pour ça. et cette requête renvoie 10 enregistrements après 1,45m d'enregistrements en 9 secondes. subperb. – VKGS

+1

9 secondes est encore un très long temps :) –

+0

bien sûr, mais c'est mieux que ce que j'ai maintenant. A partir de maintenant cette soultion semble être optimale, mais je dois l'obtenir beaucoup plus vite que cela et je travaille dessus. – VKGS

3

C'est « à prévoir » avec de grandes LIMIT valeurs:

De http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/

Méfiez-vous des grandes LIMIT En utilisant l'index pour trier est efficace si vous avez besoin premières lignes, même si certains supplémentaires le filtrage a lieu, vous avez donc besoin de pour analyser plus de lignes par index, puis demandé par LIMIT. Toutefois, si vous êtes traitant LIMIT requête avec une grande efficacité de décalage souffrira. LIMIT 1000,10 est susceptible d'être beaucoup plus lent que LIMIT 0,10. Il est vrai que la plupart des utilisateurs ne vont pas plus loin que 10 page dans les résultats, cependant Search Engine peut très bien le faire. J'ai vu des robots regarder 200+ page dans mes projets. Aussi pour de nombreux sites Web ne prenant pas soin de cela fournit une tâche très facile de lancer une attaque DOS - page de demande avec un grand nombre de quelques connexions et c'est suffisant. Si vous n'avez pas faire autre chose assurez-vous de bloquer les demandes avec des numéros de page trop volumineux. Dans certains cas, par exemple, si les résultats sont statiques, il peut être judicieux de pré-calculer les résultats afin de pouvoir les interroger sur les positions. Ainsi, au lieu de requête avec LIMIT 1000,10 vous where position entre 1000 et 1009 qui a même efficacité pour toute position (tant qu'il est indexé)

ET

One plus note sur ORDER BY ... LIMIT est - il fournit peur d'expliquer déclarations et peut finir par dans le journal des requêtes lentes comme requête qui ne indices d'utilisation

Le dernier point est LE point important dans votre cas - la combinaison de ORDER BY et LIMIT avec une grande table (1.4m) et le "ne pas utiliser d'index" (même s'il y a des index!) Dans ce cas fait des performances vraiment lentes. ..

EDIT - comme par commentaire:

Pour ce cas précis, vous devez utiliser select name from site order by id et gérer la division du resultset en morceaux de 50 000 chacun dans votre code!

+0

Je le fais pour plan du site, où j'ai la liste des URL dans le sitemap, généralement, nous ne sommes pas conseillé d'avoir des fichiers de sitemap de plus de 50 000 URL ou la taille du fichier de 10mb. donc je l'ai commandé comme site1.xml 0,50000 et site2.xml 50,0000,100000. Pour tester cela, j'ai utilisé 50 000,10. mais il ne complète pas la requête. – VKGS

+0

Je comprends cela mais comme je l'ai écrit: la combinaison que vous utilisez désactive l'utilisation des index ... soit utiliser 'ORDER BY' ou' LIMIT' mais pas les deux dans le même cas dans votre cas ... voir mon EDIT ci-dessus ... – Yahia

+0

merci pour vos efforts je donne un essai d'abord et vous faire connaître le résultat. – VKGS