| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Составление SQL-запросов > Оптимизация поиска по IP |
| Автор: Nigel 19.11.2008, 15:34 | ||||||||||||
| БД MYSQL5. Делаю GeoIp таргетинг на сайте. Решил попробовать руцентровскую базу. В итоге, поиск веду по следующей таблице
Записей в базе порядка 100к. Запрос вида
выполняется СЛИШКОМ ДОЛГО для меня 0.4 сек. В explain'е следующее
Убираю индекс
Запрос занял 0.0179 сек Но в explain'е
Т.е. идет фулскан, который не есть гуд. Вопрос, что можно сделать, чтобы уменьшить время выборки. З.Ы. для сравнения пробовал maxmind'овскую базу, где поиск идет в файле. Время поиска при этом там 0.05 сек. Но она не точна для России. З.З.Ы. Просьба модераторам, сделать зеркало в разделе php/базы данных mysql. А есть раздел, посвященный оптимизации? (я что-то такой не видел на форуме) |
| Автор: Akina 19.11.2008, 16:02 | ||||
Во-первых,
прекрасно трансформируется в
Во-вторых, сделайте не один составной индекс, ибо его эффективно использовать невозможно, а два независимых индекса по каждому из полей. |
| Автор: Nigel 19.11.2008, 16:32 | ||||
Akina, я это еще в самом начале пробовал.
В explain'е
Т.е. получается 2-ой вариант, смотрите пост выше. Да, время 0.01 - устраивает, но идет фулскан. |
| Автор: Akina 19.11.2008, 17:30 | ||
|
| Автор: Nigel 19.11.2008, 18:09 | ||
Нет, в этом случае первый вариант, который в зависимости от айпи от 0.2 до 0.4 сек идет, что не подходит.
|
| Автор: Akina 20.11.2008, 10:01 |
| А если создать и использовать только один индекс? скажем ip_1? Добавлено через 16 секунд впрочем, получится то же, что и с составным... Добавлено через 55 секунд Кстати... а если не форсить индексы - что выбирает парсер? любопытства ради я бы посмотрел... |
| Автор: Nigel 20.11.2008, 11:21 | ||
| Akina, в случае составного индекса, если не форсить, он оптимизатор то включает, то выключает, смотря, что ищешь (кстати, именно поэтому я начал форсе делать, так как индекс то добавил, а оптимизатор его игнорировал, умный он, однако)). Если делать 2, то он один из них использует, всегда почти второй. Интересную вещь нашел.. В результате поиска он всегда выдает 2 айпи адреса, один со статусом ALLOCATED PA, другой - ASSIGNED PA. Т.е. провайдеру выдается сетка айпи адресов, он часть из них раздает местным компаниям. Так вот дописал в запросе LIMIT 2 и... Запрос занял 0.0005 сек, смотрю explain
Получилось)) Вообщем, для этой задачи как я понял лучше использовать 2 индекса, чтобы оптимизатор выбирал подходящий при поиске и юзать лимит. Кстати, почему так с лимитом получается, может кто-нибудь объяснит? Ведь что с ним, что без него - находится по 2 записи, а скорость поиска - небо и земля. зы. Кажется, понял, когда он находит требуемые записи ( а их 2), то он дальше не сканит таблицу, а если лимит не указываешь, то ему приходится проверять, а может еще что в поиск попадет... ззы. темку еще открытой оставлю на пару деньков, может еще что предложат... Akina, ты не против |