在任何关系数据库中,我们都可以创建提高查询速度的索引。但是创建更多索引会损害更新/插入速度,因为Db系统必须在新数据到来时更新每个索引(插入,更新,合并等)
我们用一个例子。
我们可以创建一个名为index1的索引
ADD INDEX index1
(order_id
ASC,buyer_id
ASC)
或者我们可以创建2个索引,index2和index3
ADD INDEX index2
(order_id
ASC)
添加索引index3
(buyer_id
ASC)
在这样的查询中 select * from tablename,order_id> 100和buyer_id> 100
哪一个更快?通过使用Index1或index2和index3?
在等式的另一边,当插入或更新时,我认为使用一个索引而不是2会快得多但我还没有对MySql或MSSQL服务器进行测试,所以我不能这么做当然。如果有人有这方面的经验,请分享。
最后一件事是关于int类型的值,我认为为int类型列创建索引是不可能或不相关的,因为它不会增加查询时间,是真的吗?
答案 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以便于搜索买家的订单