ORDER BY 被忽略,因为 table 中有用户定义的聚簇索引
ORDER BY ignored as there is a user-defined clustered index in the table
我有一个table
CREATE TABLE `tableMain` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`value1` varchar(45) NOT NULL,
'value2' varchar(50) NOT NULL,
'value3' int NOT NULL,
'value4' timestamp NOT NULL,
'value5' int NOT NULL
PRIMARY KEY (`id`)
)
所以我创建了那个 table 并且我希望它总是按 value2 排序,如果有两个类似的它应该按 value3 排序,然后是 value4。
所以我尝试这样做
ALTER TABLE tableMain
ORDER BY value2 ASC, value3 ASC, value4 ASC
当我 运行 该代码时,我得到一个错误:
Error Code: 1105. ORDER BY ignored as there is a user-defined clustered index in the table 'tableMain'
我想补充一点,我把它作为学校的作业,其他有相同任务的人可以 运行 此 ALTER TABLE 行。所以我有点困惑,不知道该怎么办。
如果我们希望按特定顺序返回行,我们可以在查询中指定一个 suitable ORDER BY
子句。
需要在 table 中对行进行“排序”的想法与关系数据库理论背道而驰。 (关系是一组元组;改变关系中元组的“顺序”不会改变关系。)
将理论转化为实践,使用 InnoDB 存储引擎,将 ORDER BY
指定为 table 属性没有意义,因为 InnoDB table 将始终有序(按顺序存储的行),按其簇索引排列。
对于 MyISAM 存储引擎,指定 ORDER BY
可能会提高某些查询的性能。 ALTER TABLE ... ORDER BY
语句仅重组 table 一次。当后续 DELETE
、INSERT
和 UPDATE
语句为 运行.
时,行的“顺序”可能不会保留
重申一下:如果我们需要以特定顺序返回的行,我们不应依赖行在物理上存储在 table 中的“顺序”。我们必须在查询中包含 ORDER BY
。
要真正提高大型 table 的性能,添加适当的索引是可行的方法。
至于为什么你的同学得到的语句是运行,而你的语句returns是错误的...最有可能的解释是他们的table正在使用MyISAM存储引擎,而你的table正在使用InnoDB存储引擎。
(无论分配是什么,更改 table 的存储引擎都不是正确的答案...MyISAM 存储引擎是某些用例的合适选择;但 InnoDB 是最合适的选择对于传统的“关系数据库”用例。)
如果您的要求是您的 InnoDB table“始终按”一组列(无论出于何种原因),则让聚簇索引将这些列作为前导列。您可以通过将这些列声明为 table 的 PRIMARY KEY 的前导列来实现。您可以在 id
列上创建一个 UNIQUE INDEX。
CREATE TABLE `tableMain`
( `id` INT(11) NOT NULL AUTO_INCREMENT
, `value1` VARCHAR(45) NOT NULL
, `value2` VARCHAR(50) NOT NULL
, `value3` INT NOT NULL
, `value4` TIMESTAMP NOT NULL
, `value5` INT NOT NULL
, PRIMARY KEY (`value2`,`value3`,`value4`,`id`)
, UNIQUE KEY `tableMain_UX1` (`id`)
)
实际上,我们永远不会这样做...因为任何二级索引都会将 PRIMARY KEY 值作为返回集群索引的“指针”,这将是一种令人难以置信的资源浪费.实际上,我们将 id
作为 table 的主键,并在其他列上创建二级索引...
CREATE TABLE `tableMain`
( `id` INT(11) NOT NULL AUTO_INCREMENT
, `value1` VARCHAR(45) NOT NULL
, `value2` VARCHAR(50) NOT NULL
, `value3` INT NOT NULL
, `value4` TIMESTAMP NOT NULL
, `value5` INT NOT NULL
, PRIMARY KEY (`id`)
, KEY `tableMain_IX1` (`value2`,`value3`,`value4`)
)
我有一个table
CREATE TABLE `tableMain` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`value1` varchar(45) NOT NULL,
'value2' varchar(50) NOT NULL,
'value3' int NOT NULL,
'value4' timestamp NOT NULL,
'value5' int NOT NULL
PRIMARY KEY (`id`)
)
所以我创建了那个 table 并且我希望它总是按 value2 排序,如果有两个类似的它应该按 value3 排序,然后是 value4。
所以我尝试这样做
ALTER TABLE tableMain
ORDER BY value2 ASC, value3 ASC, value4 ASC
当我 运行 该代码时,我得到一个错误:
Error Code: 1105. ORDER BY ignored as there is a user-defined clustered index in the table 'tableMain'
我想补充一点,我把它作为学校的作业,其他有相同任务的人可以 运行 此 ALTER TABLE 行。所以我有点困惑,不知道该怎么办。
如果我们希望按特定顺序返回行,我们可以在查询中指定一个 suitable ORDER BY
子句。
需要在 table 中对行进行“排序”的想法与关系数据库理论背道而驰。 (关系是一组元组;改变关系中元组的“顺序”不会改变关系。)
将理论转化为实践,使用 InnoDB 存储引擎,将 ORDER BY
指定为 table 属性没有意义,因为 InnoDB table 将始终有序(按顺序存储的行),按其簇索引排列。
对于 MyISAM 存储引擎,指定 ORDER BY
可能会提高某些查询的性能。 ALTER TABLE ... ORDER BY
语句仅重组 table 一次。当后续 DELETE
、INSERT
和 UPDATE
语句为 运行.
重申一下:如果我们需要以特定顺序返回的行,我们不应依赖行在物理上存储在 table 中的“顺序”。我们必须在查询中包含 ORDER BY
。
要真正提高大型 table 的性能,添加适当的索引是可行的方法。
至于为什么你的同学得到的语句是运行,而你的语句returns是错误的...最有可能的解释是他们的table正在使用MyISAM存储引擎,而你的table正在使用InnoDB存储引擎。
(无论分配是什么,更改 table 的存储引擎都不是正确的答案...MyISAM 存储引擎是某些用例的合适选择;但 InnoDB 是最合适的选择对于传统的“关系数据库”用例。)
如果您的要求是您的 InnoDB table“始终按”一组列(无论出于何种原因),则让聚簇索引将这些列作为前导列。您可以通过将这些列声明为 table 的 PRIMARY KEY 的前导列来实现。您可以在 id
列上创建一个 UNIQUE INDEX。
CREATE TABLE `tableMain`
( `id` INT(11) NOT NULL AUTO_INCREMENT
, `value1` VARCHAR(45) NOT NULL
, `value2` VARCHAR(50) NOT NULL
, `value3` INT NOT NULL
, `value4` TIMESTAMP NOT NULL
, `value5` INT NOT NULL
, PRIMARY KEY (`value2`,`value3`,`value4`,`id`)
, UNIQUE KEY `tableMain_UX1` (`id`)
)
实际上,我们永远不会这样做...因为任何二级索引都会将 PRIMARY KEY 值作为返回集群索引的“指针”,这将是一种令人难以置信的资源浪费.实际上,我们将 id
作为 table 的主键,并在其他列上创建二级索引...
CREATE TABLE `tableMain`
( `id` INT(11) NOT NULL AUTO_INCREMENT
, `value1` VARCHAR(45) NOT NULL
, `value2` VARCHAR(50) NOT NULL
, `value3` INT NOT NULL
, `value4` TIMESTAMP NOT NULL
, `value5` INT NOT NULL
, PRIMARY KEY (`id`)
, KEY `tableMain_IX1` (`value2`,`value3`,`value4`)
)