За последние 24 часа нас посетили 17807 программистов и 1688 роботов. Сейчас ищут 990 программистов ...

Долгий запрос в базу при поиске IP (geoip)

Тема в разделе "MySQL", создана пользователем boo, 18 авг 2010.

  1. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    Запрос делается очень долго. в таблице 3,711,701 записей.
    [sql]SELECT `loc_id` FROM `geoip_blocks`
    WHERE '1122334455' BETWEEN `start_ip` and `end_ip` LIMIT 1[/sql]
    локальный сервер: Отображает строки 0 - 0 (1 всего, запрос занял 9.4167 сек.)
    удалённый сервер: Отображает строки 0 - 0 (1 всего, запрос занял 5.5468 сек.)

    структура таблицы:
    [sql]
    CREATE TABLE IF NOT EXISTS `geoip_blocks` (
    `start_ip` int(10) unsigned NOT NULL,
    `end_ip` int(10) unsigned NOT NULL,
    `loc_id` int(10) unsigned NOT NULL,
    PRIMARY KEY (`start_ip`),
    UNIQUE KEY `end_ip` (`end_ip`),
    KEY `loc_id` (`loc_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    [/sql]

    Explain:
    [sql]id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE geoip_blocks range PRIMARY,end_ip PRIMARY 4 NULL 1735515 Using where[/sql]

    при чём надо чтоб на странице выводил таблицу юзеров с городами, а это больше 50 таких запросов
    каким образом можно увеличить скорость?
     
  2. boo

    boo Активный пользователь

    С нами с:
    16 мар 2008
    Сообщения:
    84
    Симпатии:
    0
    ну? кто нибудь?
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ключи? индексы?
     
  4. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Судя по всему диапазоны start_ip` and `end_ip` не должны пересекаться для разных loc_id.
    Тогда можно использовать запрос
    SELECT `loc_id` FROM `geoip_blocks`
    WHERE '1122334455'>=`start_ip` LIMIT 0,1
     
  5. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Сделай индекс содержащий start_ip и end_ip, т.е. многоколоночный. Должно помочь.
     
  6. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    boo
    Ай, аватарку на фото меняем или удаляем!