这种情况是建复合索引还是多个单独索引?

ilikeff8 2018-12-12 03:25:50
有以下几种常用情况包括了绝大多数几种情况,如何建索引比较合理,而且听说索引多了也会影响性能?

update T set X=value where A=value and B=value and (C=value or C=value) and D=value and E=value and X<>value
update T set Y=value where A=value and B=value and (C=value or C=value) and D=value and E=value and F=value
update T set Z=value where A=value and B=value and (C=value or C=value) and D=value and E=value and F=value and G=value

insert into T (所有字段) value (values)

select * from T where A=value and B=value and C=value and D=value
select * from T where A=value and B=value and (C=value or C=value)
select * from T where A=value and B=value and (C=value or C=value) and D=value
select * from T where A=value and B=value and (C=value or C=value) and D=value and E=value AND Z=value

...全文
248 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilikeff8 2018-12-13
  • 打赏
  • 举报
回复
引用 1 楼 卖水果的net 的回复:
楼主所罗列的这语句,都在有一个共性。 A 列最多,基本上每个查询(更新)都有,B 列次之,偶尔一个查询(更新)没有,以此类推。

所以,针对这些语句,要建立一个 on tablename (A,B,D)

实际上,如果B 列的可选择性更高,可以把索引的顺序提前。 其他列也是一样。



为什么是ABD而不是ABC?建一个包含ABCD的好不好?还是说个数不要那么多? 另外,如果建个ABD,那ABD还需要分别建索引吗?以及某条语句如果只查询用到了A,那ABD复合索引对其是不是毫无用处了
卖水果的net 2018-12-13
  • 打赏
  • 举报
回复
是 on tablename (A,B,C,D) , 手误了。 没有必须再给 B\C\D 这几列,单独的加索引了。 除非 有如下的查询 select * from t where B = value -- 可以考虑增加 on t(B) select * from t where C = value -- 可以考虑增加 on t(C) 如果存在如下查询,并且使用很频繁的话。 select * from t where B = value and C = value -- 可以增加 on t(B,C) 这样的索引。 以上所说,都是理论上,实际要看执行计划,楼主也可以先研究一下”跳跃扫描“。
卖水果的net 2018-12-12
  • 打赏
  • 举报
回复
楼主所罗列的这语句,都在有一个共性。 A 列最多,基本上每个查询(更新)都有,B 列次之,偶尔一个查询(更新)没有,以此类推。 所以,针对这些语句,要建立一个 on tablename (A,B,D) 实际上,如果B 列的可选择性更高,可以把索引的顺序提前。 其他列也是一样。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧