2014-04-08 06:51:53 +00:00
|
|
|
|
#pragma once
|
2011-03-03 19:57:34 +00:00
|
|
|
|
|
|
|
|
|
#include <mysqlxx/Connection.h>
|
2011-03-04 20:58:19 +00:00
|
|
|
|
#include <mysqlxx/Transaction.h>
|
|
|
|
|
#include <mysqlxx/Manip.h>
|
|
|
|
|
#include <mysqlxx/Pool.h>
|
2011-03-09 19:18:01 +00:00
|
|
|
|
#include <mysqlxx/Date.h>
|
2011-03-10 20:31:02 +00:00
|
|
|
|
#include <mysqlxx/DateTime.h>
|
2011-03-09 19:18:01 +00:00
|
|
|
|
#include <mysqlxx/Null.h>
|
2011-03-03 19:57:34 +00:00
|
|
|
|
|
2011-03-18 20:26:54 +00:00
|
|
|
|
|
2011-03-03 19:57:34 +00:00
|
|
|
|
/** mysqlxx - чрезвычайно простая библиотека для замены библиотеки mysql++.
|
|
|
|
|
*
|
|
|
|
|
* По некоторой причине, в Яндекс.Метрике изначально использовалась библиотека mysql++.
|
|
|
|
|
* Она обладает следующими недостатками:
|
|
|
|
|
* 1. Чрезмерная навороченность: большая часть не используется.
|
|
|
|
|
* 2. Низкая производительность (при использовании в Яндекс.Метрике).
|
|
|
|
|
*
|
|
|
|
|
* Низкая производительность обусловлена следующими причинами:
|
|
|
|
|
*
|
|
|
|
|
* 1. Лишние копирования: класс mysqlpp::Row работает как std::vector<std::string>.
|
|
|
|
|
* В него копируется содержимое MYSQL_ROW.
|
|
|
|
|
* MYSQL_ROW представляет собой char**, выделяемый одним куском,
|
|
|
|
|
* в котором подряд лежат значения в виде не-0-terminated строк.
|
|
|
|
|
*
|
|
|
|
|
* 2. Медленные методы конвертации значений в числа.
|
|
|
|
|
* В mysql++ для этого используется std::stringstream.
|
|
|
|
|
* Это работает медленнее функций POSIX (strtoul и т. п.).
|
|
|
|
|
* В свою очередь, это работает медленнее простых функций,
|
|
|
|
|
* написанных вручную, в которых не учитывается локаль и
|
|
|
|
|
* не используемые в MySQL представления чисел.
|
|
|
|
|
*
|
|
|
|
|
* 3. Медленные методы квотирования и эскейпинга значений.
|
|
|
|
|
* В mysql++ используется mysql_real_escape_string, который корректно
|
|
|
|
|
* эскейпит строки даже при использовании кодировок, не основанных на ASCII.
|
|
|
|
|
* Но при использовании кодировок, основанных на ASCII, например UTF-8,
|
|
|
|
|
* (в общем, кодировок, в которых escape-символы передаются как в ASCII,
|
|
|
|
|
* и данные байты не могут встречаться в представлении каких-либо других символов)
|
|
|
|
|
* эта функция избыточна.
|
|
|
|
|
*
|
2011-03-18 20:26:54 +00:00
|
|
|
|
* 4. Много мусора (dynamic_cast, typeid при конвертации значений).
|
2011-03-03 19:57:34 +00:00
|
|
|
|
*
|
|
|
|
|
* Низкая производительность проявляется в виде следующих эффектов:
|
|
|
|
|
* 1. При последовательном чтении таблицы из MySQL, узким местом является процессор клиента,
|
|
|
|
|
* на котором выполняется код с использованием mysql++, а MySQL сервер не нагружен.
|
|
|
|
|
* При использовании MySQL C API этого не возникает.
|
|
|
|
|
* 2. Скорость последовательного чтения из MySQL не превышает 30MB/s.
|
|
|
|
|
*
|
2011-03-18 20:26:54 +00:00
|
|
|
|
* Некоторые места, потенциально, обладают низкой производительностью, но
|
|
|
|
|
* это не проявляется на данный момент и не исправлено в mysqlxx:
|
|
|
|
|
* - составление запроса (используются iostreams).
|
|
|
|
|
*
|
2011-03-03 19:57:34 +00:00
|
|
|
|
* ВНИМАНИЕ!
|
|
|
|
|
*
|
|
|
|
|
* mysqlxx реализована как чрезмерно простая обёртка над MySQL C API,
|
|
|
|
|
* реализующая небольшое подмножество интерфейса mysql++, которое мы используем.
|
|
|
|
|
* При этом, ради простоты и производительности приносится в жертву
|
|
|
|
|
* кроссплатформенность, меняется семантика некоторых функций,
|
|
|
|
|
* многие функции работают при большом наборе допущений.
|
|
|
|
|
* Допущения зачастую специфичны именно для Яндекс.Метрики и могут быть неприемлимы для других проектов.
|
|
|
|
|
*
|
|
|
|
|
* mysqlxx нельзя рассматривать, как полноценную библиотеку, так как она разрабатывается
|
2011-03-18 20:26:54 +00:00
|
|
|
|
* из принципа "всё, что не используется сейчас - не реализовано",
|
|
|
|
|
* а также зависит от небольшого количества кода из других мест репозитория Метрики
|
|
|
|
|
* (при необходимости, зависимости можно убрать).
|
2011-03-03 19:57:34 +00:00
|
|
|
|
* Предполагается, что пользователь сам допишет недостающий функционал.
|
|
|
|
|
*/
|