The only proper guide on PDO (eng.)

Фанат

oncle terrible
Команда форума
P.S.
server-side prepares+multiexec ощутимо ускоряют выполнение множества запросов (5-7% на insert).
Скорее всего это ошибка измерения. Там не на чем ускоряться. Какой план запроса у инсерта?

За грамматику огромное спасибо, пошел править
 

AnrDaemon

Продвинутый новичок
Какой план запроса у инсерта?
Какой может быть план у запроса
Код:
INSERT INTO `index_list` (`pageId`, `itemOrder`, `itemName`, `itemId`, `sectionId`)
VALUES (0, 1, ?, ?, ?);
с заведомо уникальными индексами в пустую таблицу?… От сервера что-то не могу добиться сотрудничества, ругается на ошибку синтаксиса "INSERT" >.<

За грамматику огромное спасибо
Не за что, пиши ещё!
 

Фанат

oncle terrible
Команда форума
Какой может быть план у запроса
Код:
INSERT INTO `index_list` (`pageId`, `itemOrder`, `itemName`, `itemId`, `sectionId`)
VALUES (0, 1, ?, ?, ?);
с заведомо уникальными индексами в пустую таблицу?… От сервера что-то не могу добиться сотрудничества, ругается на ошибку синтаксиса "INSERT" >.<
ну я к тому, что не понимаю, на чем там можно 5% сэкономить. Распарсить запрос - это меньше %. Плана никакого хитровыдуманного тоже строить не нужно. На чем там будет экономия?
 

AnrDaemon

Продвинутый новичок
Ну я тоже не понимаю.
Я тут опять взялся велосипед изобретать PDO враппер писать, так что чуть позже попробую ещё раз завести шарманку и посмотреть, сколько реально получается времени. Ибо тестил пару лет назад.
 

Фанат

oncle terrible
Команда форума
server-side prepares+multiexec ощутимо ускоряют выполнение множества запросов (5-7% на insert). Проблема в том, что если сервер достаточно сильно нагружен, серверные препсы могут вытесняться и кэша и их приходится препарировать заново. Это усложняет код…
Или погоди, ты про длинный запрос с кучей инсертов? то есть, скажем, для вставки 1000 записей используется 10 исполнений запроса, вставляющего по 100 записей?

Вообще, надо бы проработать вопрос вставки. Там ведь основная работа приходится на обновление индексов, насколько я понимаю.
 

AnrDaemon

Продвинутый новичок
PHP:
class PDOWrapper extends PDO
{
// public __construct ( string $dsn [, string $username [, string $password [, array $options ]]] )
// public mixed  errorCode ( void )
// public array  errorInfo ( void )
// public int    exec ( string $statement )
// public mixed  getAttribute ( int $attribute )
// static array  getAvailableDrivers ( void )
// public string lastInsertId ([ string $name = NULL ] )
// public string quote ( string $string [, int $parameter_type = PDO::PARAM_STR ] )
// public bool   inTransaction ( void )

/*
// public bool beginTransaction ( void )
  public function beginTransaction()
  {
    parent::beginTransaction();
    return $this;
  }

// public bool   commit ( void )
  public function commit()
  {
    parent::commit();
    return $this;
  }

// public bool   rollBack ( void )
  public function rollBack()
  {
    parent::rollBack();
    return $this;
  }
*/

// public bool   setAttribute ( int $attribute , mixed $value )
  public function setAttribute($attribute, $value)
  {
    parent::setAttribute($attribute, $value);
    return $this;
  }

// public PDOStatement prepare ( string $statement [, array $driver_options = array() ] )
  public function prepare($statement, $driver_options = array())
  {
    return new PDOStatementWrapper(parent::prepare($statement, $driver_options));
  }

// public PDOStatement query ( string $statement )
  public function query($statement)
  {
    return new PDOStatementWrapper(parent::query($statement));
  }
}

class PDOStatementWrapper
{
  private $stmt;
  private $callMap = array(
    'bindColumn' => true,
    'bindParam' => true,
    'bindValue' => true,
    'execute' => true,
    'setAttribute' => true,
    'setFetchMode' => true,
  );

  public function __construct(PDOStatement $PDOStatement)
  {
    $this->stmt = $PDOStatement;
  }

// Property redirector.
  public function __get($name)
  {
    return $this->stmt->$name;
  }

  public function __set($name, $value)
  {
    $this->stmt->$name = $value;
  }

// public bool   closeCursor ( void )
// public int    columnCount ( void )
// public void   debugDumpParams ( void )
// public string errorCode ( void )
// public array  errorInfo ( void )
// public mixed  fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )
// public array  fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]] )
// public string fetchColumn ([ int $column_number = 0 ] )
// public mixed  fetchObject ([ string $class_name = "stdClass" [, array $ctor_args ]] )
// public mixed  getAttribute ( int $attribute )
// public array  getColumnMeta ( int $column )
// public bool   nextRowset ( void )
// public int    rowCount ( void )
  public function __call($name, $arguments)
  {
    $result = call_user_func_array(array($this->stmt, $name), $arguments);
    return isset($this->callMap[$name]) ? $this : $result;
  }

// public bool bindColumn ( mixed $column , mixed &$param [, int $type [, int $maxlen [, mixed $driverdata ]]] )
  public function bindColumn($column, &$param)
  {
    return $this->__call(__FUNCTION__, func_get_args());
  }
// public bool bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )
  public function bindParam($parameter, &$variable)
  {
    return $this->__call(__FUNCTION__, func_get_args());
  }

// public bool bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
// public bool execute ([ array $input_parameters ] )
// public bool setAttribute ( int $attribute , mixed $value )
// public bool setFetchMode ( int $mode )

}
Не тестил, только закончил писанину. На работу валить надо.
К БД по крайней мере подключается… Дальше надо уже всё проверять, но времени пока нет.
 

Absinthe

жожо
Причем с statement wrapper в этом смысле все нормально
Нет, он часть параметров потерял.

почему бы не сделать так же и для pdo wrapper?
Это и вовсе лишнее, можно просто взять и определить аттрибут PDO::ATTR_STATEMENT_CLASS.
Все остальное - лишний чейнинг.
 

fixxxer

К.О.
Партнер клуба
Под "в этом смысле" я имею ввиду отсутствие нарушения LSP. :) А так я вообще не понимаю, нафига эти обертки (даже если все сделать грамотно) - ничего, кроме экономии на спичках при написании кода в блокноте, они не дают.
 

AnrDaemon

Продвинутый новичок
А я не отрицал. что это велосипед. Там кое-где надо кое-что просто выбросить нахрен. Ошибку уже на улице нашёл.
За отзывы спасибо. Вообще ожидал, что меня просто закопают :D
 

AnrDaemon

Продвинутый новичок
Разве его использование не считается плохим тоном?
На эту тему можно спорить до смены цвета…
pconnect имеет как плюсы так и минусы. В условиях шаредов это был безусловный минус. А в нормальных системах это может вылиться в конкретный плюс. Особенно с ростом нагрузки.
 

Фанат

oncle terrible
Команда форума
Вот так всегда. Возьмёшься велосипед изобретать, а всё до тебя уже изобрели…
Вот только документации на него удивительно мало.
Ну там особо и нечего документировать. Тупо задаешь его и юзаешь. Вот я тут баловался, но потом счел нецелесообразным.
 
Сверху