为重建 Mysql 索引安排每周脚本
Scheduling A Weekly Script for rebuild Mysql Index
我们计划部署一个存储过程来重建索引。根据 Mysql 论坛上的以下规范。有人可以发送任何示例脚本,对特定数据库中的所有 table 执行相同的操作。周末 运行 以下脚本是否存在任何问题或我们可能面临的任何问题。
ALTER TABLE t1 ENGINE = InnoDB;
https://dev.mysql.com/doc/refman/5.7/en/rebuilding-tables.html#rebuilding-tables-alter-table
索引在 InnoDB 中保持最新,统计数据可能会过时。 Post 5.6 据我所知很少需要。 运行 Alter 命令将修复 table,这将修复任何碎片。您可以在此处阅读有关 ALTER TABLE 可用的不同类型算法的信息:
ALTER TABLE
但是如果你想检查数据库,你可以使用 check mysql 命令,它执行 ALTER 以及其他一些位 n 块来优化索引、更新统计信息等。
mysqlcheck
下面是优化 Mysql 数据库的 mysql 脚本。然而,如前所述,它很少需要,因为 InnoDB 本身能够做同样的事情。
USE VIPLamar;
DROP PROCEDURE IF EXISTS Lamar_Index_Rebuild_Script;
DELIMITER //
-- call Lamar_Index_Rebuild_Script();
CREATE PROCEDURE Lamar_Index_Rebuild_Script()
mysp:BEGIN
Declare v_max_counter int;
Declare v_counter int;
Declare v_query longtext;
Declare v_table_name varchar(1000);
Declare v_datetime datetime default now();
DROP temporary TABLE if exists temp_todo;
create temporary table temp_todo
(
id int auto_increment primary key,
`table_name` varchar(1000)
);
create table if not exists VIP_Lamar_Index_Rebuild_Script
(
id int auto_increment primary key,
`table_name` varchar(1000),
start_date datetime,
finish_date datetime
);
insert into temp_todo (table_name)
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = DATABASE();
-- loop thru table
-- check if table exists
Select max(id) Into v_max_counter from temp_todo;
Set v_counter = 1;
WHILE v_counter <= v_max_counter
Do
select `table_name` into v_table_name from temp_todo where id = v_counter;
IF (EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE table_name = v_table_name AND table_schema = DATABASE()))
THEN
set v_query = concat('OPTIMIZE TABLE ' , v_table_name , ';');
set @stmt = v_query;
PREPARE tempstatement FROM @stmt;
EXECUTE tempstatement;
DEALLOCATE PREPARE tempstatement;
END if;
set v_counter = v_counter +1 ;
end while;
insert into VIP_Lamar_Index_Rebuild_Script(`table_name`,start_date,finish_date)
select table_name,v_datetime,now() from temp_todo
;
-- select * from VIP_Lamar_Index_Rebuild_Script;
-- drop table VIP_Lamar_Index_Rebuild_Script;
DROP temporary TABLE if exists temp_todo;
END;
//
DELIMITER ;
我们计划部署一个存储过程来重建索引。根据 Mysql 论坛上的以下规范。有人可以发送任何示例脚本,对特定数据库中的所有 table 执行相同的操作。周末 运行 以下脚本是否存在任何问题或我们可能面临的任何问题。
ALTER TABLE t1 ENGINE = InnoDB;
https://dev.mysql.com/doc/refman/5.7/en/rebuilding-tables.html#rebuilding-tables-alter-table
索引在 InnoDB 中保持最新,统计数据可能会过时。 Post 5.6 据我所知很少需要。 运行 Alter 命令将修复 table,这将修复任何碎片。您可以在此处阅读有关 ALTER TABLE 可用的不同类型算法的信息: ALTER TABLE
但是如果你想检查数据库,你可以使用 check mysql 命令,它执行 ALTER 以及其他一些位 n 块来优化索引、更新统计信息等。 mysqlcheck
下面是优化 Mysql 数据库的 mysql 脚本。然而,如前所述,它很少需要,因为 InnoDB 本身能够做同样的事情。
USE VIPLamar;
DROP PROCEDURE IF EXISTS Lamar_Index_Rebuild_Script;
DELIMITER //
-- call Lamar_Index_Rebuild_Script();
CREATE PROCEDURE Lamar_Index_Rebuild_Script()
mysp:BEGIN
Declare v_max_counter int;
Declare v_counter int;
Declare v_query longtext;
Declare v_table_name varchar(1000);
Declare v_datetime datetime default now();
DROP temporary TABLE if exists temp_todo;
create temporary table temp_todo
(
id int auto_increment primary key,
`table_name` varchar(1000)
);
create table if not exists VIP_Lamar_Index_Rebuild_Script
(
id int auto_increment primary key,
`table_name` varchar(1000),
start_date datetime,
finish_date datetime
);
insert into temp_todo (table_name)
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = DATABASE();
-- loop thru table
-- check if table exists
Select max(id) Into v_max_counter from temp_todo;
Set v_counter = 1;
WHILE v_counter <= v_max_counter
Do
select `table_name` into v_table_name from temp_todo where id = v_counter;
IF (EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE table_name = v_table_name AND table_schema = DATABASE()))
THEN
set v_query = concat('OPTIMIZE TABLE ' , v_table_name , ';');
set @stmt = v_query;
PREPARE tempstatement FROM @stmt;
EXECUTE tempstatement;
DEALLOCATE PREPARE tempstatement;
END if;
set v_counter = v_counter +1 ;
end while;
insert into VIP_Lamar_Index_Rebuild_Script(`table_name`,start_date,finish_date)
select table_name,v_datetime,now() from temp_todo
;
-- select * from VIP_Lamar_Index_Rebuild_Script;
-- drop table VIP_Lamar_Index_Rebuild_Script;
DROP temporary TABLE if exists temp_todo;
END;
//
DELIMITER ;