4.复合索引
在大多数情况下,复合索引比单字段索引号,因为可以过滤出更多数据,精确定位。但是要考虑实际情况,不能滥用,不能乱用。
复合索引设计原则:
1、前缀性
也就是说到底把那个字段放在第一个未知呢,这个至关重要
例如:(col1,col2,col3)这个索引包含三个字段
SELECT * FROM tab1 WHERE col1='XX'
SELECT * FROM tab1 WHERE col2='XX'
SELECT * FROM tab1 WHERE col3='XX'
SELECT * FROM tab1 WHERE col1='XX' AND NAME='CCC'
SELECT * FROM tab1 WHERE col2='XX' AND NAME='CCC'
针对上面的几个SQL语句,到底谁会走索引,谁不走索引你。
其实只要含有col1='SSSS'条件的语句都会走索引
这就是为什么第一个字段为什么这么重要的原因了
2、可选性
就是用于索引的字段的非重复数据必须多,像用性别来做索引字段就行不通。
将字段可选性越多的字段放到前面
复合索引使用建议:
1、分析SQL语句中约束条件字段
2、约束条件比较固定的,优先采用B*树复合索引
3、单个字段是主键、唯一键或则其他可选性很高的字段可以建立单字段索引,节省索引开销
4、在建立复合索引的时候,优先考虑其前缀性,其次是可选性
5、如果涉及到几个条件使用频繁,但是查询组合不固定,可以分别建立单字段索引
6、如果是多表连接,可以考虑在被驱动表的连接字段与该表的其他字段创建复合索引
7、通过查看SQL语句执行计划进行分析
复合索引的优点:
改善选择性:复合索引比单个字段的索引更具选择性
减少I/O:如果要查询的字段刚好全部包含在复合索引的字段里,则ORACLE只须访问索引,无须访问表
什么情况下优化器会用到复合索引呢?
(a) 当SQL语句的WHERE子句中有用到复合索引的领导字段时,ORACLE优化器会考虑用到复合索引来访问.
(b) 当某几个字段在SQL语句的WHERE子句中经常通过AND操作符联合在一起使用作为过滤谓词,并且这几个字段合在一起时选择性比各自单个字段的选择性要更好时,可能考虑用这几个字段来建立复合索引.
(c) 当有几个查询语句都是查询同样的几个字段值时,则可以考虑在这几个字段上建立复合索引.
复合索引字段排序的原则:
确保在WHERE子句中使用到的字段是复合索引的领导字段
如果某个字段在WHERE子句中最频繁使用,则在建立复合索引时,考虑把这个字段排在第一位(在CREATE INDEX语句中)
如果所有的字段在WHERE子句中使用频率相同,则将最具选择性的字段排在最前面,将最不具选择性的字段排在最后面
如果所有的字段在WHERE子句中使用频率相同,如果数据在物理上是按某一个字段排序的,则考虑将这个字段放在复合索引的第一位