首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL索引前缀同样适用于复合主索引?

问MYSQL索引前缀同样适用于复合主索引?
EN

Stack Overflow用户
提问于 2021-05-06 21:40:54
回答 1查看 59关注 0票数 1

假设我有一个定义了这个主键的表

代码语言:javascript
复制
CREATE TABLE `my_composite_table` (
    `table_id` bigint(20) unsigned NOT NULL,
    `first_id` bigint(20) unsigned NOT NULL,
    `second_id` bigint(20) unsigned NOT NULL,
    `third_id` bigint(20) unsigned NOT NULL,
    `create_date` int(10) unsigned NOT NULL,
    `update_date` int(10) unsigned NOT NULL,
    PRIMARY KEY (`first_id`, `second_id`, `third_id`, `table_id`)
)

根据mysql索引前缀的说法。我可以像这样高效地查询这个表

代码语言:javascript
复制
SELECT *
FROM my_composite_table
WHERE first_id = 1 AND second_id = 2 AND third_id = 3 AND table_id = 4;
代码语言:javascript
复制
SELECT * FROM my_composite_table
WHERE first_id = 1 AND second_id = 2 AND third_id = 3;
代码语言:javascript
复制
SELECT *
FROM my_composite_table
WHERE first_id = 1 AND second_id = 2;
代码语言:javascript
复制
SELECT *
FROM my_composite_table
WHERE first_id = 1;

我的问题是,这个规则是否以同样的方式应用于复合主键。我想做一个这样的查询:

代码语言:javascript
复制
SELECT *
FROM my_composite_table
WHERE first_id = 1 AND table_id = 4;

查询将使用主键索引,还是只需要为这两个字段创建索引?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-06 21:45:05

查询将使用索引,但将扫描first_id = 1所在的值。

区分两个索引操作是很重要的。索引查找直接指向一行。索引扫描将扫描索引中的行。这些可以一起使用。

因此,在第一个查询中,只使用查找。为什么?MySQL知道行是唯一的。

在接下来的三个查询中,MySQL将查找第一行,然后扫描行返回所有已扫描的行,而第一个条件为真。

在最后一个查询中,MySQL将像第四个查询一样扫描所有行。但是,在决定返回行之前,它将执行额外的筛选。因此,这并不像前四个查询那么高效。但这可能足够好,这取决于索引的第一个键的选择性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67426297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档