ClickHouse/libs/libmysqlxx/include/mysqlxx/mysqlxx.h
2014-04-08 10:51:53 +04:00

68 lines
5.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <mysqlxx/Connection.h>
#include <mysqlxx/Transaction.h>
#include <mysqlxx/Manip.h>
#include <mysqlxx/Pool.h>
#include <mysqlxx/Date.h>
#include <mysqlxx/DateTime.h>
#include <mysqlxx/Null.h>
/** 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,
* и данные байты не могут встречаться в представлении каких-либо других символов)
* эта функция избыточна.
*
* 4. Много мусора (dynamic_cast, typeid при конвертации значений).
*
* Низкая производительность проявляется в виде следующих эффектов:
* 1. При последовательном чтении таблицы из MySQL, узким местом является процессор клиента,
* на котором выполняется код с использованием mysql++, а MySQL сервер не нагружен.
* При использовании MySQL C API этого не возникает.
* 2. Скорость последовательного чтения из MySQL не превышает 30MB/s.
*
* Некоторые места, потенциально, обладают низкой производительностью, но
* это не проявляется на данный момент и не исправлено в mysqlxx:
* - составление запроса (используются iostreams).
*
* ВНИМАНИЕ!
*
* mysqlxx реализована как чрезмерно простая обёртка над MySQL C API,
* реализующая небольшое подмножество интерфейса mysql++, которое мы используем.
* При этом, ради простоты и производительности приносится в жертву
* кроссплатформенность, меняется семантика некоторых функций,
* многие функции работают при большом наборе допущений.
* Допущения зачастую специфичны именно для Яндекс.Метрики и могут быть неприемлимы для других проектов.
*
* mysqlxx нельзя рассматривать, как полноценную библиотеку, так как она разрабатывается
* из принципа "всё, что не используется сейчас - не реализовано",
* а также зависит от небольшого количества кода из других мест репозитория Метрики
* (при необходимости, зависимости можно убрать).
* Предполагается, что пользователь сам допишет недостающий функционал.
*/