| 1 | #pragma once |
| 2 | |
| 3 | #include <mysqlxx/Connection.h> |
| 4 | #include <mysqlxx/Transaction.h> |
| 5 | #include <mysqlxx/Pool.h> |
| 6 | #include <common/LocalDate.h> |
| 7 | #include <common/LocalDateTime.h> |
| 8 | #include <mysqlxx/Null.h> |
| 9 | |
| 10 | |
| 11 | /** 'mysqlxx' - very simple library for replacement of 'mysql++' library. |
| 12 | * |
| 13 | * For whatever reason, in Yandex.Metrica, back in 2008, 'mysql++' library was used. |
| 14 | * There are the following shortcomings of 'mysql++': |
| 15 | * 1. Too rich functionality: most of it is not used. |
| 16 | * 2. Low performance (when used for Yandex.Metrica). |
| 17 | * |
| 18 | * Low performance is caused by the following reasons: |
| 19 | * |
| 20 | * 1. Excessive copying: 'mysqlpp::Row' works like 'std::vector<std::string>'. |
| 21 | * Content of MYSQL_ROW is copied inside it. |
| 22 | * But MYSQL_ROW is a 'char**', that is allocated in single piece, |
| 23 | * where values are stored consecutively as (non-zero-terminated) strings. |
| 24 | * |
| 25 | * 2. Too slow methods for converting values to numbers. |
| 26 | * In mysql++, it is done through std::stringstream. |
| 27 | * This is slower than POSIX functions (strtoul, etc). |
| 28 | * In turn, this is slower than simple hand-coded functions, |
| 29 | * that doesn't respect locales and unused by MySQL number representations. |
| 30 | * |
| 31 | * 3. Too slow methods of escaping and quoting. |
| 32 | * In mysql++, 'mysql_real_escape_string' is used, that works correct |
| 33 | * even for charsets, that are not based on ASCII (examples: UTF-16, Shift-JIS). |
| 34 | * But when using charsets based on ASCII, as UTF-8, |
| 35 | * (in general, charsets, where escape characters are represented in same way as in ASCII, |
| 36 | * and where that codes cannot appear in representation of another characters) |
| 37 | * this function is redundant. |
| 38 | * |
| 39 | * 4. Too much garbage (dynamic_cast, typeid when converting values). |
| 40 | * |
| 41 | * Low performance cause the following effects: |
| 42 | * 1. In sequential read from MySQL table, the client CPU becomes a bottleneck, while MySQL server is not loaded. |
| 43 | * When using bare MySQL C API, this doesn't happen. |
| 44 | * 2. Sequential read from MySQL is lower than 30MB/s. |
| 45 | * |
| 46 | * Warning! |
| 47 | * |
| 48 | * mysqlxx is implemented as very simple wrapper around MySQL C API, |
| 49 | * and implements only limited subset of mysql++ interface, that we use. |
| 50 | * And for the sake of simplicity, some functions work only with certain assumptions, |
| 51 | * or with slightly different semantic than in mysql++. |
| 52 | * And we don't care about cross-platform usage of mysqlxx. |
| 53 | * These assumptions are specific for Yandex.Metrica. Your mileage may vary. |
| 54 | * |
| 55 | * mysqlxx could not be considered as separate full-featured library, |
| 56 | * because it is developed from the principle - "everything that we don't need is not implemented", |
| 57 | * and also the library depends on some other libraries from Yandex.Metrica code. |
| 58 | * (dependencied could be easily removed if necessary). |
| 59 | * It is assumed that the user will add all missing functionality that is needed. |
| 60 | */ |
| 61 | |