Mysql 在同一个表上添加两个复合索引的异常行为

Mysql 在同一个表上添加两个复合索引的异常行为,mysql,Mysql,我不确定复合索引是否是正确的词;我的意思是,我有一个由多个列组成的索引 问题: 我的主键由两列组成,它们工作正常;A栏和B栏。当我尝试在同一个表上创建另一个由两个columnA和columnC组成的索引时,我遇到了麻烦。一旦我创建了第二个索引,它就会接管并成为聚集索引,这样表就会被它排序,而忽略第一个创建的主键索引 可能的解决方案: 我希望表按列A和列B上的第一个索引排序,但我将第二个索引用于其他目的。为了解决这个问题,我可以在第二个表中复制数据,其中ColumnA和ColumnC是唯一的索引,

我不确定复合索引是否是正确的词;我的意思是,我有一个由多个列组成的索引

问题:

我的主键由两列组成,它们工作正常;A栏和B栏。当我尝试在同一个表上创建另一个由两个columnA和columnC组成的索引时,我遇到了麻烦。一旦我创建了第二个索引,它就会接管并成为聚集索引,这样表就会被它排序,而忽略第一个创建的主键索引

可能的解决方案:

我希望表按列A和列B上的第一个索引排序,但我将第二个索引用于其他目的。为了解决这个问题,我可以在第二个表中复制数据,其中ColumnA和ColumnC是唯一的索引,但如果可以避免的话,我不想这样做

系统信息:MySQL

在MySQL(以及任何其他SQL引擎)中,不能保证您的表是按任何特定顺序排序的。确保排序的唯一方法是使用
orderby
子句

现在,若不使用ORDERBY,则无法保证排序的原因是:在插入或删除行时,服务器可以自由地为新插入重新使用“孔”。此外,服务器可以自由地首先从缓存或当前磁盘头所在的位置传递行,前提是这样可以获得更好的性能—如果您使用
限制
而不使用
排序依据
,这可能会特别有帮助


因此,长话短说,只要在您的选择中始终使用
ORDER BY
,您的问题就会消失。

我的印象是,每个表都有一个聚集索引,而该索引就是行在磁盘上的物理布局。在表上执行全选时,返回的行始终反映了这一点。如果你想违反标准排序,难道不使用ORDER BY吗?@UsmanMutawakil不,那不是真的——至少在MySQL方面是这样。如果缺少order by,db可以按照它想要的任何顺序返回行。我明白了。因此,我需要为inserts@UsmanMutawakil否-当您选择
时,您需要添加
订购依据
。您无法控制数据库引擎决定将内容保存到磁盘的顺序,您不应该在意。你只关心当你选择时,你把东西放回什么样的顺序。@jcsanyi我明白你的意思,但我认为聚集索引的全部目的是为了物理排序。不过我很在乎它是怎么储存的。如果它不是连续的,这不影响检索它的速度吗?