mysql 重建索引,mysql优化之索引重建

为了提高查询速度,需要对频繁插入更新的表索引进行重建,重建索引的原则:

对一个索引进行结构分析后,如果该索引占用超过了一个数据块,且满足以下条件之一:B‐tree树的高度大于3;

使用百分比低于75%;数据删除率大于15%,就需要考虑对索引重建 。

创建表,用于存放需要重建的索引名称

‐‐ Create table

create table T_REBUILD_INDEX

(

name VARCHAR2(30),

btree_space NUMBER,

height NUMBER,

pct_used NUMBER,

deleted_pct NUMBER

) ;

2.创建搜索需要重建索引的过程

CREATE OR REPLACE PROCEDURE P_REBUILD_INDEX IS

V_INDEX_NAME VARCHAR2(30);

IV_SQL1 VARCHAR2(3000);

IV_SQL2 VARCHAR2(3000);

CURSOR C_INDEX(V_INDEX_NAME IN VARCHAR2) IS

SELECT INDEX_NAME FROM USER_INDEXES ORDER BY INDEX_NAME;

BEGIN

DELETE FROM T_REBUILD_INDEX;

COMMIT;

OPEN C_INDEX(V_INDEX_NAME);

LOOP

FETCH C_INDEX

INTO V_INDEX_NAME;

EXIT WHEN C_INDEX%NOTFOUND;

IV_SQL1 := 'ANALYZE INDEX ' || V_INDEX_NAME || ' COMPUTE STATISTICS ';

EXECUTE IMMEDIATE IV_SQL1;

IV_SQL2 := 'ANALYZE INDEX ' || V_INDEX_NAME || ' VALIDATE STRUCTURE ';

EXECUTE IMMEDIATE IV_SQL2;

INSERT INTO T_REBUILD_INDEX

SELECT NAME,

BTREE_SPACE,

HEIGHT,

PCT_USED,

DEL_LF_ROWS / (DECODE(LF_ROWS, 0, 1, LF_ROWS)) * 100 AS DELETED_PCT

FROM INDEX_STATS

WHERE HEIGHT > 3 AND(PCT_USED < 75 OR DEL_LF_ROWS / (DECODE(LF_ROWS, 0, 1,

LF_ROWS)) * 100 >20);

END LOOP;

CLOSE C_INDEX;

COMMIT;

END;

3.select * from t_rebuild_index 查询考虑需要重建的索引;

4.重建索引的:

ALTER INDEX INDEX_NAME REBUILD;

REPAIR TABLE tbl_name QUICK;

repair table XXX USE_FRM;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值