Forum Webscript.Ru

Общие => Базы данных => Тема начата: UltraMax от 03 Октября 2007, 08:12:10

Название: Проблема медленного запроса в MySQL
Отправлено: UltraMax от 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, либо большое количество строк в качестве ответа на запрос.


Но у меня только одна строка возвращается... Что же не так?
Название: Проблема медленного запроса в MySQL
Отправлено: commander от 03 Октября 2007, 10:58:40
1. тип данных под IP либо int либо спец тип...
2. <= и >=
Название: Проблема медленного запроса в MySQL
Отправлено: html_coder от 03 Октября 2007, 11:03:37
А что если выполнить EXPLAIN (http://dev.mysql.com/doc/refman/5.0/en/explain.html) на твой SELECT запрос и посмотреть использует ли MySQL тот индекс, который определен!

И если не использует, попробовать разобраться почему...
Название: Проблема медленного запроса в MySQL
Отправлено: UltraMax от 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


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