Фильтр поиска по ip2country

Тема в разделе "Базы данных", создана пользователем beonard6, 25 сен 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. beonard6

    beonard6 Постоялец

    Регистр.:
    1 июн 2009
    Сообщения:
    57
    Симпатии:
    3
    Вопрос: Фильтр поиска по ip2country

    есть две базы
    база с пользователями (ип, логин, прочее)
    база с зонами (начальный ип, конечный ип, прочее)
    в базе с зонами есть 4 столбца
    первые 2 с обычными начальными ip и конечными
    вторые 2 с тем же ip в числовом формате (пропуск через ip2long/INET_ATON
    и есть короткий простенький запрос
    который при сканировании 17 результатов (фильтр по первой букве логина) думает 7 секунд
    в остальных случаях думает over несколько минут, что категорически непримемлимо
    сие чудо здесь:
    Код:
    SELECT `user`.`POINTS`, `user`.`NAME`, INET_NTOA(`user`.`IPAddress`) AS `IP`
    FROM `database1`.`user`
    INNER JOIN `database2`.`ip2country` ON `user`.`IPAddress` BETWEEN `ip2country`.`begin_ip_num` AND `ip2country`.`end_ip_num`
    WHERE `user`.`STEAMID` REGEXP '^z' AND `ip2country`.`country_code`='RU'
    ORDER BY `user`.`POINTS`
    LIMIT 0,100
    что я делаю не так?
    explain:
    Код:
    id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra 
    1	SIMPLE	user	index	IPAddress	POINTS	4	NULL	4596	 
    1	SIMPLE	ip2country	ref	begin_ip_num,country_code	country_code	12	const	3202	Using where
     
  2. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    199
    Симпатии:
    55
    Попробуй индекс по полям
    `user`.`STEAMID` +`ip2country`.`country_code`
     
  3. Otis22

    Otis22 Создатель

    Регистр.:
    13 фев 2009
    Сообщения:
    30
    Симпатии:
    9
    `user`.`STEAMID` REGEXP '^z' попбробуй заменить на LEFT(`user`.`STEAMID`,1)='z'. Проверка та же но на большой массе данных эта будет работать гораздо быстрее. Не совсем ясно зачем таблицы раскидывать по разным базам. Это тоже может влиять на скорость. Индексы обязательно на все поля по которым фильтруете если таблицы очень большие тогда попробуйте только поля по которым идёт объединение.
     
Статус темы:
Закрыта.