Forum Webscript.Ru
Общие => Базы данных => Тема начата: 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, либо большое количество строк в качестве ответа на запрос.
Но у меня только одна строка возвращается... Что же не так?
-
1. тип данных под IP либо int либо спец тип...
2. <= и >=
-
А что если выполнить EXPLAIN (http://dev.mysql.com/doc/refman/5.0/en/explain.html) на твой SELECT запрос и посмотреть использует ли MySQL тот индекс, который определен!
И если не использует, попробовать разобраться почему...
-
Сделал вот такой запрос:
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
Как я понял используется?