Mysql 有什么理由担心表中的列顺序吗?
我知道你可以用FIRST和AFTER来改变MySQL中的列顺序,但是你为什么要麻烦呢?既然好的查询在插入数据时会显式地命名列,那么真的有理由关心列在表中的顺序吗 否,SQL数据库表中列的顺序完全不相关-除了显示/打印目的。对列重新排序没有意义——大多数系统甚至没有提供这样做的方法(除了删除旧表并使用新的列顺序重新创建它) 马克 编辑:从关系数据库的Wikipedia条目中,以下是相关部分,对我来说,它清楚地表明列顺序永远不应该引起关注:Mysql 有什么理由担心表中的列顺序吗?,mysql,sql,database-table,Mysql,Sql,Database Table,我知道你可以用FIRST和AFTER来改变MySQL中的列顺序,但是你为什么要麻烦呢?既然好的查询在插入数据时会显式地命名列,那么真的有理由关心列在表中的顺序吗 否,SQL数据库表中列的顺序完全不相关-除了显示/打印目的。对列重新排序没有意义——大多数系统甚至没有提供这样做的方法(除了删除旧表并使用新的列顺序重新创建它) 马克 编辑:从关系数据库的Wikipedia条目中,以下是相关部分,对我来说,它清楚地表明列顺序永远不应该引起关注: 关系定义为一组n元组。在数学和关系数据库模型中,集合是一个
关系定义为一组n元组。在数学和关系数据库模型中,集合是一个无序的项集合,尽管有些数据库管理系统对它们的数据进行了排序。在数学中,元组有一个顺序,允许重复。E.F.Codd最初使用这个数学定义定义元组。后来,E.F.Codd的一个伟大见解是,在基于关系的计算机语言中,使用属性名而不是排序将更加方便(一般而言)。这一观点至今仍在使用 否,SQL数据库表中列的顺序完全不相关-除了显示/打印目的。对列重新排序没有意义——大多数系统甚至没有提供这样做的方法(除了删除旧表并使用新的列顺序重新创建它) 马克 编辑:从关系数据库的Wikipedia条目中,以下是相关部分,对我来说,它清楚地表明列顺序永远不应该引起关注:
关系定义为一组n元组。在数学和关系数据库模型中,集合是一个无序的项集合,尽管有些数据库管理系统对它们的数据进行了排序。在数学中,元组有一个顺序,允许重复。E.F.Codd最初使用这个数学定义定义元组。后来,E.F.Codd的一个伟大见解是,在基于关系的计算机语言中,使用属性名而不是排序将更加方便(一般而言)。这一观点至今仍在使用 必须键入时输出的可读性:
select * from <table>
从中选择*
在您的数据库管理软件中
这是一个非常虚假的原因,但目前我想不出任何其他原因。必须键入时输出的可读性:
select * from <table>
从中选择*
在您的数据库管理软件中
这是一个非常虚假的原因,但目前我想不出任何其他原因。一些写得不好的应用程序可能依赖于列顺序/索引,而不是列名。他们不应该这样,但确实发生了。更改列的顺序会破坏此类应用程序。一些编写不好的应用程序可能依赖于列顺序/索引,而不是列名。他们不应该这样,但确实发生了。更改列的顺序会破坏此类应用程序。您唯一需要担心列顺序的时候是您的软件是否特别依赖该顺序。通常这是因为开发人员变得懒惰,做了一个
选择*
,然后在结果中按索引而不是按名称引用列。您唯一需要担心列顺序的时候是您的软件是否特别依赖该顺序。通常这是因为开发人员变得懒惰,做了一个选择*
,然后在结果中按索引而不是按名称引用列。列顺序对我调整过的一些数据库(包括Sql Server、Oracle和MySQL)的性能有很大影响。该职位有:
- 首先是主键列
- 接下来是外键列李>
- 下一个经常搜索的列
- 以后经常更新专栏
- 可为空的列最后一个李>
- 在使用频率较高的可空列之后使用最少的可空列
SomeId int,
SomeString varchar(100),
SomeValue int
引擎必须猜测SomeValue的起始位置,因为SomeString的长度未知。但是,如果您将订单更改为:
SomeId int,
SomeValue int,
SomeString varchar(100)
现在,引擎知道可以在行的开头4个字节后找到SomeValue。因此,列顺序会对性能产生相当大的影响
编辑:Sql Server 2005在行的开头存储固定长度的字段。每行都有一个varchar开头的引用。这完全否定了我上面列出的效果。因此,对于最近的数据库,列顺序不再有任何影响。列顺序对我所调优的一些数据库(包括Sql Server、Oracle和MySQL)的性能有很大影响。该职位有:
- 首先是主键列
- 接下来是外键列李>
- 下一个经常搜索的列
- 以后经常更新专栏
- 可为空的列最后一个李>
- 在使用频率较高的可空列之后使用最少的可空列
SomeId int,
SomeString varchar(100),
SomeValue int
引擎必须猜测SomeValue的起始位置,因为SomeString的长度未知。但是,如果您将订单更改为:
SomeId int,
SomeValue int,
SomeString varchar(100)
现在,引擎知道可以在行的开头4个字节后找到SomeValue。因此,列顺序会对性能产生相当大的影响
编辑:Sql Server 2