问题
我目前想知道在多个表之间拆分数据的性能影响。
具体来说,我想知道查询期间访问的表数(通过多个连接(如何影响查询时间 - 以及速度减慢是否通常以线性方式增长O(c*n)
随着表的数量n
,或者速度减慢是否通常以指数方式增长O(c^n)
。
TLDR:通过拥有更多的联接,我通常可以预期查询时间的线性增长还是指数增长?
*脚注:我知道这个问题取决于许多不同的因素(例如表架构/行数/查询类型。但是,我要求一个一般的经验法则(
例
假设我们的任务是从以下数据库中检索有关人员及其各自职业的信息。据推测,我们需要在 select 语句中执行连接。
SCENARIO A)
Person_Table
_______________________________
| (PK) ID | Name | Age | Race |
|---------|-------|-----|-------|
| 0 | Jack | 24 | Asian |
| 1000 | Tom | 35 | White |
| 2000 | Robin | 11 | White |
| ... | ... | ... | ... |
Occupation_Table
______________________________
| (PK) ID | (FK) PID | Job |
|---------|----------|---------|
| 0 | 0 | Cook |
| 1 | 1000 | Cook |
| 2 | 2000 | Teacher |
| ... | ... | ... |
现在考虑这个表示相同数据的略有不同的数据库架构。有了这个,我们就不必执行连接。
SCENARIO B)
Person_Table
_________________________________________
| (PK) ID | Name | Age | Race | Job |
|---------|-------|-----|-------|---------|
| 0 | Jack | 24 | Asian | Cook |
| 1000 | Tom | 35 | White | Cook |
| 2000 | Robin | 11 | White | Teacher |
| ... | ... | ... | ... | ... |
这两个表之间的性能如何比较?
SCENARIO B
会快c*2
倍吗?SCENARIO B
会快c^2
倍吗?SCENARIO B
会或多或少地和SCENARIO A
一样吗?
这些差异将如何推广到涉及 3/4/5/等不同表和连接的更极端的例子?
*脚注:在我的示例中 -(PK)
代表主键,(FK)
代表外键
我认为在您的场景中,您不会发现显着差异。只是因为作业数量有限,您可以使用内部联接(大多数人只有一个作业(。
问题始于大表和左/右(外部(联接,这些联接需要大量内存和交换空间,并且您不会减少行数。
当你做左和右连接并将它们合并为一个完整的外部连接时,你就知道为什么mysql没有实现它了。
总之,只要你的数据库很小,你没有很多连接,服务器硬件足够体面,你就不会有任何感觉。
查询性能与正在处理的数据量的关系比与表的数量有关。
该卷基本上分为三类:
- 需要从永久存储中读取的行。
- 需要写入永久存储的行。
- 数据的中间移动,以支持聚合和联接。
在您的示例中,persons
表和occupations
表似乎是数据的"垂直分区"。 也就是说,单个记录的列分布在不同的表中。
在这种情况下,在多表版本中对所有列的查询将较慢。 但是,对子查询的查询可能只需要读取其中一个表,并且速度会更快。
在任何合理的架构中,索引都会链接两个表。 因此,双表方法必须读取更多的数据并进行索引查找。 它将比您指定的查询的单表版本慢一些常量。