Я самоучка, наставника и более опытного товарища нет и подсказать некому – поэтому информацию Я (всегда пиши Я с большой буквы – привет Mr. Freeman) получаю благодаря Internet или методом проб и ошибок. Когда начал проектировать Интернет магазины и другие сложные системы, возник вопрос быстродействия и ресурсозатратности. Я всегда хотел знать как лучше составлять mysql запросы, которые встречаются чаще всего, правильно сформулировать и задать вопрос Гуглу не получилось и Я решился на эксперимент.
Итак:
Есть таблица:
Всего 2 поля, идентификатор – ключ и значение.
Внесем 10000 значений в таблицу… Руками было бы долго, поэтому:
Итак, таблицу заполнили 10000 записями.
Теперь начнём эксперимент:
А вот и результат:
1 запрос — Выбрать все: 0.0823299884796
10000 запросов через цикл: 5.27042508125
1 запрос с использованием 10000 в условии выбора: 0.135871171951
Итак:
Есть таблица:
CREATE TABLE `test` (
`id` int(11) NOT NULL auto_increment,
`value` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;
Всего 2 поля, идентификатор – ключ и значение.
Внесем 10000 значений в таблицу… Руками было бы долго, поэтому:
#===============================================
//подключение к БД
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die ('Can\'t connect MySQL server.' );
mysql_select_db(DB_NAME, $link) or die ('Can\'t connect MySQL base.'.DB_NAME);
mysql_query('SET NAMES `utf8` COLLATE `utf8_unicode_ci`', $link);
//заполнение таблицы test
for ($i=0; $i<10000; $i++){
$query='INSERT INTO `test` ( `id` , `value` ) VALUES (\'\', \''.rand().'\')';
$result = mysql_query($query, $link);
}
//отключение от БД
mysql_close($link);
#===============================================
Итак, таблицу заполнили 10000 записями.
Теперь начнём эксперимент:
#===============================================
# Эксперимент со временем mysql (1):
$link=myconnect_db(); // myconnect_db – моя функция подключения к БД
$count=0;
$time1=microtime(); //- засекаем время начала
$start_array = explode(" ",$time1);
$start_time = $start_array[1] + $start_array[0];
$time1=$start_time;
$query='SELECT * FROM `test`'; // 1 запрос – выбрать все
$result=my_query($query, $link);
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$count+=$row['value'];
}
$temp=microtime(); //- засекаем время окончания
$end_array = explode(" ",$temp);
$end_time = $end_array[1] + $end_array[0];
$temp=$end_time;
$time1=$temp-$time1; // время выполнения первого запроса
#=====================================================
# Эксперимент со временем mysql (2):
$count=0;
$time2=microtime(); //- засекаем время начала
$start_array = explode(" ",$time2);
$start_time = $start_array[1] + $start_array[0];
$time2=$start_time;
// 10000 запросов
for ($i=0; $i<10000; $i++){
$query='SELECT * FROM `test` WHERE `id`='.$i;
$result=my_query($query, $link);
$row = mysql_fetch_array($result, MYSQL_ASSOC);
$count+=$row['value'];
}
$temp=microtime();//- засекаем время окончания
$end_array = explode(" ",$temp);
$end_time = $end_array[1] + $end_array[0];
$temp=$end_time;
$time2=$temp-$time2; // время выполнения 2-го запроса
#=====================================================
# Эксперимент со временем mysql (3):
$count=0;
$time3=microtime();//- засекаем время начала
$start_array = explode(" ",$time3);
$start_time = $start_array[1] + $start_array[0];
$time3=$start_time;
$IN ='';
for ($i=0; $i<9999; $i++){
$IN .=$i.',';
}
$IN .=10000;
//1 запрос – 10000 критериев
$query='SELECT * FROM `test` WHERE `id` IN ('.$IN.')';
$result=my_query($query, $link);
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$count+=$row['value'];
}
$temp=microtime();//- засекаем время окончания
$end_array = explode(" ",$temp);
$end_time = $end_array[1] + $end_array[0];
$temp=$end_time;
$time3=$temp-$time3; // время выполнения 3-го запроса
#=====================================================
mysql_close($link);
// вывод результатов
echo '1 запрос - Выбрать все: '.$time1.'<br>';
echo '10000 запросов через цикл: '.$time2.'<br>';
echo '1 запрос с использованием 10000 в условии выбора: '.$time3.'<br>';
#===============================================
А вот и результат:
1 запрос — Выбрать все: 0.0823299884796
10000 запросов через цикл: 5.27042508125
1 запрос с использованием 10000 в условии выбора: 0.135871171951