以论坛帖子为例:
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。我桌上没有其他索引。记录是批量插入的,通常是主键。我的查询都按主键查找记录。
答案 0 :(得分:0)
我假设你的查询通常看起来像这样:
SELECT * FROM Post
WHERE threadID = '1'
ORDER BY `order`
如果您不介意在订单更改时更新记录的困难,那么您的设计就可以了。
向主键添加顺序会强制订单值唯一(每个线程ID)。因此,当您想要重新排序某些内容时,您不能暂时拥有重复的数字。相反,您必须提出一些方案来更新不会创建重复项的记录的顺序。
为了获得更好的性能,请缩小message
列的大小。
为避免影响写入性能,请按顺序插入记录。
其他注意事项
以写入性能和存储为代价,您可以添加覆盖索引。假设您已将InnoDB配置为使用足够的内存且系统有足够的可用内存,MySQL可以使用覆盖索引从RAM中提供整个查询结果。
此外,您可以使用内存表来提高读取性能,但代价是写入性能。