1

假设我在 (x,y) 索引的 foo 表的两列上有一个索引

如果我将其搜索为select * from foo where x=1 and y=2or select * from foo where y=2 and x=1。在mysql上真的很重要吗?

4

2 回答 2

1

简短的回答 - 不,没关系。MySQL 将尝试选择要使用的最佳索引,无论该列在您的WHERE子句中出现在第一个还是第二个。

您可以通过在每个语句上运行一条语句来证明这一点,EXPLAIN以获取有关MySQL 如何执行查询的更多信息——它应该表明在两种情况下都使用了相同的索引。


如果您正在谈论列在索引中出现的顺序 - (x,y)vs (y,x),那么在这种情况下也无关紧要,因为您选择使用这两个列。但是,如果您有时只选择其中一列,则该列应首先出现在索引中,以便 MySQL 可以在仅提供一个值时使用部分索引来帮助优化查询。

于 2013-07-19T06:49:13.013 回答
0

这在 Postgre 上对某些查询进行优化查询非常有用,但是 MySQL 只是忽略索引顺序(ASC,DESC)我不知道哪个版本会支持这个。

“我认为”这是一个工作台错误,但 wockbench 团队回答我:

我们的手册http://dev.mysql.com/doc/refman/5.5/en/create-index.html说:

“index_col_name 规范可以以 ASC 或 DESC 结尾。这些关键字被允许用于未来扩展以指定升序或降序索引值存储。目前,它们被解析但被忽略;索引值始终按升序存储。”

因此,可能这就是您在 Workbench 中看到的原因:它允许添加 DESC 选项,但服务器本身会忽略它。

之前的评论可以在http://bugs.mysql.com/65893查看

于 2017-07-14T12:49:23.963 回答