Что быстрее?

REMO

Guest
Что быстрее?

Использую БД ip2country.

Прочитал на форуме этот тред http://phpclub.ru/talk/showthread.php?s=&threadid=48788&highlight=iptocountry и задумался.

Я использую запрос:
PHP:
SELECT COUNTRY_CODE
FROM iptocountry
WHERE $ip_num BETWEEN IP_FROM AND IP_TO
EXPLAIN SELECT COUNTRY_CODE FROM iptocountry WHERE 406454272 BETWEEN IP_FROM AND IP_TO;
+-------------+------+---------------+------+---------+------+-------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------------+------+---------------+------+---------+------+-------+-------------+
| iptocountry | ALL | NULL | NULL | NULL | NULL | 16910 | Using where |
+-------------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.00 sec)

Т.е. индексы здесь не поиспользуешь, я так понимаю.

Здесь http://phpclub.ru/talk/showthread.php?s=&threadid=48788&highlight=iptocountry используется принципиально другой запрос, который, как я понимаю, позвляет юзать индексы.

Что работает быстрее, первый запрос или второй?
 

REMO

Guest
Автор оригинала: chira
составной индекс (IP_FROM,IP_TO) пробовал?
Нет, не пробовал. Я думал, что если EXPLAIN не предлагает никаких индексов, то их использование бесполезно?
 

lucas

Guest
если EXPLAIN не предлагает никаких индексов, то их использование бесполезно?
EXPLAIN не предлагает вообще ничего.
EXPLAIN показывает, какие индексы БД использовала при выполнении выборки.
О том, какие индексы создать, придется думать своей головой.
 

REMO

Guest
Автор оригинала: lucas
EXPLAIN не предлагает вообще ничего.
EXPLAIN показывает, какие индексы БД использовала при выполнении выборки.
О том, какие индексы создать, придется думать своей головой.
Ну про эксплейн я вообще только позавчера узнал, так что еще не освоился с ним :)

Тогда такой вопрос, если я создаю индекс, а потом делаю ЭКСПЛЭЙН, то если он показывает, что использовал индек, то все ок... Если показывает, что индекс не использовался, то созданный индекс для этого запроса не годится, так?
 

REMO

Guest
Спасиб, но еще вчера прочитал.

>При помощи EXPLAIN можно выяснить, когда стоит снабдить таблицы индексами, чтобы получить более быструю выборку, использующую индексы для поиска записей.

Так ЭКСПЛЭЙН показывает какие индексы следует использовать или нет? Что то я запутался.
 

su1d

Старожил PHPClubа
REMO
EXPLAIN тебе лишь говорит как выполнялся запрос.
он ничего не предлагает и не выбирает. рассматривай эту команду лишь как запрос на статистику.

поэтому создавай нужные индексы и смотри EXPLAIN твоего запроса. если они использовались при выборке -- тебе будет это видно.

заметь ещё, что индексы не используются, когда в результате запроса должно вернуться (если не ошибаюсь) более трети всех записей из таблицы. но это кажется не твой случай -- с ip2country должно работать нормально.
 

REMO

Guest
В своем первом посте я как раз и указывал на этот пост. Вопрос изначально был, что работает быстрее

SELECT ... FROM ... WHERE ... BETWEEN ip_from AND ip_to
или
SELECT ... FROM ... WHERE ... <= ... AND ... => ...

Вообще то второй запрос, выбирает не совсем то, что нужно как я понимаю. Т.е. он выдаст не одну строку.

Составной индекс ip_from,ip_to не работает, эксплейн его не показывает во всяком случае :(
 

Falc

Новичок
REMO
>>Что работает быстрее, первый запрос или второй?

Тогда я не понял какой запрос у тебя первый а какой второй? В твоем вопросе только один запрос.

Если ты сравнивешь свой запрос с тем, который приводится в том посте, то твой будет медленее так как он не юзает индексы.
 
Сверху