首页 > 解决方案 > MySQL SELECT 查询忽略一个表上的索引,在另一个表上使用它们

问题描述

在观看了Bill Karwin出色的“如何设计索引,真的”视频后,我决定创建一些索引。但是,我在使用索引时遇到了一些无法解释的行为。

我有 2 个测试表 - “owl_oners”和“puma_owners”。当我在“puma_oners”上运行这个 EXPLAIN 查询时,
EXPLAIN SELECT owner_id FROM puma_owners ORDER by name LIMIT 1;
我收到了这个结果: 在此处输入图像描述

但是当我对“owl_owners”运行相同的查询时:
EXPLAIN SELECT owner_id FROM owl_owners ORDER by name LIMIT 1;
我得到了不同的结果: 在此处输入图像描述

为什么我得到不同的结果?两张表实际上是相同的: 在此处输入图像描述

在此处输入图像描述

两个表都有 2 列“name”和“owner_id”,主要区别在于“owl_owners”中的“name”字段要大得多。以下是“puma_owners”的示例内容: 在“owl_owners”中也是一样的,只是名称末尾附加了更多的“b”字符——最多 32k。
在此处输入图像描述

两个数据库都有相同的 4 个索引,涵盖了所有可能性。
在“owl_owners”表中,我将索引中的“名称”限制为 750 个第一个字符,即使这些值在 10 个第一个字符内也是唯一的。

为什么不使用索引对“owl_owners”表进行查询?

标签: mysqlindexing

解决方案


您已经找到了为什么“索引前缀”( name(750)) 通常无用的示例。

另一个提示:当你拥有 时INDEX(a, b),拥有 几乎没有任何用处INDEX(a)。(每张表有 3 个无用的索引。)

更多提示:http: //mysql.rjweb.org/doc.php/index_cookbook_mysql


推荐阅读