PROCEDURE ANALYSE() 是 MySQL 內置分析工具,基於現有數據分佈,推薦最優字段類型與屬性。注意:MySQL 8.0 已移除,5.7 仍可用。
SELECT * FROM table_name PROCEDURE ANALYSE([max_elements[, max_memory]]);
max_elements:每列非重複值最大統計數,超過則不建議 ENUM(默認 256)max_memory:分析過程最大內存使用(默認 8192 字節)CREATE TABLE t_demo (
id INT,
name VARCHAR(16),
score INT
) ENGINE=InnoDB;
-- 插入測試數據
INSERT INTO t_demo VALUES
(1, 'user001', 95),
(2, 'user002', 87),
(3, 'user003', 92),
(200000, 'user999', 78);
-- 執行分析
SELECT * FROM t_demo PROCEDURE ANALYSE(4);
| 列名 | 含義 | 示例值 |
|---|---|---|
| Field_name | 表名.字段名 | test.t_demo.id |
| Min_value / Max_value | 最小/最大值 | 1 / 200000 |
| Min_length / Max_length | 值字符串長度範圍 | 1 / 6 |
| Empties_or_zeros | 空值/零值計數 | 0 |
| Nulls | NULL 值計數 | 0 |
| Avg_value_or_avg_length | 平均值/平均長度 | 100000.5 |
| Std | 標準差 | 116099.28 |
| Optimal_fieldtype | 推薦最優類型 | MEDIUMINT(6) UNSIGNED NOT NULL |
+---------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+-------------+--------------------------------+ | Field_name | Min_value | Max_value | Min_length | Max_length | Empties_or_zeros | Nulls | Avg_value_or_avg_length | Std | Optimal_fieldtype | +---------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+-------------+--------------------------------+ | test.t_demo.id | 1 | 200000 | 1 | 6 | 0 | 0 | 100000.5000 | 116099.2790 | MEDIUMINT(6) UNSIGNED NOT NULL | | test.t_demo.name | user001 | user999 | 8 | 8 | 0 | 0 | 8.0000 | NULL | CHAR(8) NOT NULL | | test.t_demo.score | 78 | 95 | 2 | 2 | 0 | 0 | 88.0000 | 7.4833 | TINYINT(3) UNSIGNED NOT NULL | +---------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+-------------+--------------------------------+
max_elements 限制防止過多枚舉值,但 ENUM 修改結構昂貴MySQL 8.0 移除 PROCEDURE ANALYSE(),可用:
information_schema.COLUMNS 統計字段分佈自行分析pt-table-checksum/pt-online-schema-change