Процедурка для анализа/оптимизации всех таблиц в одной или во всех базах данных в пределах mySQL-сервера: CREATE PROCEDURE `mysql_maintenance_all_tables`( IN db_name VARCHAR(64), IN do_optimize TINYINT(1), IN do_analyze TINYINT(1) ) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN DECLARE l_loop_end INT DEFAULT 0; DECLARE IN_TABLE_SCHEMA VARCHAR(100); DECLARE IN_TABLE_NAME VARCHAR(100); DECLARE cur1 CURSOR FOR SELECT TABLE_SCHEMA,TABLE_NAME FROM information_schema.TABLES WHERE /* if db_name is not provided, it will analyze/optimize all tables except the system ones */ IF(db_name IS NULL OR db_name='', TABLE_SCHEMA NOT IN ('information_schema', 'performance_schema', 'mysql'), TABLE_SCHEMA=db_name); DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET l_loop_end = 1; OPEN cur1; REPEAT FETCH cur1 INTO IN_TABLE_SCHEMA,IN_TABLE_NAME; IF NOT l_loop_end THEN IF (do_optimize) THEN SET @qry = CONCAT('OPTIMIZE TABLE ', IN_TABLE_SCHEMA, '.', IN_TABLE_NAME); PREPARE stmt FROM @qry; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; IF (do_analyze) THEN SET @qry = CONCAT('ANALYZE TABLE ', IN_TABLE_SCHEMA, '.', IN_TABLE_NAME); PREPARE stmt FROM @qry; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; END IF; UNTIL l_loop_end END REPEAT; CLOSE cur1; END; Я редко использую эту процедуру при помощи прямого вызова, предпочитая оптимизировать всё автоматически, через определённые промежутки времени. Вешаем вызов процедуры оптимизации на планировщик событий: CREATE EVENT `scheduler_daily_optimize` ON SCHEDULE EVERY 1 DAY STARTS '2012-05-07 05:15:15' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN /* и анализ и оптимизация для всех таблиц базы "my_db_name"*/ CALL mysql_maintenance_all_tables('my_db_name', 1, 1); END; Таким образом процесс оптимизации будет запускаться ежедневно, в 5 утра 15 минут 15 секунд. Если кто-то захочет поюзать описанный функционал, но ещё никогда не использовал Scheduled Events, не забываем включить его в конфигурации mySQL. Прописываем следующую строку в my.cnf (my.ini в Windows): event_scheduler = ON и перезапускаем mysql /etc/init.d/mysql restart Кто поюзает вышеописанное — ставьте лайк:) ———————————— Цей документ було скопійовано з FAVOR.com.ua (https://favor.com.ua/blogs/8544.html). Всі права на матеріал зберігаються за його автором. При перепублікуванні посилання на джерело матеріалу є обов’язковим! Дата документу: 7 травня 2012 р.