Размер таблицы - MariaDB Columnstore Vs InnoDB
В каждом анализе, который я обнаружил в ColumnStore от MariaDB, утверждается, что он использует меньше дискового пространства, чем обычные механизмы, такие как InnoDB, например: https://www.percona.com/blog/2017/03/17/column-store-database-benchmarks-mariadb-columnstore-vs-clickhouse-vs-apache-spark/
Но это было не то, что я нашел на моих тестах
CREATE TABLE `innodb_test` (id int, value1 bigint, value2 bigint, value3 bigint, value4 bigint, value5 bigint) ENGINE=innodb;
CREATE TABLE `columnstore_test` (id int COMMENT 'compression=2', value1 bigint COMMENT 'compression=2', value2 bigint COMMENT 'compression=2', value3 bigint COMMENT 'compression=2', value4 bigint COMMENT 'compression=2',value5 bigint COMMENT 'compression=2') ENGINE=columnstore;
Вставьте 1 миллион строк (5 столбцов) со значением 0 в таблицы:
INSERT INTO innodb_test
SELECT CONCAT(a1.id,a2.id,a3.id,a4.id,a5.id,a6.id),
0,0,0,0,0
from
(select 0 as id union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a1,
(select 0 as id union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a2,
(select 0 as id union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a3,
(select 0 as id union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a4,
(select 0 as id union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a5,
(select 0 as id union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a6;
INSERT INTO columnstore_test SELECT * FROM innodb_test;
Размер таблицы columnstore больше таблицы innoDB:
call columnstore_info.table_usage(NULL, 'columnstore_test');
+--------------+------------------+-----------------+-----------------+-------------+
| TABLE_SCHEMA | TABLE_NAME | DATA_DISK_USAGE | DICT_DISK_USAGE | TOTAL_USAGE |
+--------------+------------------+-----------------+-----------------+-------------+
| size_comp | columnstore_test | 352.05 MB | 0 Bytes | 0 Bytes |
+--------------+------------------+-----------------+-----------------+-------------+
SELECT table_name, (data_length + index_length) / (1024 * 1024) "Size in MB" FROM information_schema.tables WHERE table_schema = schema() AND table_name = 'innodb_test';
+-------------+------------+
| table_name | Size in MB |
+-------------+------------+
| innodb_test | 71.6094 |
+-------------+------------+
Также, если я создаю таблицу без сжатия, размер будет таким же:
CREATE TABLE `columnstore_no_compression` (id int COMMENT 'compression=0', value1 bigint COMMENT 'compression=0', value2 bigint COMMENT 'compression=0', value3 bigint COMMENT 'compression=0', value4 bigint COMMENT 'compression=0',value5 bigint COMMENT 'compression=0') ENGINE=columnstore;
INSERT INTO columnstore_no_compression SELECT * FROM innodb_test;
call columnstore_info.table_usage(NULL, 'columnstore_no_compression');
+--------------+----------------------------+-----------------+-----------------+-------------+
| TABLE_SCHEMA | TABLE_NAME | DATA_DISK_USAGE | DICT_DISK_USAGE | TOTAL_USAGE |
+--------------+----------------------------+-----------------+-----------------+-------------+
| size_comp | columnstore_no_compression | 352.00 MB | 0 Bytes | 0 Bytes |
+--------------+----------------------------+-----------------+-----------------+-------------+
Я использую версию mariadb-columnstore-1.1.2-1
файл my.ini:
[client]
port = 3306
socket = /usr/local/mariadb/columnstore/mysql/lib/mysql/mysql.sock
[mysqld]
loose-server_audit_syslog_info = columnstore-1
port = 3306
socket = /usr/local/mariadb/columnstore/mysql/lib/mysql/mysql.sock
datadir = /ssd/mariadb/db
skip-external-locking
key_buffer_size = 512M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 16M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 0
thread_stack = 512K
lower_case_table_names=1
group_concat_max_len=512
sql_mode="ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
infinidb_compression_type=2
infinidb_stringtable_threshold=20
infinidb_local_query=0
infinidb_diskjoin_smallsidelimit=0
infinidb_diskjoin_largesidelimit=0
infinidb_diskjoin_bucketsize=100
infinidb_um_mem_limit=0
infinidb_use_import_for_batchinsert=1
infinidb_import_for_batchinsert_delimiter=7
basedir = /usr/local/mariadb/columnstore/mysql/
character-sets-dir = /usr/local/mariadb/columnstore/mysql/share/charsets/
lc-messages-dir = /usr/local/mariadb/columnstore/mysql/share/
plugin_dir = /usr/local/mariadb/columnstore/mysql/lib/plugin
binlog_format=ROW
server-id = 1
log-bin=/usr/local/mariadb/columnstore/mysql/db/mysql-bin
relay-log=/usr/local/mariadb/columnstore/mysql/db/relay-bin
relay-log-index = /usr/local/mariadb/columnstore/mysql/db/relay-bin.index
relay-log-info-file = /usr/local/mariadb/columnstore/mysql/db/relay-bin.info
tmpdir = /ssd/tmp/
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
Это ожидаемое поведение или я делаю что-то не так?
1 ответ
Я ведущий инженер-программист в MariaDB ColumnStore.
ColumnStore оптимизирован для больших наборов данных и предварительно выделяет дисковое пространство для столбцов. Преимущество этого состоит в том, что на дисковых шпинделях меньше вероятность фрагментации. Недостатком таких небольших наборов данных, как у вас, является выделение большого количества неиспользуемого пространства.
Он начинается с предварительного выделения 256 КБ для первого экстента столбца, а затем расширяется до 2^23 строк (чуть более 8 миллионов). Таким образом, для каждого из ваших столбцов BIGINT он будет предварительно выделять 64 МБ, а для вашего INT он будет предварительно выделять 32 МБ. Небольшое различие между сжатым / несжатым его для блоков заголовка сжатых файлов. У нас есть несколько таблиц information_schema, которые могут показать вам реальное использование (с точностью до 8 КБ):
https://mariadb.com/kb/en/library/columnstore-information-schema-tables/
Таким образом, если вы не планируете использовать гораздо больший набор данных (по крайней мере, в диапазоне нескольких ГБ), к сожалению, вы увидите большое использование диска, когда данных мало.