Ayola.net
Новости: В связи с обилием спама, постинг на форуме временно закрыт.

Для связи с поддержкой используйте тикеты в панели управления.
 
*
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь. Октябрь 19, 2017, 23:23:29


Войти


Страниц: [1]
  Печать  
Автор Тема: Рассудите спор о SQL  (Прочитано 5709 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sergiy
Старший Новичёк
**

Карма: 5
Сообщений: 95


Отец Сергий


Просмотр профиля WWW
« : Июнь 03, 2008, 14:21:40 »

Тех поддержка Айолы в тикете сообщила мне, что следующая функция, к которой постоянно обращается мой скрипт для работы с БД,  при каждом её вызове подключается к базе из-за чего возникает перегрузка обращений к БД и меня блокируют. На умном форуме phpclub все гуру этому, мягко говоря, не верят.
http://phpclub.ru/talk/showthread.php?s=&threadid=108498&perpage=20
Вот эта функция:
<?
function doquery($query$table$fetch false){
global 
$numqueries,$link,$debug,$ugamela_root_path;
require(
$ugamela_root_path.'config.php');

if(!
$link)
{
$link mysql_connect($dbsettings["server"], $dbsettings["user"], 
$dbsettings["pass"]) or
$debug->error(mysql_error()."<br />$query","SQL Error");

mysql_select_db($dbsettings["name"]) or $debug->error(mysql_error()."<br />$query","SQL Error");
mysql_query("SET NAMES cp1251");
echo 
mysql_error();}

$sql str_replace("{{table}}"$dbsettings["prefix"].$table$query);
$sqlquery mysql_query($sql) or 
$debug->error(mysql_error()."<br />$sql<br />","SQL Error");

unset(
$dbsettings);
$numqueries++;
$arr debug_backtrace();
$file end(explode('/',$arr[1]['file']));
$line $arr[1]['line'];
$debug->add("<tr><th>Query $numqueries: </th><th>$query</th><th>$file($line)</th><th>$table</th><th>$fetch</th></tr>");

if(
$fetch)
{
$sqlrow mysql_fetch_array($sqlquery);
return 
$sqlrow;
}else{return 
$sqlquery;}}
?>
Во всём скрипте в дальнейшем используется функция doquery и для чтения и вроде для записи в БД тоже (кстати она  действительно позволяет запись?).

Например $CurrentPlanet = doquery("SELECT * FROM {{table}} WHERE `id` = '". $user['current_planet'] ."';", 'planets', true);
Записан

tzps@ayola.ru
Модератор
Маэстро
*****

Карма: 79
Сообщений: 1695



Просмотр профиля WWW
« Ответ #1 : Июнь 03, 2008, 18:32:00 »

Во что верят или не верят "гуру" с неизвестного мне форума - мне, честно говоря, не интересно Улыбающийся

Объяснять про циклы, TCP/IP, и прочее, я не вижу смысла - ибо кому надо - тот и так знает, кому не надо - оно ему и не надо.

Вам, и загадочным "гуру" я объясняю механизьм "на пальцах".

Условия просты: на одной странице делается 10 запросов к БД.
Вариант А (как это сделано у вас)

1-1. Подключаемся к СУБД.
1-2. Делаем селект БД.
1-3. Делаем запрос.
1-4. Отключаемся от СУБД.

2-1. Подключаемся к СУБД.
2-2. Делаем селект БД.
2-3. Делаем запрос.
2-4. Отключаемся от СУБД.
.....

10-1. Подключаемся к СУБД.
10-2. Делаем селект БД.
10-3. Делаем запрос.
10-4. Отключаемся от СУБД.

Итого 40 операций.

Вариант Б (как это сделано у всех остальных).

1-1. Подключаемся к СУБД.
1-2. Делаем селект БД.
1-3. Делаем запрос.

2-3. Делаем запрос.

3-3. Делаем запрос.

4-3. Делаем запрос
.....
10-3. Делаем запрос
10-4. Отключаемся от СУБД.

Итого: 13 операций.

Если для вас не очевидно, что 13 операций это меньше чем 40, то мне не понятно о чем вообще идёт речь Подмигивающий


p.s. Привет "гуру" Подмигивающий
Записан

Sergiy
Старший Новичёк
**

Карма: 5
Сообщений: 95


Отец Сергий


Просмотр профиля WWW
« Ответ #2 : Июнь 03, 2008, 18:44:58 »

Где в этой функции "Отключаемся от СУБД" ?
Записан

tzps@ayola.ru
Модератор
Маэстро
*****

Карма: 79
Сообщений: 1695



Просмотр профиля WWW
« Ответ #3 : Июнь 03, 2008, 18:50:06 »

Оно на выходе из каждой функции происходит автоматически для вас, ибо глобальное определение $link не панацея при работе с MySQL
Записан

Sergiy
Старший Новичёк
**

Карма: 5
Сообщений: 95


Отец Сергий


Просмотр профиля WWW
« Ответ #4 : Июнь 03, 2008, 19:14:47 »

Оно на выходе из каждой функции происходит автоматически для вас
Так на выходе из функции или на выходе - окончании работы php-скрипта ?
Если на выходе из функции, то я правильно каждый раз подключаюсь.
Записан

tzps@ayola.ru
Модератор
Маэстро
*****

Карма: 79
Сообщений: 1695



Просмотр профиля WWW
« Ответ #5 : Июнь 03, 2008, 19:20:11 »

О том и речь, что подключаться надо 1 раз.

Но дело не только в этом. Оптимизация предполагает ещё и анализ всей структуры запросов.
Хорошо бы что бы вы перед каждым запросом у себя расставили маркеры времени (microtime()) и посмотреть, какие запросы сколько выполняются.

Т.е. анализировать надо не только "как" вы передаёте запросы, но и сами запросы. Их количество и качество.
Записан

Tenzor
Новичёк
*

Карма: 0
Сообщений: 4


Просмотр профиля
« Ответ #6 : Июнь 10, 2008, 04:48:34 »

А не подскажите ли следующий момент: примерно на том же сайте, где и Серсей, я читал умную мысль, что лучше использовать mysql_pconnect. Насколько это утверждение верно?
Записан
support@ayola.net
Вне категорий
Маэстро
*****

Карма: 267
Сообщений: 4901



Просмотр профиля WWW
« Ответ #7 : Июнь 10, 2008, 04:56:13 »

Если уж говорить о том что лучше, то лучше вообще MySQL не использовать.
PostgreSQL - из бесплатных.
Oracle - из условно-бесплатных.
Oracle или MSSQL - из платных.


Ну а вообще - да, какое-никакое время pconnect экономит. Но, есть несколько но:
1. На бесплатных хостингах его не бывает.
2. На скриптах которые писал "кто-нибудь" его лучше не юзать, даже если свой сервер.
3. Если ресурс посещаемый, то это таки реальные коннекты висящие.
Записан

Бесплатный хостинг с PHP и MySQL

Вопросы и ответы - http://faq.ayola.net
Правка .htaccess - http://htaccess.ayola.net
Техподдержка - http://www.ayola.net/panel/tickets.php
По вопросам хостинга личные сообщения не пишите. Для этого есть тикеты.
alertola
Новичёк
*

Карма: 0
Сообщений: 11


Просмотр профиля WWW
« Ответ #8 : Июнь 14, 2008, 21:45:48 »

Во что верят или не верят "гуру" с неизвестного мне форума - мне, честно говоря, не интересно Улыбающийся
Ну я бы не был так критичен, форум не такой уж и неизвестный. (хотя "гуру" там и в правду разные бывают, некоторых слушать и в правду нежелательно)
Если уж говорить о том что лучше, то лучше вообще MySQL не использовать.
И тут аналогично, конечно PostgreSQL лучше, но MySQL далеко не так плох.

А по теме
Оно на выходе из каждой функции происходит автоматически для вас, ибо глобальное определение $link не панацея при работе с MySQL
На дефолтных настройках РНР в данном коде соединение происходит один раз даже без глобального $link, если вдруг на вашем хостинге стоят какие-то настройки меняющие это поведение то возможно вы и правы.

Ну а что касается самой функции от ТС хочется спросить, к чему было городить такой винегрет ? (почему не воспользоваться "классическими" путями ?)
Записан

С точки зрения анимешника Шестикрылый Семих№% банальнейший хентайный персонаж. Причём придуманный без особой фантазии.
Страниц: [1]
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.13 | SMF © 2006, Simple Machines LLC

2003-2008 © ООО "Инфотур" - Бесплатный хостинг Ayola.net
Valid XHTML 1.0! Valid CSS! Dilber MC Theme by HarzeM
Страница сгенерирована за 0.074 секунд. Запросов: 17.