虚谷数据库的联合索引在查询中的使用规律

索引可以为数据定位带来高性能,高效率,但并非表中创建的索引越多越好,因为利用索引提高查询效率是以额外占用存储空间为代价的,而且为了维护索引的有效性,当对表中数据进行操作时,数据库需要对索引进行动态维护。
索引设计可参考以下原则:
• 在常用的数据定位列上创建索引(即 WHERE 子句中出现的列)。
• 在表的主键、外键上创建索引(默认创建的有索引)。
• 在经常用于表与表之间连接的字段上创建索引。
• 查询几乎没有涉及到的列不纳入索引列。
• 针对重复度过高的列不纳入索引列或不创建索引。
• 当该表写的性能比查询的性能要求高时,应少建或者不建索引。

例表添加主键后,自动创建了多列唯一值约束和联合索引:(“grid_labels”,“published_at”,“forecast_at”)

alter table AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST 
add constraint "WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST_PK" 
primary key(grid_labels,published_at,forecast_at);

下面分别看下不同where条件下的执行计划,三个字段的索引序对应:
grid_labels:1
published_at:2
forecast_at:3

一、单列过滤

1EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where grid_labels='2-56'; --走索引

在这里插入图片描述

2EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where published_at='2024-08-07 00:00:00';--不走索引

在这里插入图片描述

3EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where forecast_at='2024-08-12 15:00:00';--不走索引

在这里插入图片描述

二、两个字段过滤

(1,2)
EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where grid_labels='2-56'
and published_at='2024-08-07 00:00:00';--走索引

(1,3)
EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where grid_labels='2-56'
and forecast_at='2024-08-12 15:00:00';--走索引

(2,1)
EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where published_at='2024-08-07 00:00:00'
and grid_labels='2-56';--走索引

(2,3)
EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where published_at='2024-08-07 00:00:00'
and forecast_at='2024-08-12 15:00:00';--不走

(3,1)
EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where forecast_at='2024-08-12 15:00:00'
and grid_labels='2-56';--走索引

(3,2)
EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where forecast_at='2024-08-12 15:00:00'
and published_at='2024-08-07 00:00:00';--不走

三、三个字段过滤

(1,2,3)
EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where grid_labels='2-56'
and published_at='2024-08-07 00:00:00'
and forecast_at='2024-08-12 15:00:00';--走索引

(1,3,2)
EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where grid_labels='2-56'
and forecast_at='2024-08-12 15:00:00'
and published_at='2024-08-07 00:00:00';--走索引

(2,1,3)
EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where published_at='2024-08-07 00:00:00'
and grid_labels='2-56'
and forecast_at='2024-08-12 15:00:00';--走索引

(2,3,1)
EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where published_at='2024-08-07 00:00:00'
and forecast_at='2024-08-12 15:00:00'
and grid_labels='2-56';--走索引

(3,1,2)
EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where forecast_at='2024-08-12 15:00:00'
and grid_labels='2-56'
and published_at='2024-08-07 00:00:00';--走索引

(3,2,1)
EXPLAIN VERBOSE
select * from AECC_PLAT.WRF_192H_POSTD03_FORECAST_WEATHER_NEWEST
where forecast_at='2024-08-12 15:00:00'
and published_at='2024-08-07 00:00:00'
and grid_labels='2-56';--走索引

结论:
从执行计划看:
1、不含索引序为1的字段grid_labels,不走索引
2、包含索引序为1的字段grid_labels,走索引

虽然包含索引序为1的字段grid_labels的sql,通过执行计划查看均显示走到了索引,但是否每个字段过滤时都走到了索引还是未知的,例如(1,3)这种组合,索引序为3这列是否走到了索引,是否会自动调整索引条件的顺序,由于虚谷的执行计划还无法观测到具体走到索引列的情况,这个问题还有待讨论探究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值