ClickHouse/libs/libmysqlxx/include/mysqlxx/mysqlxx.h

68 lines
5.2 KiB
C++
Raw Normal View History

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>
#include <common/LocalDate.h>
#include <common/LocalDateTime.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
*/