我可以使用Slick的Table类定义表的ROW_FORMAT吗?

时间:2018-01-19 21:14:42

标签: scala slick

我正在调查使用压缩表来节省存储空间的可能性。我发现https://dev.mysql.com/doc/refman/5.5/en/innodb-compression-tuning.html显示了一些用于设置的示例代码,并且我能够使用链接示例中显示的命令将其中一个测试表的大小从1.6GB减小到0.5GB。

如果我在mysql控制台中运行show create table my_big_compressed_table\G(在技术上可以称为MariaDB,但我认为这不重要),我得到了

CREATE TABLE `my_big_compressed_table` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  -- some more fields
  -- indexes, foreign keys, etc
) ENGINE=InnoDB <some stuff omitted> ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4

最后一行是重要的一点:ROW_FORMATKEY_BLOCK_SIZE是打开压缩的神奇词,但我找不到用Slick定义这些词的方法。

class MyBigCompressedTable(tag: Tag) extends Table[...](tag, "MY_BIG_COMPRESSED_TABLE") {
  def id = column[Int]("ID", ...)
  // more fields, indexes, foreign keys
  def * = (id, ...)

  // TODO: rowFormat? keyBlockSize?
}

Slick是否提供了定义ROW_FORMATKEY_BLOCK_SIZE设置的方法?如果是这样,怎么样?我希望避免手工编写表创建逻辑。 FWIW,我目前仍然坚持使用Slick 2.1。

1 个答案:

答案 0 :(得分:1)

查看代码我不认为它是开箱即用的。我认为你可以通过引入一个继承自MySQLDriver的自定义“驱动程序”来实现它。该驱动程序应覆盖createTableDDLBuilder以返回super.TableDDLBuilder的子类,而后者将覆盖createTable方法。在被覆盖的createTable中,您可以添加一些自定义逻辑,例如分析Table[_]是否还实现了某些已知的标记特征并相应地修改生成的SQL。