索引推荐
信息
智能索引推荐,满足各种SQL语法组合的场景下,推荐最优的索引组合.
基于您的工作负载创建索引
创建高效的索引最重要的原则是,基于您的工作负载(workload)创建索引,而不是基于您的表结构。 索引的目的是为了提升数据库中操作的效率,因此任何其他不以工作负载出发的索引创建方法都是错误的。
针对数据库执行的所有 SQL 语句构成了该数据库的工作负载。在针对一个工作负载构建一组索引时,需要考虑工作负载的以下属性:
- SQL类型,用户执行频繁插入新数据和修改现有数据的OLTP场景,多个索引可能会对性能产生负面影响,并对系统资源造成压力,建议创建最少数量的索引来满足您的索引要求。而在 以查询为主的OLAP场景,您可以添加更多索引,每个索引具有多个键列,甚至可以添加函数索引和条件索引。
- SQL频率,最为最频繁使用的查询创建索引,通过为这些查询创建最好的索引,能够最大限度的提升系统的整体性能。
- SQL的重要性,查询越重要,您可能越想通过创建索引来进行性能优化。
- SQL的本身的结构。
基于单个SQL的结构创建索引
索引的作用如下:
- 快速定位数据
- 避免排序
- 避免回表
本章节我们将通过分析SQL的结构来实现以上的功能,创建高效的索引。
为快速定位创建索引
索引可以通过匹配查询的条件快速的定位数据,查询的条件可能在WHERE子句、HAVING子句、ON子句中。索引和条件的匹配原则遵循最左前缀匹配原则.
最左前缀原则
最左前缀原则指的是,如果查询的时候等值的查询条件精确匹配索引的左边连续一列或几列,则此列就可以被用到,同时遇到范围查询(
>
、<
、between
、like
)就会停止匹配,包括范围条件。
对于联合索引lineitem(l_shipdate,l_quantity)
,下面的SQL中前两个符合最左前缀原则,可以使用该索引。最后一个不满足最左前缀原则,无法使用该索引。
select * from lineitem where l_shipdate = date '2021-12-01' and l_quantity = 100; -- 可以使用索引
select * from lineitem where l_shipdate = date '2021-12-01'; -- 可以使用索引
select * from lineitem where l_quantity = 100; -- 不满足最左前缀原则,无法使用该索引
这三个SQL对于的执行计划如下:
-> Index lookup on lineitem using lidx (L_QUANTITY=100.00, L_SHIPDATE=DATE'2021-12-01') (cost=0.35 rows=1)
-> Index lookup on lineitem using lidx ( L_SHIPDATE=DATE'2021-12-01') (cost=0.35 rows=1)
-> Filter: (lineitem.L_QUANTITY = 100.00) (cost=15208.05 rows=49486)
-> Table scan on lineitem (cost=15208.05 rows=148473)
由于最左前缀原则,在创建联合索引时,索引字段的顺序需要考虑字段值去重之后的个数(Cardinality),Cardinality较大的放前面。