mysql - 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”表进行查询?
解决方案
您已经找到了为什么“索引前缀”( name(750)
) 通常无用的示例。
另一个提示:当你拥有 时INDEX(a, b)
,拥有 几乎没有任何用处INDEX(a)
。(每张表有 3 个无用的索引。)
推荐阅读
- docker - 如何将 Docker 容器中的 Node.js 连接到 Hyperledger Fabric?
- r - Data.table size increases manifolds after performing operation on column
- python - Repeating rows in a DataFrame based on a column
- php - Yii2 dependency injection, configuration and inheritance
- arrays - 如果一维和二维数组总是有相同的内容,时间复杂度会不同吗?
- python - Spark YARN 集群仍未得到充分利用
- mysql - 未使用 HQL 映射的两个表的内部联接
- html - 整页但包含背景颜色
- c++ - 奇怪的 condition_variable::wait_for 行为
- javascript - React.js 如何在路由文件中注册多个路由