Оптимизировал производительность одного сайта. Думал, что объединение тысяч запросов в один даст прирост производительности. Оказалось нет. Это повысило нагрузку на базу более чем в 10 раз.
Получается, что 1000 простых запросов выполняется быстрее, чем одни сложный?
Это нормально? Так должно быть?
Примеры запросов:
Было (на эту страницу 80% траффика):
$ex = explode(",",$row['id_categories']);
foreach ($ex as $x)
{
$res2 = $db->query("SELECT * FROM categories WHERE id='$x'");
$row2 = $res2->fetch_array();
}
Стало:
$categories = $db->query("SELECT `url_category`, `rus_category` FROM categories WHERE id IN ({$row['id_categories']})")->fetch_all(MYSQLI_ASSOC);
Было (таких страниц 10-ки, они забирают остальные 20% трафика ):
$res = $db->query("SELECT * FROM products
LEFT JOIN streets ON streets.id=products.id_street
WHERE products.id='$p'");
$row = $res->fetch_array();
if ($row[14] != 0) $x += $row[14];
if ($row[15] != 0) $y += $row[15];
$ex = explode(",",$row['id_categories']);
$z = array();
foreach ($ex as $o)
{
$res2 = $db->query("SELECT * FROM categories WHERE id='$o'");
$row2 = $res2->fetch_array();
array_push($z,$row2[1]);
}
$cats = implode(", ",$z);
$rating = 0;
$w = 0;
$star_block = "";
$resx = $db->query("SELECT * FROM products_reviews WHERE type='$row[url_product]'");
}
Стало:
$query = "SELECT products.url_product,
products.rus_product,
products.home,
products.phone,
products.cx,
products.cy,
streets.rus_street,
streets.url_street,
(SELECT GROUP_CONCAT(CONCAT('<a href=\"/$url_punkt/', `url_category`, '/\">', `rus_category`, '</a>')) FROM `categories` WHERE `id` IN (SELECT `category_id` FROM `category_product` WHERE `product_id` = `products`.`id`) GROUP BY '') AS categories,
(SELECT AVG(`rating`) FROM products_reviews WHERE type = products.url_product) as rating
FROM products
LEFT JOIN streets ON streets.id=products.id_street
WHERE products.id_punkt = $id_punkt
AND `products`.`id` IN (SELECT `product_id` FROM `category_product` WHERE `category_id` = $id_category)";
$products = $db->query($query)->fetch_all(MYSQLI_ASSOC);