单个或复合列索引之间有什么区别?

时间:2015-11-20 06:39:46

标签: mysql sql-server indexing

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

我们用一个例子。 我们可以创建一个名为index1的索引 ADD INDEX index1order_id ASC,buyer_id ASC) 或者我们可以创建2个索引,index2和index3 ADD INDEX index2order_id ASC) 添加索引index3buyer_id ASC)

在这样的查询中 select * from tablename,order_id> 100和buyer_id> 100

哪一个更快?通过使用Index1或index2和index3?

在等式的另一边,当插入或更新时,我认为使用一个索引而不是2会快得多但我还没有对MySql或MSSQL服务器进行测试,所以我不能这么做当然。如果有人有这方面的经验,请分享。

最后一件事是关于int类型的值,我认为为int类型列创建索引是不可能或不相关的,因为它不会增加查询时间,是真的吗?

2 个答案:

答案 0 :(得分:0)

对于您提到的确切查询,我个人会去index1(您将同时对这两个条件进行搜索操作)。即使您仅按order_id进行过滤,相同的索引也应该完成工作(因为order id是索引的第一列,因此即使您省略买方,相同的BTREE结构仍然有用)。

同时index1如果仅按buyer_id进行过滤则不会有太大帮助(因为BTREE将根据索引创建语句首先由缺少的order_id构建)。您最终可能会使用index1进行索引扫描,而拥有单独的索引仍然适用于该场景(index3上的搜索是应该预期的。)

答案 1 :(得分:0)

索引的性能与其选择性相关联,使用两个索引的事实,或者必须评估复合索引,在其应用或查询的上下文中,对于性能而言,仅仅因为在字段作为索引可能会减少要处理(并放入连接)的行数。

在您的情况下,由于订单通常只有一个买家不是非常有选择性的索引order_id,buyer_id(令人愉快的加入操作的有用性)因为它更像是反向,buyer_id,order_id以便于搜索买家的订单