Search
Write a publication
Pull to refresh

Сравнение быстродействия запросов Mysql

Я самоучка, наставника и более опытного товарища нет и подсказать некому – поэтому информацию Я (всегда пиши Я с большой буквы – привет Mr. Freeman) получаю благодаря Internet или методом проб и ошибок. Когда начал проектировать Интернет магазины и другие сложные системы, возник вопрос быстродействия и ресурсозатратности. Я всегда хотел знать как лучше составлять mysql запросы, которые встречаются чаще всего, правильно сформулировать и задать вопрос Гуглу не получилось и Я решился на эксперимент.



Итак:

Есть таблица:

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

Вывод:
10000 выборок выполняется намного дольше чем 1 выборка с кучей данных. Да, для кого-то это может и очевидно, я тоже это подозревал, но не мог догадываться, что НАСТОЛЬКО медленней.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.