2011-09-28 1 views
1

J'ai une grande grande table (InnoDB) qui a essentiellement un nom de lieu avec la latitude et la longitude de l'emplacement. ma requête est quelque chose commeEffecient MySQL SELECT pour le texte dans les colonnes dans InnoDB

SELECT columns FROM table 
WHERE latitude BETWEEN latMin AND latMax 
AND longitude BETWEEN longMin AND longMax 
AND location LIKE '%mcdonalds%' 

le seul index est l'index principal pour la colonne auto-incrémentée.

Je préfère utiliser InnoDB si FULLTEXT est pas une option

Une option que j'ai essayé a été l'ajout d'index à la latitude et la longitude, et faisant

SELECT id FROM table WHERE 
latitude BETWEEN latMin AND latMax 
AND longitude BETWEEN longMin AND longMax 

alors je ne

$stringOfIds = implode(",",$result); 
SELECT columns FROM table WHERE id IN ($stringOfIds) 
AND location LIKE '%mcdonalds%' 

Mais ce n'est pas très évolutif car le résultat $ peut avoir des milliers d'entrées et prend trop de mémoire

Pour l'instant, j'ai eu recours à une analyse de table complète (la première requête ci-dessus), mais cela prend de 0,5 à 1 seconde par requête, donc toute aide serait appréciée.

Merci

+0

afaik, l'index de texte intégral ne nécessite pas de valeurs uniques –

+0

Il n'y a rien sur un index de texte intégral qui nécessite des enregistrements par unique. C'est juste une façon de faire une recherche de texte plus efficace que 'comme'% blahblah% ''pourrait jamais l'être. Un index de texte intégral ne peut pas être unique dans tous les cas. Seul un index normal peut être rendu unique. –

+0

Ah, j'ai compris. Mais je préfère utiliser InnoDB et InnoDb ne supporte pas FULLTEXT, non? –

Répondre

0

L'index standard B-TREE ne convient pas à ce genre de requête. Je vous recommande de modifier votre conception pour utiliser le type de géographie, puis creating a SPATIAL index. Vous pouvez ensuite utiliser cet index avec MBRContains pour trouver rapidement tous les points qui se trouvent dans votre zone de délimitation. Mise à jour: La création d'un index spatial nécessite MyISAM comme indiqué dans les commentaires.

+0

Désolé, je ne vois pas la différence entre votre requête et la mienne en plus de la colonne1, colonne2. En outre, InnoDB ne peut pas utiliser l'index Spatial, non? –

+1

@AndrewPark, agaçant no. Si vous voulez un bon support SIG, vous devrez passer à PostgreSQL. Ou utilisez MyISAM, mais cela n'a que des rectangles de délimitation. – Johan

+0

@ Andrew Park: Désolé n'a pas vu que vous avez déjà essayé. Et oui, vous avez raison d'utiliser MyISAM pour ajouter un index SPATIAL. J'ai oublié cela. Peut-être pouvez-vous stocker les données spatiales dans un tableau séparé afin que votre table principale puisse rester comme InnoDB. Vous pouvez utiliser un ID pour joindre les deux tables. –

Questions connexes