Оптимизация запроса MySQL

panika

Новичок
Оптимизация запроса MySQL

Допустим у меня есть такой скрипт:
PHP:
$idtovar = $_GET['addproduct'];
$qc = "SELECT COUNT(*) FROM `cart` WHERE `nomer`='$idtovar' AND `ip`='$ccvl' LIMIT 1";
while ($count=mysql_fetch_row(mysql_query($qc))){
	$colichestvo = $count['0'];
}
if($colichestvo !='0'){
	$sql = "SELECT * FROM `cart` WHERE `nomer` = '$idtovar' WHERE `ip`='$ccvl' LIMIT 1";
	$res = mysql_query($sql);
		while ($rouw = mysql_fetch_array($res)){
			$coltovara = $rouw['value'];
		}
	$coltovara += $valm;
	$qur3 = "UPDATE cart SET value='$coltovara' WHERE `nomer` = '$idtovar' AND `ip`='$ccvl' LIMIT 1";
	}else{
		$qur3 = "INSERT INTO `cart` (nomer, value, ip) VALUES('$_GET[addproduct]', '$valm', '$rand')";
	}
Почитал статьи про оптимизацию запросов к Бд мозги кипели а толку 0. Пожалуйста на примере моего скрипта скажите как их оптимизировать, а то мануал не помогает.
 

fixxxer

К.О.
Партнер клуба
а что у тебя тормозит?

p.s. за такие названия переменных полагается немедленный расстрел
p.p.s для начала лучше почитай http://phpfaq.ru/slashes, а то оптимизировать будет нечего =)
 

Glazyrin Sergey

Новичок
А что вам нужно сделать ?
Потому что на этом куске кода у меня мозги закипели потому что я ничего не понял :)
Опишите задачу
 

panika

Новичок
Вот прокоментировал важную часть. надеюсь все понятно.
PHP:
$idtovar = $_GET['addproduct']; //УЗНАЕМ КАКОЙ НОМЕР ТОВАРА ХОЧЕТ ДОБАВИТЬ ПОЛЬЗОВАТЕЛЬ
$qc = "SELECT COUNT(*) FROM `cart` WHERE `nomer`='$idtovar' AND `ip`='$ccvl' LIMIT 1"; 
while ($count=mysql_fetch_row(mysql_query($qc))){ 
    $colichestvo = $count['0'];//Приваиваем переменной значение количества строк в таблице где совпадает номер товара и присвоенный индентификатор
} 
if($colichestvo !='0'){ //Если строки существуют узнаем запросом в БД значение ячейки value (количество товара)
    $sql = "SELECT * FROM `cart` WHERE `nomer`= '$idtovar' WHERE `ip`='$ccvl' LIMIT 1"; 
    $res = mysql_query($sql); 
        while ($rouw = mysql_fetch_array($res)){ 
            $coltovara = $rouw['value']; 
        } 
    $coltovara += $valm; //Добавляем количеству товара значание из формы на странице, изначально $valm было $_POST['value']
    $qur3 = "UPDATE cart SET value='$coltovara' WHERE `nomer` = '$idtovar' AND `ip`='$ccvl' LIMIT 1";//Обновляем информацию
    }else{ //Если этот товар пользователь еще не добавлял в корзину, то с помощью INSERT создаем строку в таблице где $_GET[addproduct] - ID товара, $valm - кол. заказываемого товара, $rand - случайное число которое в дальнейшем будет в ячейке ip.
        $qur3 = "INSERT INTO `cart` (nomer, value, ip) VALUES('$_GET[addproduct]', '$valm', '$rand')"; 
    }
-~{}~ 10.02.09 23:54:

а что у тебя тормозит?
Не тормозит а вообще не грузит. Вначале было все нормально, но когда настроил проверку количества, он стал выдавать ошибку 502 Bad Gateway
p.p.s для начала лучше почитай ...
Прочитал никаких таких ошибок не обнаружил. Возможно ты ошибся и дал не тот мануал.

-~{}~ 11.02.09 00:09:

ПОМОГЛО!
PHP:
ini_set('display_errors',1);
error_reporting(E_ALL ^E_NOTICE);
Ошибка была в запросе к БД, где синтаксис MySQL не соблюдался. Поторопился а ошибки не вижу.
PHP:
$sql = "SELECT * FROM `cart` WHERE `nomer`= '$idtovar' WHERE `ip`='$ccvl' LIMIT 1";
 

DiMA

php.spb.ru
Команда форума
1. нахрена делать 2 запроса? Можно одним запросом получить и "LIMIT 1" и узнать, сколько строк было бы в ответе без Лимита (см. доку). Двойные вычисления.

2. nomer`='$idtovar' AND `ip`='$ccvl'
Первым условием следует ставить более уникальное поле.

3. У тебя в запросе всегда идет селект и инсерт/апдейт. Во-первых, второе можно заменить на REPLACE, кода меньше. Во-вторых, можно действовать по умному:
а) вставлять по INSERT [IGNORE] и если возникает ошибка (т.е. поле по примари кей уже есть) - делаешь SELECT + REPLACE
б) делать UPDATE и если обновлено 0 строк, то REPLACE (именно REPLACE, т.к. INSERET может обламаться из-за параллельности исполнения)
А или Б выбираешь - смотря, что чаще бывает. Итого у тебя минимум на 50% снижается кол-во запросов. Правда, не для всех типов данных такое возможно. Для таблицы с простой статистикой (ИДтовара и ИПклиента) - идеально.
 

fixxxer

К.О.
Партнер клуба
>> он стал выдавать ошибку 502 Bad Gateway

какой интересный говнохост, в первый раз такое вижу, что при 500-х от php бэкенд отваливается. :) видимо вообще ничего не отдает, даже хедера. Беги оттуда :)

а вообще, ты в ссылочке которую я дал запятую то убери (парсер лох), и почитай внимательно
 
Сверху