首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -在表DDL语句中或单独创建索引

问MySQL -在表DDL语句中或单独创建索引
EN

Database Administration用户
提问于 2017-10-24 17:18:43
回答 2查看 747关注 0票数 3

我正在从Server跳到MySQL,并试图了解创建索引作为DDL表create语句的一部分与为要创建的每个索引创建单独的DDL语句有什么区别。

关于MySQL状态的创建索引文档

通常,在使用created创建表本身时,可以在表上创建所有索引。见13.1.18节,“创建表语法”。这个准则对于InnoDB表尤其重要,因为主键决定数据文件中行的物理布局。创建索引使您能够向现有表添加索引。

为什么InnoDB表将索引创建为created的一部分很重要?(下面提供更多详细信息)

创建表后创建索引的潜在问题是什么?

更新

我的问题是针对MySQL站点上关于在创建表期间创建索引的声明,而不是在创建表之后,而是在用数据填充索引之前创建索引。MySQL站点上的语句使人觉得,在使用InnoDB表时,为该表声明DDL语句中的索引是最佳实践,但它们并没有解释为什么,这似乎对性能或其他方面都有好处。

引用我如何在SQL Server中处理这个问题,部分原因是DDL限制,部分原因是我喜欢显式性质,这就是我将使用DDL语句并将主键与任何外键约束一起分配。之后,我将分配聚集索引(如果它不是主键)和次要索引(唯一和非唯一)。但是,在这两种方法中,如果我要用DDL表创建聚集索引或将其分开,最终结果将是相同的。他们的声明听起来像是RDMS将根据不同的方法处理表创建的不同,即使最终结果是相同的,一个主键和一个聚集索引。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2017-10-28 12:36:30

在InnoDB中,从定义上讲,PRIMARY KEY是有组织的和有组织的。如果在指定所需的PK之前填充一个表,则会生成一个隐藏的PK。这个隐藏的PK必须被移除并由所需的PK替换,并且表必须根据新PK重新排序。没有造成“伤害”,但需要额外的时间,BTree可能变得更加支离破碎。

从CREATE TABLE中单独添加辅助键(PK以外的任何键)可能是低效的,也可能不是低效的。但是,再一次,没有造成“伤害”。低效率取决于版本、索引的性质等。

FOREIGN KEYs是另一回事--它们必须按照“正确的顺序”应用。这可以通过让CREATE TABLEs以“正确的顺序”或通过在“正确的顺序”中单独添加FKs来实现。

好的,这方面的文件很薄弱。你可以在bugs.mysql.com上报告。

我更喜欢拥有(并看到) CREATE TABLE DDL中的所有内容。

票数 2
EN

Database Administration用户

发布于 2017-10-24 18:34:13

如果在InnoDB表上放置主键,则它的作用类似于Server中的索引组织表。换句话说,索引和实际数据一起存储,通常按索引的顺序存储。这就像按姓氏按字母顺序创建一本电话簿,然后决定你想要用名字“索引”它--你得把整个事情都付诸实施。

这里有更多的细节:

http://www.ovaistariq.net/521/understanding-innodb-clustered-indexes/

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/189217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档