单列索引和复合列索引有什么区别?

29 浏览
0 Comments

单列索引和复合列索引有什么区别?

这个问题已经有答案了

我应该在什么时候使用组合索引?

在任何关系型数据库中,我们都可以创建索引来提高查询速度。但是创建更多的索引可能会损坏更新/插入速度,因为数据库系统将不得不在新数据到来时更新每个索引(插入、更新、合并等)。

我们以一个例子为例。

我们可以创建一个名为index1的索引

ADD INDEX index1 (order_id ASC, buyer_id ASC)

或者我们可以创建两个索引,index2和index3

ADD INDEX index2 (order_id ASC)

ADD INDEX index3 (buyer_id ASC)

在像这样的查询中

select * from tablename where order_id>100 and buyer_id>100

哪一个更快?是使用Index1还是index2和index3?

另一方面,在插入或更新时,我认为只使用一个索引会比使用2个索引快得多,但我没有对MySql或MSSQL服务器进行测试,所以我不能非常确定。如果有任何经验,请分享。

最后一件事是关于int类型值,我认为为int类型列创建索引并不可能或与查询时间无关,这是真的吗?

admin 更改状态以发布 2023年5月23日
0
0 Comments

对于您提到的确切查询,我个人会选择 index1(您将同时对两个条件进行搜索)。即使您只按 order_id 过滤,同一索引也应该能发挥作用(因为 order_id 是索引的第一列,所以即使省略了买家,相同的 BTREE 结构仍然有帮助)。

同时,如果您只按 buyer_id 过滤,则 index1 帮助不大(因为 BTREE 首先会根据索引创建语句中缺失的 order_id 进行构造)。在这种情况下,使用单独的索引仍然可行(应该期望在 index3 上进行搜索)。

0
0 Comments

一个索引的性能与其选择性有关。在特定的应用或查询上,使用两个索引或复合索引的事实必须得到评估,这特别关键与性能有关,因为可能会减少处理的行数(并放入关联)。

针对您的情况,由于一个订单通常只有一个买家,因此order_id、buyer_id索引不是非常选择性的(它对于连接操作很有用),而更适用于反向顺序buyer_id、order_id,以便更容易搜索某个买家的订单。

0