Рейтинг:0

Почему мой простой поисковый запрос работает слишком медленно?

флаг ru

Я не знаю, почему поиск в моей таблице «города» такой медленный. Мой запрос ищет таблицу «города», расположенную примерно в 25 км от города. Я использую этот простой запрос, и базе данных требуется почти 20 секунд, чтобы вернуть результаты.

ВЫБЕРИТЕ city_destination,расстояние ОТ городов, ГДЕ city_start='Wien' И расстояние <= 25 ORDER BY расстояний ASC

Табличный движок - InnoDB. В таблице ок. 7 миллионов строк:

+--------------------+-------------+------+-----+- ----------------------+--+
| Поле | Тип | Нуль | Ключ | По умолчанию | Экстра |
+--------------------+-------------+------+-----+- ----------------------+--+
| идентификатор | интервал(11) | НЕТ | ПРИ | НУЛЕВОЙ | авто_инкремент |
| id_of_start | интервал(11) | НЕТ | | НУЛЕВОЙ | |
| id_of_destination | интервал(11) | НЕТ | | НУЛЕВОЙ | |
| город_старт | текст | НЕТ | | НУЛЕВОЙ | |
| город_назначение | текст | НЕТ | | НУЛЕВОЙ | |
| расстояние | двойной | НЕТ | | НУЛЕВОЙ | |
+--------------------+-------------+------+-----+- ----------------------+--+

Может ли кто-нибудь посоветовать мне, как оптимизировать базу данных или запрос?

Рейтинг:0
флаг st

Для этого запроса вы должны использовать индекс для city_start + расстояние

СОЗДАТЬ ИНДЕКС idx_citie_start_distance ON городов (city_start, расстояние);

Вы также можете создать два индекса: city_start и другой для расстояния. Это тоже должно работать нормально.

Sahasrar avatar
флаг ru
Это работает, спасибо. Я также получил совет изменить механизм хранения на MyISAM, и время запроса такое же, как у InnoDB с индексом .... Это тоже так? или это не лучший способ сделать БД для этого решения?
флаг st
@Sahasrar, InnoDB позволяет вам использовать CONSTRAINTS и обрабатывает ROW LOCK, что означает, что InnoDB - лучший выбор, если ваша таблица обрабатывает больший объем или UPDATE и / или DELETE. MyISAM допускает одновременные операции INSERT и SELECT, что может быть лучшим выбором, если ваша таблица обрабатывает массовые загрузки INSERT и очень мало операций UPDATE или DELETE.
Sahasrar avatar
флаг ru
Эта таблица предназначена для поиска ближайших городов. Таким образом, 99% запросов будут о чтении. Из вашего комментария я думаю, что для моей таблицы лучше использовать MyISAM, я ошибаюсь?
флаг st
@Sahasrar, это имеет смысл. Я бы выбрал MyISAM в этом случае

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.