一般设计表结构时,我倾向于把属于一个实体的所有字段放在一张表中。这当然也有一个前提:字段不要太多(在我眼中超过25个就很多了)。
以前工作时遇到过别人设计的超过50个字段的表,甚至在群里看到过朋友发的超过100个字段的表。
吓人!
今天阅读 MySQL 官方文档时,在索引那一章的 《Foreign Key Optimization》[1],有这么一段话,让我了解了表结构优化的另一方法:
If a table has many columns, and you query many different combinations of columns, it might be efficient to split the less-frequently used data into separate tables with a few columns each, and relate them back to the main table by duplicating the numeric ID column from the main table. That way, each small table can have a primary key for fast lookups of its data, and you can query just the set of columns that you need using a join operation. Depending on how the data is distributed, the queries might perform less I/O and take up less cache memory because the relevant columns are packed together on disk. (To maximize performance, queries try to read as few data blocks as possible from disk; tables with only a few columns can fit more rows in each data block.)
如果你不喜读英文,我这里翻译一下:
如果一个表有很多列,而你又要查询很多不同列的组合(即每次查询时,只需要部分列的数据),那么把不常用的数据拆分成独立的表,每个表有简单几列,通过在分表中引用主表的数字ID列,把它们与主表联系起来,可能会更有效率。这样一来,每个小表都可以有一个主键,以便快速查找数据,而且在需要时可以使用 join 操作查询更多的列。根据数据的分布情况,查询可能会执行较少的I/O,占用较少的缓存内存,因为相关的列已经被打包好放在磁盘上。(为了性能最大化,查询尽量从磁盘上读取更少的数据块;有较少列的表可以在每个数据块中容纳更多的行)。
具体来说,如果你有一张50个字段的表,而平时的查询用的最多的是其中10个字段,那最佳实践是,将这10个字段放在主表中,另外不常用的字段放在分表中。根据需求的不同,分表时不一定是要分成一主一副,也可以是一主多副。
以上便是设计表结构时的一个优化点了,你在设计表结构时,有考虑过它些吗?
参考资料
Foreign Key Optimization: https://dev.mysql.com/doc/refman/8.0/en/foreign-key-optimization.html
– END –
原文始发于微信公众号(背井):MySQL设计表结构时的一个优化项
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/246746.html