|
|
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Добрый день! Проблема следующая: есть две таблицы. В первой хранятся IP-шники (int unsigned not null default '0'), индекс по IP есть. IP отсортированы в порядке возрастания. Из второй таблицы в цикле для каждого IP выбирается страна: select country_code2 from iptocountry where '3282182154'>=ip_from AND '3282182154'<=ip_to Таких однотипных запросов очень много (несколько тысяч) и делаются они в цикле. Во второй таблице поля ip_from и ip_to - граничные значения интервала IP страны, также int unsigned not null default '0'. Есть три индекса: по полю ip_from, по полю ip_to и по обоим этим полям (test). Все индексы UNIQUE (записи действительно уникальны). Строк во второй таблице почти 53 тыс., поэтому брать всю таблицу и разбираться с ней в PHP - нереально. Работает все это весьма долго. Оказалась следующая ситуация: время выполнения вышеприведенных запросов колеблется от 0.004 до 0.4 сек (это при том, что еще каждый раз делается mysql_free_result; без него один запрос до 2 сек мог выполняться!). Проверили explain'ом. Логично было бы предположить, что должен использоваться всегда ключ test. Но, оказывается, примерно первая треть запросов (которая занимает не очень много времени) выполняется с ключом test (т.е. по обоим полям), причем чем больше IP, тем больше строк выбирается в индексе. Когда количество строк переваливает за треть, MySQL перестает (как и написано в документации) использовать ключ. Таким образом вторая часть - самая длительная - вообще не использует никакого ключа (даже при явном указании на него use index test), и естественно выборка идет All. Третья часть использует ключ ip_to (время опять снижается). Возможно, кто-то уже сталкивался с этой ситуацией. Подскажите, каким образом можно либо оптимизировать запрос, либо ускорить выполнение данного куска каким-либо методом. Заранее благодарна ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2004, 19:05 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=671&tid=1854584]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 404ms |

| 0 / 0 |
