绑定索引,后期会有什么风险吗?

【 使用环境 】生产环境
【 OB or 其他组件 】ob 4.2.1.8
【问题描述】因为sql的一些order by导致走错索引,那我在sql分析->慢sql->索引->绑定,对后期删除这个索引会有潜在风险吗?
sql :
SELECT * FROM aaaa WHERE user_id = ? AND state IN (?) AND identity IN (?,?,?,?) AND is_del = ? ORDER BY is_top desc,sort desc,lms_activity_latest_time desc,join_time desc,updated_at desc, id desc LIMIT ?; params_value: 30645851,0,1,2,3,192,0,50



案例说应该走idx_usi更快,但是目前走了idx_uis

@论坛小助手

在生产环境中使用索引绑定(Index Binding)需要谨慎,因为它可能会带来以下潜在风险:

  1. 索引删除风险:如果你绑定了某个索引,但在后续的数据库维护中删除了该索引,那么绑定的索引将不再有效,可能导致查询性能下降,甚至报错。
  2. 索引变更风险:如果索引结构发生变化(如列的添加、删除或修改),绑定的索引可能不再适用,同样会导致查询性能下降。
  3. 维护成本增加:索引绑定需要定期检查和维护,以确保绑定的索引仍然有效且符合当前的查询需求。
  4. 适应性降低:绑定索引后,优化器无法根据最新的统计数据自动选择最佳的执行计划,可能导致某些情况下选择次优的执行计划。

在你的具体场景中,SQL语句如下:

SELECT * FROM aaaa WHERE user_id = ? AND state IN (?) AND identity IN (?,?,?,?) AND is_del = ? ORDER BY is_top desc,sort desc,lms_activity_latest_time desc,join_time desc,updated_at desc, id desc LIMIT ?; params_value: 30645851,0,1,2,3,192,0,50

当前执行计划选择了 idx_uis 索引,而你希望通过绑定 idx_usi 索引来优化性能。

建议

  1. 测试:在非生产环境中充分测试绑定索引后的性能,确保绑定的索引确实能提升查询性能。
  2. 监控:在生产环境中启用索引绑定后,持续监控查询性能和系统状态,及时发现并解决问题。
  3. 文档记录:记录绑定索引的操作和原因,以便后续维护和审计。
  4. 备份:在进行索引绑定前,备份相关表和索引的结构,以便在出现问题时快速恢复。

具体信息可参考以下文档:

  1. SQL 性能问题的典型场景和排查思路
  2. 阅读和管理 OceanBase 数据库 SQL 执行计划
1 个赞

刚好做了这个outline的命令行实验
create table test1(id int ,name varchar(32));

insert into test1 values(1,‘a’),(2,‘b’),(3,‘c’),(4,‘d’),(5,‘e’),(…);

create index idx_test1_name on test1 (name);

–模拟name=‘a’ 超过表的20% 那么下面SQL就会全表扫面
select * from test1 t1 where name = ‘a’;

–找到 sql_id
SELECT svr_ip, trace_id, user_name, db_name, sql_id, query_sql, plan_id FROM oceanbase.gv$ob_sql_audit where query_sql like ‘%test1%’ ;

– 创建 baseline 提示走索引或者强制走索引
CREATE OUTLINE outline1 ON ‘C04DB5ABAB28166FC79FED197E93C3E1’ USING HINT /*+ USE_INDEX(t1 idx_test1_name) */;

SELECT * FROM oceanbase.__all_outline

–发现走索引
explain select * from test1 t1 where name = ‘a’;
|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)|

|0 |EXCHANGE IN REMOTE | |1 |8 |
|1 |└─EXCHANGE OUT REMOTE| |1 |8 |
|2 | └─TABLE RANGE SCAN |t1(idx_test1_name)|1 |7 |

–删除索引会导致前面的OUTLINE添加的强制索引无效 该sql的执行计划会发生变化
drop index idx_test1_name on test1;

– 删除outline
DROP OUTLINE outline1;

1 个赞