InnoDB - 使用复合主键来聚类行而不是二级索引的缺点?

时间:2014-11-19 18:41:33

标签: mysql innodb

以论坛帖子为例:

CREATE TABLE Post (
    threadId INT,
    order INT,
    message VARCHAR(255),
    PRIMARY KEY (threadId, order)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

InnoDB按主键对行进行物理排序。在这种情况下,可以通过questionId查找问题的答案,并且它们在磁盘上的顺序相同,因此需要较少的磁盘搜索。

使用这种方法进行快速读取访问是否有任何明显的缺点?

我主要关注数据库大小和读取吞吐量,而写入吞吐量则较少。表格大小预计最大为150gb。我桌上没有其他索引。记录是批量插入的,通常是主键。我的查询都按主键查找记录。

1 个答案:

答案 0 :(得分:0)

我假设你的查询通常看起来像这样:

SELECT * FROM Post
  WHERE threadID = '1'
  ORDER BY `order`

如果您不介意在订单更改时更新记录的困难,那么您的设计就可以了。

向主键添加顺序会强制订单值唯一(每个线程ID)。因此,当您想要重新排序某些内容时,您不能暂时拥有重复的数字。相反,您必须提出一些方案来更新不会创建重复项的记录的顺序。

为了获得更好的性能,请缩小message列的大小。

为避免影响写入性能,请按顺序插入记录。

其他注意事项

以写入性能和存储为代价,您可以添加覆盖索引。假设您已将InnoDB配置为使用足够的内存且系统有足够的可用内存,MySQL可以使用覆盖索引从RAM中提供整个查询结果。

此外,您可以使用内存表来提高读取性能,但代价是写入性能。