mysql 索引碎片自动清理函数

一、mysql 索引
在使用一段时间之后,对于数据库的修改删除,以及索引等会产生碎片,导致查询数据效率变慢,
一般可以通过语句,检查表的状态,

SHOW TABLE STATUS LIKE '表名称' 

在这里插入图片描述

这里我们关注Data_free这个字段:这里的信息包括了已被删除行的空间,因此占用了一部分空间

二、何时进行清理
一般是在2个月之后,运行一次最合适。官方建议时间不要太短。

三、索引碎片自动清理
1、原理:
1)先通过information_schema.tables查询到tabel的名称列表
2)根据information_schema.tables的table个数,进行循环,每次取出第n个table
3)有些用户的mysql 对索引优化语句有限制,需要先将数据库的表存储引擎改为myisam
4)使用 OPTIMIZE TABLE 表名称,进行索引优化
5)最后将数据库的表存储引擎改回去原来的innodb
6)call PROC_OPTIMIZE_TABLE () ,执行存储过程
2、完整的代码如下:

--创建一个存储过程
create PROCEDURE PROC_OPTIMIZE_TABLE ()
BEGIN
        -- 定义变量 -- 
        declare i int default 0; 
		declare rown int default 0;
		declare l_table_name varchar(300);
		declare SQL_FOR_SELECT varchar(1000);
		-- 查询有多少个表格 数据库名称中输入自己的数据库名称-- 
		select count(*) as rown into rown from  information_schema.tables where table_schema='数据库名称' and table_type='base table';

    while rown > 0 do
		  set l_table_name = '';
			set i = i + 1;
			set @n = 0;
			-- 根据变量i,查询第i个table-- 
			select table_name into l_table_name
			from (
			select (@n := @n + 1) as id, table_name from information_schema.tables where table_schema='数据库名称' and table_type='base table' 
			) as x where id = i;
			-- 有些用户的mysql 对索引优化语句有限制,需要先将数据库的表存储引擎改为myisam-- 
			set SQL_FOR_SELECT = CONCAT("ALTER TABLE ",l_table_name," ENGINE='myisam' ;");   -- 拼接sql语句
      set @sql = SQL_FOR_SELECT;
			PREPARE stmt FROM @sql;         -- 预处理动态sql语句
      EXECUTE stmt ; 
			deallocate prepare stmt;      -- 释放prepare
			-- 索引优化-- 
			set SQL_FOR_SELECT = CONCAT("OPTIMIZE TABLE ",l_table_name,";");   -- 拼接sql语句
      set @sql = SQL_FOR_SELECT;
			PREPARE stmt FROM @sql;         -- 预处理动态sql语句
      EXECUTE stmt ;                        -- 执行sql语句
      deallocate prepare stmt;      -- 释放prepare
			-- 数据库的表存储引擎改回去原来的innodb-- 
			set SQL_FOR_SELECT = CONCAT("ALTER TABLE ",l_table_name," ENGINE='innodb' ;");   -- 拼接sql语句
      set @sql = SQL_FOR_SELECT;
			PREPARE stmt FROM @sql;         -- 预处理动态sql语句
      EXECUTE stmt ; 
			deallocate prepare stmt;      -- 释放prepare
			
			set rown = rown - 1;
		end while;

END

四、进阶
可以通过作业,设置定时运行,有需要的可以@本人信息讨论。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值