【问题标题】:MYSQL index prefix applies same to COMPOSITE PRIMARY INDEXES?MYSQL 索引前缀是否适用于 COMPOSITE PRIMARY INDEXES?
【发布时间】:2021-05-06 21:40:54
【问题描述】:

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

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 index prefix。我可以像这样高效地查询这张表

SELECT *
FROM my_composite_table
WHERE first_id = 1 AND second_id = 2 AND third_id = 3 AND table_id = 4;
SELECT * FROM my_composite_table
WHERE first_id = 1 AND second_id = 2 AND third_id = 3;
SELECT *
FROM my_composite_table
WHERE first_id = 1 AND second_id = 2;
SELECT *
FROM my_composite_table
WHERE first_id = 1;

我的问题是这条规则是否同样适用于复合主键。我想进行这样的查询:

SELECT *
FROM my_composite_table
WHERE first_id = 1 AND table_id = 4;

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

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

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

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

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

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

    在最后一个查询中,MySQL 将像第四个查询一样扫描所有行。但随后它会在决定返回行之前执行额外的过滤器。因此,这不如前四个查询有效。但这可能就足够了,这取决于索引的第一个键的选择性。

    【讨论】:

    • 哦,很好,所以如果在第四个查询中我使用WHERE second_id = 1 AND table_id = 4; 查询,那肯定会有所不同?那么在这种情况下,创建一个额外的索引可能会更好吗?
    • @user15362695 。 . .然后查询将不匹配前缀。 MySQL 可能会为此实施跳过扫描。您可能想检查这是否足够。
    • @ Gordon Linoff 哈哈,是真的。非常感谢!