-- 对比测试脚本 DELIMITER // CREATEPROCEDURE benchmark_inserts() BEGIN DECLARE i INTDEFAULT1; SET@start= NOW(); WHILE i <=100000 DO INSERTINTO test_myisam (col1, col2, col3) VALUES (CONCAT('test', i), i, RAND() *100); SET i = i +1; END WHILE; SET@end= NOW(); SELECT TIMESTAMPDIFF(MICROSECOND, @start, @end) AS'Time (microseconds)'; END// DELIMITER ;
3.2 索引对比
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-- B-Tree索引: 两者都支持 CREATE INDEX idx_name ON users(name);
-- 全文索引 -- MyISAM CREATE FULLTEXT INDEX ft_name ON myisam_table(name);
-- InnoDB (MySQL 5.6+) CREATE FULLTEXT INDEX ft_name ON innodb_table(name);
graph TD A{需要事务支持?} -->|是| B[选择InnoDB] A -->|否| C{读多写少?} C -->|是| D{需要全文索引?} C -->|否| E[选择InnoDB] D -->|是| F{MySQL 5.6+?} D -->|否| G[选择InnoDB] F -->|是| H[选择InnoDB] F -->|否| I[选择MyISAM] E --> J[并发性能重要] J --> K[选择InnoDB]
# 创建测试表 mysql -u root -p <<EOF CREATE DATABASE IF NOT EXISTS benchmark_test; USE benchmark_test; -- MyISAM测试表 CREATE TABLE IF NOT EXISTS test_myisam ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), age INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=MyISAM; -- InnoDB测试表 CREATE TABLE IF NOT EXISTS test_innodb ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), age INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB; EOF
echo"1. Insert性能测试..." time mysql -u root -p benchmark_test -e " DELIMITER // PROCEDURE insert_test() BEGIN DECLARE i INT DEFAULT 1; WHILE i <= 10000 DO INSERT INTO test_myisam (name, age) VALUES (CONCAT('user', i), i % 100); SET i = i + 1; END WHILE; END // DELIMITER ; CALL insert_test(); "
echo"2. 查询性能测试..." time mysql -u root -p benchmark_test -e "SELECT * FROM test_myisam WHERE age > 50;" > /dev/null
-- 步骤4: 验证 SHOWTABLE STATUS FROM database_name LIKE'table_name'; SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_NAME ='table_name';
-- 步骤5: 优化新引擎 OPTIMIZE TABLE table_name;
-- 批量迁移脚本 SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' ENGINE=InnoDB;') AS command FROM information_schema.TABLES WHERE TABLE_SCHEMA ='database_name' AND ENGINE ='MyISAM' AND TABLE_TYPE ='BASE TABLE';
mysql -u root -p <<EOF -- 1. 引擎使用统计 SELECT ENGINE AS '存储引擎', COUNT(*) AS '表数量', ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS '总大小(MB)', ROUND(AVG(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS '平均大小(MB)' FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_TYPE = 'BASE TABLE' GROUP BY ENGINE ORDER BY SUM(DATA_LENGTH + INDEX_LENGTH) DESC; -- 2. InnoDB性能指标 SELECT VARIABLE_NAME AS '指标', VARIABLE_VALUE AS '值' FROM performance_schema.global_status WHERE VARIABLE_NAME LIKE 'Innodb%' AND (VARIABLE_NAME LIKE '%pool%' OR VARIABLE_NAME LIKE '%row%') ORDER BY VARIABLE_NAME; -- 3. MyISAM性能指标 SELECT VARIABLE_NAME AS '指标', VARIABLE_VALUE AS '值' FROM performance_schema.global_status WHERE VARIABLE_NAME LIKE 'key%' OR VARIABLE_NAME LIKE 'Created%' ORDER BY VARIABLE_NAME; EOF