在学习mysql时,我读到在向mysql表添加列时可以执行以下语句:
ALTER TABLE contacts ADD email VARCHAR(60) AFTER name;
或
ALTER TABLE contacts ADD email VARCHAR(60) FIRST;
你想什么时候做?列顺序可以用于查询优化目的吗? longblobs应该是优化空间消耗的最后一栏吗?或者出于其他原因存在这些命令?
答案 0 :(得分:7)
但这会影响select * from mytable
中结果的顺序。
这就是为什么你应该总是在select语句中命名列,例如select col1, col2 from mytable
。但是,如果您知道该应用正在使用*
,则添加列时必须小心。
否则,请对列进行排序,以便理解它是最符合逻辑的。如果它影响了性能,则意味着您已经处于数据库性能调优的阴暗面,并且您可能在其他地方出现问题。
答案 1 :(得分:7)
这个问题与关系模型或SQL无关。这是一个表演问题。
在某些数据库中,由于执行磁盘访问的方式,以特定方式对列进行排序更为有效。是否具有显着优势的是平台特定的。这是一个与底层存储设计方式和引擎访问方式相关的低级I / O问题。专有引擎提供商通常通过其教育和培训部门提供此信息。
我认为您必须与在您的特定平台上了解存储模型和MySQL的i / o方法的细节或者在您的平台上对此进行基准测试以获得答案的人进行交谈。
完全有可能将它以优化的方式放在磁盘上并隐藏您的列排序。
答案 2 :(得分:1)
我认为它不管性能如何,但在某些情况下 - 当你使用索引时。
实施例
我使用了连接表:
| category_id | user_id |
这两列都是unsigned int (10)
和primary key ( category_id, user_id )
注意列的顺序。当我开始使用where user_id = ?
从该表中进行选择时 - 性能很低。
在我更改了列的顺序(首先是user_id)之后,它开始选择更快的时间。
答案 3 :(得分:1)
A"你什么时候想要使用这个"而不是性能问题。
如果主顺序和从属列之间的列顺序不同,并且列类型不兼容,则基于行的复制将中断(错误1677)。
ALTER TABLE contacts MODIFY email VARCHAR(60) AFTER name;
将是解决此问题的一种方法。
答案 4 :(得分:0)
不,不应该。标准化数据库也不应该对列顺序有约束。
答案 5 :(得分:0)
列顺序无关紧要。这纯粹是一种便利功能。只是为了允许您在创建数据库表之后按照自己喜欢的方式重构数据库表。
答案 6 :(得分:0)
关系模型没有对行内列的排序的概念,也没有表中行的排序概念。
答案 7 :(得分:0)
是的, 列顺序确实很重要。 。但是,如果您要进行优化,则最可能的赌注(在90%的情况下)是添加一个索引。 MySQL官方文档仅在添加索引的上下文中讨论优化(来源:Dev.MySQL.com: How MySQL Uses Indexes)。
但是对于问题-列顺序绝对重要。实际上,所有问题都取决于链接的行和内存块在MySQL Engine中的工作方式。在an Oracle-certified professional ...
上的文章中引用The Secrets of Oracle Row Chaining and Migration的Martin Zahn受束缚的行对我们的影响不同。在这里,这取决于我们需要的数据。如果我们有一个包含两列的行分布在两个块中,则查询:
SELECT column1 FROM table
column1在块1中,不会导致任何“表提取连续行”。实际上,它不必获取column2,也不会一直沿链接的行行进。另一方面,如果我们要求:
SELECT column2 FROM table
并且由于行链接的原因,column2在块2中,所以实际上您会看到«表获取连续行»
这显然给我们的印象是,如果我们选择column2的次数多于选择column1的次数,那么我们应该对这些列重新排序,以优化数据库查询。
我在2002年的HP Enterprise论坛上发现了一条旧帖子,此帖子在搜索后至少被一百篇帖子复制。这里有关如何进行列排序的建议似乎与专业人员的详细说明相匹配。所以,谢谢比尔·索尔斯坦森!
要优化查询,请根据以下规则对列进行排序:
- 首先是主键列。
- 接下来是外键列。
- 接下来是经常搜索的列。
- 以后经常更新的列。
- 最后是空列。
- 在更常用的可空列之后使用最少的可空列。
- 自己表中的Blob和其他几列。
来源:HP Forums