Поддержу куки. Лишь потому, что быстро и просто реализовать. Не надо модифицировать код проекта, просто кусок джаваскрипта написать. Ну а если пользователь выключил куки у себя — ну, значит не судьба, с тем же успехом он и JS мог бы выключить…
«Но MySQL то об этом не знает и выполняет крайне медленный поиск по двум диапазонам, в надежде их найти. :)»
Видимо, но почему же ей не сделать так:
1) Выбрать все записи, удовлетворяющие «StartNum<=1385960996»
2) Из полученного диапазона отфильтровать по условию «EndNum>=1385960996»
Это, как по мне, логичнее, можно и там и там использовать индекс!
Множество значений в таблице — непересекаемо. Т.е. оба запроса будут давать одинаковый результат (что и видно по тестам).
Простой пример на мелких числах:
1-й запись имеет StartNum = 100 && EndNum = 200
Ищем мы IP 150
Первый (простой) запрос вернет нам эту первую запись, поскольку 150 попало в диапазон. Тут все просто.
Как поведет себя второй (двойной) запрос:
а) Внутренний поздапрос выберет эту же запись (поскольку 100 <= 150)
б) Внешний запрос проверит условие попадания в диаппазон — 150 <= 200
Внешний подзапрос второго запроса нужен для дополнительной проверки. И его логика совпадает с логикой «and EndNum>=1385960996»
«2. Выполняется поиск записи с максимальным StartNum, но не больше 1385960996.
Если у этой найденной записи EndNum<1385960996, то не возвращается ничего.»
Да, но в результате логика и там и там сводится к выборке записей, где 1385960996 попал в диаппазон.
Каждая запись в базе geoip всегда имеет StartNum < EndNum.
Но, по факту, у вас ведь просили поднять карму, что запрещено правилами хабра.
Считаю, что для таких целей должен быть отдельный блог, куда и будут попадать подобные статьи.
Повторюсь =) Видел на хабре подобные вещи, но считаю, что это не хорошо.
Т.е. de jure — этого делать нельзя, de facto делают.
Но вот я сейчас пишу комент и думаю себе, а ведь я пишу статью лишь с надеждой, что она будет кому-то полезна. Из этих соображений можно попросить кого-то опубликовать ее.
Думаю вы согласитесь, что в наше время фраза «закодировать» все больше понимается как «защита сообщения (информации) от несанкционированного просмотра или использовани»
Я при верстке пользую одно простое правило — верстать так, чтоб не возникало вопросов.
Но они, вопросы, конечно могут быть. Тут надо ориентироваться на шаблонизатор. В статье (в коментах) был дан пример со смарти — все коменты заключать в {* *}. В этом случае шаблонизатор сам будет чистить коменты перед выводом пользователю.