MySQL数据库结果是否会相对于表中的列数减慢?

时间:2010-12-06 03:45:37

标签: php mysql database database-design

使用PHP,我正在构建一个MySQL数据库资源很重的应用程序,但我也需要它的数据非常灵活。目前有许多表具有不同列的数组(包括一些text,longtext,int等),并且将来我想扩展这些表的列数,每当新的数据组是必需的。

我的问题是,如果我有一个表,例如10列,并且我将来将其扩展到40列,那么SQL查询(通过PHP)会大大减慢吗?

只要查找初始10​​列的初始小查询不是SELECT-all(*)查询,我想知道是否使用了更多资源或处理,因为源表现在很多大。

此外,由于许多列现在一直保持为NULL值(例如,每当插入仅需要前10列的新条目时),数据库通常会运行得更慢还是更大?

5 个答案:

答案 0 :(得分:1)

可能最好的解决方案是创建一个包含附加字段的新表,并在必要时创建JOIN表。原始表保持不变,保持其速度,但您仍然可以访问额外的字段。

答案 1 :(得分:1)

由于各种原因,MyISAM和InnoDB在这方面表现不同。

例如,InnoDB将为磁盘上的每个列分配磁盘空间,无论其中是否有数据,而MyISAM将压缩磁盘上的表。在存在大量空列的情况下,InnoDB将浪费大量空间。另一方面,InnoDB执行行级锁定,这意味着(有警告)对同一个表的并发读/写操作将更好(MyISAM在写入时执行表级锁定)。

一般来说,在一个表中包含许多列可能不是一个好主意,特别是出于波动性原因。例如,在InnoDB中(可能还有MyISAM?),在表格中间重新排列列或更改列类型(即varchar 128 - > varchar 255)要求列中的所有数据都是右侧在磁盘上移动以为更改的列创建(或移除)空间。

关于您的整体数据库设计,最好将尽可能多的列作为not null,这样可以节省空间(您不需要列上的空标志,也不需要存储空数据)并提高查询和索引性能。如果许多记录将特定列设置为null,则应该将其移动到外键关系并使用JOIN。这样,磁盘空间和索引开销仅对实际持有信息的记录产生。

答案 2 :(得分:0)

优化不是一个琐事问题。没有什么可以预测的。

一般来说简短的回答是:是的,它会更慢(因为DBMS至少需要从磁盘读取并发送更多数据)。

但是,它非常依赖于每个特定情况,它会慢多少。你甚至可以看不出差异,或者让它慢10倍。

答案 3 :(得分:0)

很可能,它不会大幅减速。

然而,更好的问题是:添加更多字段的哪种方法可以产生更优雅,易懂,可维护,更具成本效益的解决方案?

通常答案是“这取决于”。这取决于数据的访问方式,需求的变化方式,数据的更新方式以及表的增长速度。

答案 4 :(得分:-1)

您可以将一个主表划分为多个TRANSACTION表,这样您将获得比现在更快的结果。并且还在所有事务和主表中将主键设置为 UNIQUE KEY 。它真的可以帮助您更快地查询。

感谢。