MYSQL索引前缀适用于COMPOSITE PRIMARY INDEXES



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

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索引前缀。我可以像这个一样高效地查询这个表

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;

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

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

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

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

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

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

最新更新