Автор Тема: Проблема медленного запроса в MySQL  (Прочитано 6308 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн UltraMax

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 98
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.dinamo-minsk.org
Проблема медленного запроса в MySQL
« : 03 Октября 2007, 08:12:10 »
Использую на виртуальном хостинге базу данных
http://ip-to-country.webhosting.info

Она позволяет создать базу данных с ip, по которой можно по ip (из БД) выдернуть название страны.
Все работает - но на хостинге предпреждают, что заросы очень медленные (то есть тормозят сервер). Вот описание хостера
http://www.1gb.ru/default.aspx?ti=6&hti=111

База создавалась так:

Цитировать
CREATE DATABASE databasename;    USE databasename;    CREATE TABLE `iptocountry` (    `IP_FROM` double NOT NULL default \'0\',    `IP_TO` double NOT NULL default \'0\',    `COUNTRY_CODE2` char(2) NOT NULL default \'\',    `COUNTRY_CODE3` char(3) NOT NULL default \'\',    `COUNTRY_NAME` varchar(50) NOT NULL default \'\',    KEY `CODE` (`IP_FROM`,`IP_TO`,`COUNTRY_CODE2`)  ) ENGINE=MyISAM;


всего там около 80000 записей, и select идет вот так


    //---------------------------------------------------
    // Sample code to display Visitor Country information
    // PHP 4
    //---------------------------------------------------


    // Establishing a database connection
    $dbh=mysql_connect("localhost:3306","$MYSQL_USERNAME","$MYSQL_PASSWORD");
    mysql_select_db("$MYSQL_DBNAME");


    // Query for getting visitor countrycode
    $country_query  = "SELECT country_code2,country_name FROM iptoc ".
         "WHERE IP_FROM<=inet_aton(\'$REMOTE_ADDR\') ".
          "AND IP_TO>=inet_aton(\'$REMOTE_ADDR\') ";


    // Executing above query
    $country_exec = mysql_query($country_query);


    // Fetching the record set into an array
    $ccode_array=mysql_fetch_array($country_exec);


    // getting the country code from the array
    $country_code=$ccode_array[\'country_code2\'];


    // getting the country name from the array
    $country_name=$ccode_array[\'country_name\'];


   // Display the Visitor coountry information
   echo "$country_code - $country_name";


   // Closing the database connection
   mysql_close($dbh);

?>


Скажите - можно ли что-то здесь с оптимизировать так, чтобы поиск меньше загружал сервер? Вроде бы и индексы созданы. Хостер пишет, что
Цитировать
Обычно это означает либо отсутствие необходимого индекса по полю field, либо большое количество строк в качестве ответа на запрос.


Но у меня только одна строка возвращается... Что же не так?

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Проблема медленного запроса в MySQL
« Ответ #1 : 03 Октября 2007, 10:58:40 »
1. тип данных под IP либо int либо спец тип...
2. <= и >=
And no religion too...

Оффлайн html_coder

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 427
  • +0/-0
  • 0
    • Просмотр профиля
Проблема медленного запроса в MySQL
« Ответ #2 : 03 Октября 2007, 11:03:37 »
А что если выполнить EXPLAIN на твой SELECT запрос и посмотреть использует ли MySQL тот индекс, который определен!

И если не использует, попробовать разобраться почему...
« Последнее редактирование: 03 Октября 2007, 11:13:24 от html_coder »

Оффлайн UltraMax

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 98
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.dinamo-minsk.org
Проблема медленного запроса в MySQL
« Ответ #3 : 03 Октября 2007, 23:06:10 »
Сделал вот такой запрос:

EXPLAIN SELECT country_code2,country_name FROM iptocountry WHERE IP_FROM<=inet_aton(\'78.106.23.180\')
AND IP_TO>=inet_aton(\'78.106.23.180\');

получил ответ:

table type possible_keys key key_len ref rows Extra
iptocountry range CODE CODE 8 NULL 12519 where used


Как я понял используется?

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28