Эффективный MySQL SELECT для текста в столбцах в InnoDB - PullRequest
1 голос
/ 29 сентября 2011

У меня есть большая большая таблица (InnoDB), которая по существу имеет название местоположения с широтой и долготой местоположения.мой запрос выглядит примерно так:

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

единственным индексом является первичный индекс для автоинкрементного столбца.

Я бы предпочел использовать InnoDB, поэтому FULLTEXT не является опцией

Один из вариантов, который я попробовал, - это добавление индексов к широте и долготе и выполнение

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

, тогда я делаю

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

Но это не очень масштабируемо, потому что результат $ может иметь тысячизаписей и занимает слишком много памяти

На данный момент я прибег к полному сканированию таблицы (первый запрос выше), но для каждого запроса требуется 0,5-1 секунда, поэтому любая помощь будет оценена.

Спасибо

1 Ответ

0 голосов
/ 29 сентября 2011

Стандартный индекс B-TREE плохо подходит для такого рода запросов. Я бы порекомендовал изменить ваш дизайн, чтобы использовать тип географии, а затем создать индекс SPATIAL . Затем вы можете использовать этот индекс с MBRContains, чтобы быстро найти все точки, лежащие в пределах вашей ограничительной рамки.

Обновление: создание пространственного индекса требует MyISAM, как указано в комментариях.

...