代码之家  ›  专栏  ›  技术社区  ›  abksharma

为重建Mysql索引安排每周脚本

  •  1
  • abksharma  · 技术社区  · 7 年前

    我们计划部署一个存储过程来重建索引。根据Mysql论坛的以下说明。有人可以发送任何示例脚本,对特定数据库中的所有表执行相同的操作。在周末的节目中,我们是否会遇到任何问题或担忧。

    ALTER TABLE t1 ENGINE = InnoDB;
    

    https://dev.mysql.com/doc/refman/5.7/en/rebuilding-tables.html#rebuilding-tables-alter-table

    2 回复  |  直到 7 年前
        1
  •  0
  •   Kris.J    7 年前

    ALTER TABLE

    但是,如果您想检查数据库,您可以使用checkmysql命令,它会改变以及其他一些位n块来优化索引,更新统计数据等。 mysqlcheck

        2
  •  0
  •   abksharma    7 年前

    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 ;