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

Php 相对于表中的列数,MySQL数据库结果是否会变慢?,php,mysql,database,database-design,Php,Mysql,Database,Database Design,使用PHP,我正在构建一个MySQL数据库资源密集的应用程序,但我还需要它的数据非常灵活。目前,有许多表具有不同列的数组(包括一些text、longtext、int等),将来,每当需要新的数据组时,我将详细介绍这些表的列数 我的问题是,如果我有一个表,比如说,有10列,并且我在将来将其扩展到40列,那么SQL查询(通过PHP)的速度会大大降低吗? 只要只查找最初10列的初始小查询不是全选(*)查询,我想知道是否使用了更多资源或处理,因为源表现在要大得多 此外,由于许多列现在一直保持为空值(例如,

使用PHP,我正在构建一个MySQL数据库资源密集的应用程序,但我还需要它的数据非常灵活。目前,有许多表具有不同列的数组(包括一些text、longtext、int等),将来,每当需要新的数据组时,我将详细介绍这些表的列数

我的问题是,如果我有一个表,比如说,有10列,并且我在将来将其扩展到40列,那么SQL查询(通过PHP)的速度会大大降低吗?

只要只查找最初10列的初始小查询不是全选(*)查询,我想知道是否使用了更多资源或处理,因为源表现在要大得多


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

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

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


但是,这非常取决于每种特定情况下的速度。你甚至可以看不到差异,或者让它慢10倍。

很可能,它不会慢很多

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


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

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

MyISAM和InnoDB在这方面的表现有所不同,原因多种多样

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

一般来说,在一个表中有许多列可能不是一个好主意,特别是出于波动性的原因。例如,在iNuDB(可能还有MyISAM?)中,在列的中间重新排列列或改变列类型(即<代码> VARARAR 128 < /> > >代码> VARCHAR 255 <代码>),要求右边的列中的所有数据都在磁盘上移动以生成(或删除)更改列的空间。


就整体数据库设计而言,最好将尽可能多的列设置为
非空
,这样可以节省空间(不需要在列上设置null标志,也不存储空数据),还可以提高查询和索引性能。如果许多记录将某个特定列设置为null,则可能应该将其移动到外键关系并使用联接。这样,磁盘空间和索引开销只会发生在实际保存信息的记录上。

您可以将一个主表划分为多个事务表,这样您将获得比现在快得多的结果。并且在所有事务和主表中也将主键设置为唯一键。它确实可以帮助您加快查询速度


谢谢。

关于灵活的数据仓库,您可能会对这个问题感兴趣:您需要重新设计lame表结构。新数据组应作为链接表中的附加行处理,而不是作为附加列处理。这是数据库体系结构的问题,而不是性能的问题。这里没有什么值得改进的。只是出于普遍无知的另一个“性能”问题。