2009-10-05 6 views
0

J'utilise la base de données Geonames pour un site de réservation d'hôtel. La base de données a deux tables, une pour les pays, et une pour les villes de plus de 3 mil. Entrées Si j'essaie d'obtenir toutes les villes pour un pays spécifique, la requête est trop lente. Je pense que c'est parce que je n'ai aucun index défini.Recherche dans une base de données de plus de 3 mil. entrées

Le tableau des pays a les champs suivants:

  • iso_alpha2 (code de pays)
  • nom
  • continent
  • population

Le tableau des villes a les champs suivants:

  • Nom
  • asciiname
  • alternate_names
  • pays

Le champ "pays" de la table des villes concerne le champ "iso_alpha2" dans la table des pays.

Comment puis-je accélérer la requête?

P.S. J'utilise MySQL.

+4

"Je pense que c'est parce que je n'ai aucun index défini." - Je pense que tu as déjà répondu à ta question ... – f3lix

Répondre

1

Vous devez ajouter un index sur le champ que vous utilisez dans la clause WHERE (dans votre cas, il semble être le champ pays).

Modifier: encore une chose - si vous avez plusieurs conditions dans la clause WHERE vous devez ajouter un index qui contient tous les champs utilisés dans cette clause (avoir des index séparés sur les champs ne fonctionnera pas). Cependant dans votre cas, je crois que l'index sur le champ pays devrait faire.

1

Pour cette requête, vous aviez seulement besoin de la table villes:

select name from cities where country = 'US' 

Cette requête bénéficierait d'un indice sur le pays.

+1

Alors ALTER TABLE 'cities' ADD INDEX (country (2)); devrait faire l'affaire? – Psyche

+0

Eh bien, je ne préciserais pas la longueur explicitement, cela pourrait créer des effets secondaires. Donc "alter table cities add index (pays)"; – Andomar

Questions connexes