У меня есть две таблицы. Таблица диапазон IPAddress находится в следующем формате:Ошибка производительности на MySql, где значение между двумя столбцами
ip_start BIGINT
ip_end BIGINT
country VARCHAR
(IP-адреса были преобразованы в ряд)
Вторая таблица содержит детали заказа и пользователи IP_ADDRESS также в том же формате чисел.
Я пытаюсь вернуть таблицу заказов вместе со страной ipaddress.
Выполнение следующих работ по объединению, но запрос занимает несколько минут примерно на 5000 строк.
SELECT * FROM orders o
LEFT JOIN iplookup ip
ON o.ip_address >= ip.ip_start AND
o.ip_address <= ip.ip_end
Как я могу улучшить производительность этого запроса?
EXPLAIN
отвечает:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE o ALL NULL NULL NULL NULL 45775 Using where
1 SIMPLE ip ALL ip_start, NULL NULL NULL 140712
ip_end,
star_end_idx
Что объясняет select ... 'для указанного запроса? –
@AbhikChakraborty Это просто говорит мне, что оба являются простыми запросами и количеством строк в таблице. Очевидно, таблица ipaddress достаточно велика. Содержит около 140 тыс. Записей. –
У вас отсутствуют индексы точно, запрос выглядит хорошо. Добавьте следующие индексы после создания резервной копии таблиц 'alter table orders add index ip_address_idx (ip_address); alter table iplookup add index star_end_idx (ip_start, ip_end) ' –