一个“新生”的TokuDB数据库,基础文件是这样的:

    在test数据库下面新建个表t1,并写几条数据:

    1. `a` int(11) NOT NULL,
    2. `b` int(11) DEFAULT NULL,
    3. `c` int(11) DEFAULT NULL,
    4. PRIMARY KEY (`a`),
    5. KEY `bc` (`b`,`c`)

    就会发现目录下多出3个文件,表t1:

    可以发现每个表最少2个文件,命名规则为:

    1. _database_table_main*.tokudb
    2. _database_table_status*.tokudb

    索引是一个单独的.tokudb文件。

    问题1: TokuDB如何知道哪些文件属于表t1

    现在来dump下tokudb.directory:

    TokuDB在启动的时候,会读取tokudb.directory,根据key信息组织出表t1的相关文件,并写到information_schema.tokudb_file_map表。

    问题2: TokuDB如何知道表t1有哪些索引以及列信息

    这些信息全部存在_test_t1_status_90_1_1b.tokudb文件里。

    实验走起来,首先创建一个按时间的分区表t2:

    1. CREATE TABLE `t2` (
    2. `id` bigint(20) NOT NULL AUTO_INCREMENT,
    3. `c1` int(11) DEFAULT NULL,
    4. KEY `id` (`id`),
    5. KEY `c1` (`c1`)
    6. ) ENGINE=TokuDB DEFAULT CHARSET=latin1
    7. /*!50100 PARTITION BY RANGE ( TO_DAYS(date))
    8. (PARTITION p201508 VALUES LESS THAN (736176) ENGINE = TokuDB,
    9. PARTITION rxMORES VALUES LESS THAN MAXVALUE ENGINE = TokuDB) */

    现在分区表的文件是什么样的呢?

    可以看到每个分区表有4个文件:1个main文件,1个status文件,还有2个key索引文件。 对于分区表来说,总的文件数目基本是:分区数目 * (1 + 1 + 索引数目)。

    所以如果您的分区非常多,open-files-limit 配置可要小心了,要尽可能的大点,否则可能会出现”Too many open files”,从而导致实例crash!

    希望本文能帮助您了解到TokuDB的文件组织结构,祝玩得开心!