组合多个索引扫描的输出
可以使用多个索引(或相同索引的多次扫描)来完成单个查询。
·多个索引的And-Equal操作
假如在一个查询中为多个索引指定了限定条件,则优化器在解决这个查询时或许能够使用多个索引。
例如:
在bookshelf表的title列和CategoryName列上有两个索引:
select * from bookshelf where title>'M' and CategoryName>'B'
此查询的where子句包含了两个独立的限定条件,每个限定条件对应一个不同的索引,第一个限定条
件对于应主键索引,第二个限定条件对应于bookshelf$category索引,在解决此查询时,优化程序可
能同时使用这两个索引,也可能会进行全表扫描,假如使用两个索引,每个索引都将通过Index Range
scan操作来扫描,从主键索引扫描返回的RowID将与从bookshelf$category索引返回的RowID进行比较。
从两个索引返回的那些RowID将在后面的Table Access by RowID操作中使用: 主键索引的Index Range Scan-- bookshelf的
-->And-Equal-->Table Access by
bookshelf$category索引的-- RowID
Index Range ScanAnd-Equal操作比较两个索引扫描的结果,一般来说,单个多列索引的访问(在查询的where子句的限定
条件中使用了复合索引的首列)将比多个单列索引的And-Equal完成的更好!
And-Equal操作相当于:
select rowid from bookshelf where title>'M'
insersect
select rowid from bookshelf where categoryname>'B'
它把两个结果集共有部分的RowID拿出来去做bookshelf的Table Access by RowID。