Планирование еженедельного скрипта для перестройки индекса Mysql - PullRequest
0 голосов
/ 02 ноября 2018

Мы планируем развернуть хранимую процедуру для перестройки индекса. Согласно нижеуказанным спецификациям на форуме Mysql. Кто-то может отправить любой пример сценария, сделать то же самое для всех таблиц в конкретной базе данных. Будут ли какие-либо проблемы или проблемы, с которыми мы могли бы столкнуться из-за сценария, показанного ниже на выходных.

ALTER TABLE t1 ENGINE = InnoDB;

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

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Ниже приведен скрипт 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 ;
0 голосов
/ 02 ноября 2018

Индексы обновляются в InnoDB, статистика может устареть. Пост 5.6 даже это редко нужно, насколько мне известно. Выполнение команды Alter восстановит таблицу, которая исправит любую фрагментацию. Вы можете прочитать о различных типах алгоритмов, доступных для ALTER TABLE здесь: ALTER TABLE

Если, однако, вы хотите проверить базу данных, вы можете использовать команду check mysql, которая выполняет ALTER, а также несколько других битов n частей для оптимизации индексов, обновления статистики и т. Д. mysqlcheck

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...