В данном небольшом посте я бы хотел поделиться своими мыслями насчёт скорости работы скриптов/программ, которые мы с вами пишем каждый день и обратить внимание на то, сколько «невидимой» работы совершается при выполнении привычных действий.
Выполнение SQL-запросов
Все знают, что работа с SQL обычно является одной из самых медленных компонентов любого сайта. Есть ли какие-то объективные причины для этого? Действительно ли базы данных такие медленные и срочно нужно переходить на NoSQL :)? Давайте посмотрим.
Создадим тестовую табличку в MySQL и наполним её 1 млн записей:
<?php
mysql_connect(...) or die("Cannot connectn");
mysql_select_db(...) or die("Cannot select DBn");
mysql_query('CREATE TABLE IF NOT EXISTS `one_million` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`one` int(11) NOT NULL,
`two` int(11) NOT NULL,
`three` int(11) NOT NULL,
`four` int(11) NOT NULL,
`five` int(11) NOT NULL,
`six` int(11) NOT NULL,
`seven` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB') or die("Cannot create tablen");
for ($i = 0; $i < 1000000; $i++) {
if ($i % 1000 === 999) echo "Done $in";
mysql_query('INSERT INTO one_million VALUES(NULL, ' . rand() . ', ' . rand() . ', ' . rand() . ', ' . rand() . ', ' . rand() . ', ' . rand() . ', ' . rand() . ')');
}
// Да, код не использует batch insert, а также использует устаревшее, но до сих пор работающее расширение mysql
Давайте теперь выполним какой-нибудь простенький запрос, который прочитает нам 1 млн записей:
SELECT COUNT(*) FROM one_million WHERE three = 333
На моем компьютере запрос выполнился за 200 мс! Таким образом, можно заключить, что InnoDB в состоянии просмотреть около 5 млн записей за 1 секунду! Давайте подумаем, где же на веб-сайтах может потребоваться просматривать столько записей на одну страницу :)? На моей прошлой работе я принудительно выставил ограничение в 20 000 просмотренных строк на все SQL-запросы, и после вычищения всех «тормозных» мест время открытия страницы упало в 5 раз!
Читать полностью »