MySQL 在 VARCHAR 上引用索引前缀时如何使用 ORDER BY?

Posted

技术标签:

【中文标题】MySQL 在 VARCHAR 上引用索引前缀时如何使用 ORDER BY?【英文标题】:How does MySQL use ORDER BY when referencing an indexed prefix on VARCHAR? 【发布时间】:2012-07-06 23:10:02 【问题描述】:

我很好奇这是如何处理的。我有一个名为 titlevarchar(255) 列,其中前 10 个字符被编入索引。

如果我创建一个按标题排序的 mysql 查询,它是仅利用该索引,还是忽略它,还是我必须发出命令才能使用该索引?

例如,假设我有两个名为 title 的项目:

This is the same thing
This is the same thing only slightly different

前 10 个字符是相同的,那么 MySQL 是如何处理的呢?它是否使用前 10 个字符的前缀索引,然后逐行索引?

【问题讨论】:

MySQL 可能使用也可能不使用索引。语句的 EXPLAIN 将显示索引是否正在使用。使用ORDER BY title,使用索引是不够的,除非 MySQL 有某种神奇的方式知道标题长度不超过 10 个字符......我认为它不会,如果是这样,它可能会有所不同通过存储引擎(MyISAM 与 InnoDB)。 MySQL 有可能使用索引来优化排序,但它不能完全避免排序,至少不使用该索引。 【参考方案1】:

嗯,是said:

即使 ORDER BY 不匹配,也可以使用索引 准确索引,只要索引的所有未使用部分和 所有额外的 ORDER BY 列都是 WHERE 子句中的常量。

但我强烈建议使用 EXPLAIN 检查此查询,以查看优化器将选择哪条路径。

【讨论】:

以上是关于MySQL 在 VARCHAR 上引用索引前缀时如何使用 ORDER BY?的主要内容,如果未能解决你的问题,请参考以下文章

mysql前缀索引

mysql联合索引详解

10.Mysql索引

0929mysql前缀索引如何找到合适的位数

MySQL InnoDB引擎索引长度受限怎么办

MYSQL数据库四种索引类型的简单使用--MYSQL组合索引“最左前缀”原则