2012-06-09 2 views
1

У меня три таблицы в целом, одна с именами игроков и их последний логин, а другая таблица с именем игрока и их IP. Это с игрового сервера, но это два отдельных «плагина» сервера, поэтому я не могу объединить их в одну таблицу.Самый быстрый способ присоединиться к таблице IP2C?

Я успешно объединить эти два на playername колонке так:

SELECT 
u.`user` as `ign`, 
lb.`lastlogin` as `date`, 
lb.`ip` 
FROM `mcmmo_users` u 
LEFT JOIN `lb-players` lb 
    ON u.`user`=lb.`playername` 

Они производят следующий массив: Array(ign,date,ip);

Однако, у меня есть IP2C (IP-Country) таблицу, а также и Я хотел бы получить эти результаты одновременно. Однако эта таблица чрезвычайно велика и сильно замедлит запрос, если я сделал стандартную LEFT JOIN.

Есть ли более быстрый способ присоединиться к этому? Я бы предпочел не запрашивать каждый цикл PHP данных.

Я использую MySQL и PHP

База данных IP2C будет заложен следующим образом:

begin_ip | end_ip | begin_ip_num | end_ip_num | country_code | country_name 

И запрашиваются следующим образом:

$IPNUM = sprintf("%u",ip2long($ip)); 

SELECT `country_code` 
    FROM `cpanel_ip2c` 
WHERE `$IPNUM` BETWEEN `begin_ip_num` AND `end_ip_num` 

ответ

2

between состояние трудно оптимизировать для базы данных. Вместо этого рассмотрит запрос для первого блока IP, который больше или равен IP пользователя:

select * 
from mcmmo_users u 
left join 
     `lb-players` lb 
on  u.user = lb.playername 
left join 
     cpanel_ip2c ip 
on  ip.begin_ip_num = 
     (
     select begin_ip_num 
     from cpanel_ip2c ip 
     where ip.begin_ip_num <= inet_aton(lb.ip) 
     order by 
       ip.begin_ip_num desc 
     limit 1 
     ) 
     and inet_aton(lb.ip) <= ip.end_ip_num 

С индексом на cpanel_ip2c(begin_ip_num), страна может быть решена с помощью поиска по индексу.

Категория: example on SQL Fiddle, таблица mcmmo_users для удобства.

+0

Таблица хранит их как строки, так и целые числа. Целое число относится к php-функции ip2long(), которая преобразует строку в длинное целое число. Однако я не могу найти замену этой функции в MySQL, поэтому я не уверен, как сравнить строку IP (из таблицы) с базой данных IP2C. –

+0

Возможно, добавьте длинную версию в таблицу 'lb-players'? – Andomar

+0

Как мне это сделать? Таблица lb-players и таблица mcmmo_users генерируются через апплет java-сервера, я могу попытаться отредактировать источник этих плагинов, чтобы добавить длинную версию, но я не уверен, как работает ip2long в Java. –