当前位置: 首页 > 知识库问答 >
问题:

MySQL:索引和表中行的顺序

杜君浩
2023-03-14

步骤1:

我正在创建一个简单的表。

CREATE TABLE `indexs`.`table_one` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));

第二步:

我在这张桌子上做了两个插页。

insert into table_one (name) values ("B");
insert into table_one (name) values ("A");

第三步:

我做一个选择,我得到一个表,其中的记录是按ID排序的。

SELECT * FROM table_one;

这是预期的结果,因为在mysql中主键是聚集索引,因此数据将按它进行物理排序

现在我不明白的部分。

步骤4:

我正在name列上创建一个索引。

CREATE INDEX index_name ON table_one(name)

我再次重复第3步,但得到了不同的结果。 行现在根据名称列排序。

为什么会出现这种情况? 为什么表中的行顺序会根据name列上的新索引而改变,因为据我所知,在mysql中,主键是唯一的聚集索引,另外创建的所有索引都是次要的。

共有1个答案

西门正平
2023-03-14

我做一个选择,我得到一个表,其中的记录是按ID排序的。 [...] 这是预期的结果,因为在mysql中主键是聚集索引,因此数据将按它进行物理排序。

这里对一个概念有些误解。

表行没有固有的顺序:它们表示无序的行集。 虽然聚集索引强制存储中数据的物理排序,但它不能保证select查询返回行的顺序。

如果希望对查询结果进行排序,那么请使用order by子句。 如果没有这样的子句,则没有定义行的顺序:数据库可以自由地以它喜欢的任何顺序返回结果,并且不能保证在连续执行同一查询时结果是一致的。

select * from table_one order by id;
select * from table_one order by name;
 类似资料:
  • 问题内容: 这是我永远遇到的一个问题。 据我所知,索引的顺序很重要。因此,类似的索引与 并不相同,对吧? 如果我仅定义第一个索引,是否意味着它将仅用于 而不是 由于我使用的是ORM,所以我不知道这些列的调用顺序。这是否意味着我必须在所有排列上添加索引?如果我有2列索引,那是可行的,但是如果我的索引是3列或4列怎么办? 问题答案: 当查询条件仅适用于 部分 索引时,索引顺序很重要。考虑: 如果你的索

  • 问题内容: 如何将MySQL表的数据,结构和索引复制或克隆或复制到新表? 这是我到目前为止发现的。 这将复制数据和结构,但不复制索引: 这将复制结构和索引,但不复制数据: 问题答案: 要使用索引和触发器进行复制,请执行以下两个查询: 要仅复制结构和数据,请使用此代码: 我之前曾问过这个问题: 复制包含索引的MySQL表

  • 我创建了一个带有主键(UsersID、AccountsID)的帐户/用户表,如下所示。我是否应该为Users表添加索引?

  • 问题内容: 任何人都可以从官方MySQL文档中澄清这一点 使用索引…查找特定索引列key_col的MIN()或MAX()值。这由预处理器优化,该预处理器检查是否在索引中在key_col之前出现的所有关键部分上使用WHERE key_part_N =常量。在这种情况下,MySQL对每个MIN()或MAX()表达式执行一次键查找,并将其替换为常量。如果所有表达式都用常量替换,查询将立即返回。例如: S

  • 无论建立主键索引还是普通索引,都要在表的对应列上创建,可以对单列创建索引,也可以对多列创建索引。 创建和删除主键索引 查询数据库,按主键查询速度最快的,每个表只能有一个主键列,但是可以有多个普通索引列。主键列要求列的所有内容必须唯一,而索引列不要求内容必须唯一。 在建表的时候指定(如上述典型建表语句) 建表后通过alter命令增加、删除主键索引 mysql> alter table app_mem

  • 问题内容: 我知道索引的重要性以及联接的顺序如何改变性能。我已经完成了与多列索引相关的大量阅读,但仍未找到我的问题的答案。 我很好奇我是否做多列索引,如果它们指定的顺序根本很重要。我的猜测是,不会,并且引擎会将它们视为一个组,而顺序无关紧要。但我想验证一下。 例如,从mysql的网站(http://dev.mysql.com/doc/refman/5.0/en/multiple-column- i

  • 在 FreeMarker 2.3.23 中,指令名可以使用驼峰样式来代替蛇形样式, 比如 startsWith 代替 starts_with。 但是要知道,在相同模版内,FreeMarker 会强制对模板语言部分的所有标识符使用驼峰样式 (用户自定义名称不会受影响)。 abs ancestors api boolean byte c for strings, for booleans cap_fi

  • $ ${...},  插值 # #,  总体结构, 指令 #{...},  #{...}: 数字插值 < <#...>,  指令 <#--...-->,  总体结构 A ABC,  lower_abc, upper_abc abs built-in,  abs absolute value,  abs acquisition,  使用获得机制 adding hashes,  连接 adding s