列表顺序在MySQL表中是否重要?

Baa*_*Baa 26 mysql database

学习mysql时,我读到在向mysql表添加列时可以执行以下语句:

ALTER TABLE contacts ADD email VARCHAR(60) AFTER name;
Run Code Online (Sandbox Code Playgroud)

要么

ALTER TABLE contacts ADD email VARCHAR(60) FIRST;
Run Code Online (Sandbox Code Playgroud)

你什么时候想做这个?列顺序可以用于查询优化目的吗?longblobs应该是优化空间消耗的最后一栏吗?或者由于某些其他原因存在这些命令?

Hol*_*ger 13

是的,列顺序确实很重要。 但是,如果您正在寻求优化,您最有可能的选择(在 90% 的情况下)是添加索引。MySQL 官方文档仅讨论添加索引的优化(来源:Dev.MySQL.com:MySQL 如何使用索引)。

\n

但对于这个问题——列顺序绝对重要。这实际上是链接行和内存块在 MySQL 引擎中如何工作的问题。引用Oracle 认证专家Martin Zahn 在《Oracle 行链接和迁移的秘密》的文章中的一段话……

\n
\n

链式行对我们的影响不同。这里,就看我们需要的数据了。如果我们有一行包含两列的行,分布在两个块上,则查询:

\n

SELECT column1 FROM table

\n

其中,column1 位于块 1 中,不会导致任何 \xc2\xabtable 获取连续的 row\xc2\xbb。它实际上不必获取column2,它不会一直跟随链接的行。另一方面,如果我们要求:

\n

SELECT column2 FROM table

\n

由于行链接,column2 位于块 2 中,那么您实际上会看到 \xc2\xabtable 获取连续的 row\xc2\xbb

\n
\n

将 MySQL 行映射到数据块

\n

这清楚地给我们留下了这样的印象:如果我们选择的列 2 多于选择的列 1,那么我们应该对列重新排序,作为优化数据库查询的一种方法。

\n

我在 HP Enterprise 论坛上发现了 2002 年的一篇旧帖子,经过搜索后,该帖子已被至少一百个帖子转载。这里关于如何进行列排序的建议显然与专业人士的详细解释相符。所以,差不多二十年后,我必须说:谢谢,比尔·索斯坦森!

\n

要优化您的查询,请根据以下规则对列进行排序:

\n
\n
    \n
  • 首先是主键列。
  • \n
  • 接下来是外键列。
  • \n
  • 接下来是经常搜索的列。
  • \n
  • 以后经常更新专栏。
  • \n
  • 最后是可为空的列。
  • \n
  • 最少使用的可为空列位于最常用的可为空列之后。
  • \n
  • 自己的表中的 Blob 几乎没有其他列。
  • \n
\n
\n

来源:惠普论坛

\n


ewe*_*nli 7

但这会影响结果的顺序select * from mytable.

这就是为什么你应该总是在select语句中命名列,例如select col1, col2 from mytable.但是,如果您知道应用程序正在使用*,那么在添加列时必须小心.

否则,请对列进行排序,以便理解它是最合乎逻辑的.如果它影响性能,则意味着您已经处于数据库性能调优的黑暗面,并且您可能在其他地方出现问题.


小智 7

这个问题与关系模型或SQL无关.这是一个表演问题.

在某些数据库中,由于执行磁盘访问的方式,以特定方式对列进行排序更为有效.是否具有显着优势的是平台特定的.这是一个与底层存储设计方式和引擎访问方式相关的低级I/O问题.专有引擎提供商通常通过其教育和培训部门提供此信息.

我想你必须和那些知道你的特定平台上的存储模型和i/o方法的细节的人或者在你的平台上用平台标记这个以获得答案的人交谈.

它们完全有可能以优化的方式将其放在磁盘上并隐藏您的列排序.


Dan*_*ite 1

不,应该没关系。规范化数据库也不应该对列顺序有限制。