2015-04-22 2 views
3

У меня есть 3 столбца данных, которые я ищу: описание (полный текст), lat (index) и lon (index).MySQL полный текстовый индекс и регулярный поиск индекса

Когда я делаю SELECT id FROM table MATCH(description) AGAINST ('query' IN BOOLEAN MODE), все происходит быстро и отлично работает.

Когда я делаю SELECT id FROM table WHERE lat BETWEEN a and b AND lon BETWEEN x and y, все происходит быстро и отлично работает.

Когда я объединять два предложения, а также простые И и делать SELECT id FROM table MATCH(description) AGAINST ('query' IN BOOLEAN MODE) AND (lat BETWEEN a and b AND lon BETWEEN x and y), все работает нормально, но для обработки требуется несколько секунд.

Первые два запроса будут занимать 0,1 секунды, а последний займет 3+ секунды, и я не могу понять, как заставить его работать быстрее. Описание представляет собой полнотекстовые индексы, а столбцы lat/lon являются нормальными индексами.

Любые идеи о том, что замедляет работу и/или как ее исправить? Стол - InnoDB.

+0

Это любопытно. Пожалуйста, предоставьте 'EXPLAIN SELECT ...' для медленного запроса. –

+1

, но он будет использовать только один из двух индексов для запроса. –

+0

select_type = SIMPLE, type = fulltext, possible_keys = , key = search_fulltext, extra = Использование где; Использование filesort – user2247281

ответ

1

Причина замедления ... Обратите внимание, как каждый из первых двух SELECTs возвращает id. Это дешево, потому что идентификатор включен в любой вторичный индекс.

Но когда у вас есть две части к WHERE, один индексу (FULLTEXT) используются для получения идентификатора, то он смотрит на строку, чтобы получить значение (lat, lng) необходимо для другой части WHERE. Это связано с другим поиском другого BTree. Если все необходимое в ОЗУ, это не так уж плохо. Но если вам нужно нажать диск ...

Давайте проверим одно возможное решение ... Сколько у вас RAM? Каково значение innodb_buffer_pool_size? Обычно эта настройка составляет 70% от доступной ОЗУ (при условии, что у вас более 4 ГБ). Поднятие этого значения может уменьшить ввод/вывод, необходимый для выполнения сложного запроса, тем самым ускоряя его.

Если это не работает, у меня есть a technique, который эффективно работает с поиском lat/lng. Я еще не пробовал его вместе с FULLTEXT, поэтому у него могут быть неожиданные причуды. Однако он работает очень эффективно для поиска lat/lng (лучше, чем вы можете получить только с обычным INDEX).

+0

Это экземпляр RDS Amazon с 7.5 ГБ ОЗУ, а вся база данных достаточно мала, чтобы храниться в памяти - всего 1 или 2 чтения с диска в час. Значение innodb_buffer_pool_size равно 5.7 gb. Поиск латинского алфавита заключается в сужении результатов расчета уравнения Хаверина для расстояния, поэтому вместо вычисления уравнения уклонения для строк 500 тыс. Он будет делать только 100 или около того, которые находятся в нашем окне lat/lon. Окно lat/lon является квадратным, тогда как наши конечные результаты представляют собой круг (радиус поиска). – user2247281

Смежные вопросы