PROCEDURE ANALYSE() 通过分析 select 查询结果对现有的表的每一列给出优化的建议。

语法说明

PROCEDURE ANALYSE() 的语法如下:

1
SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max_elements,[max_memory]])

max_elements (默认值256) analyze 查找每一列不同值时所需关注的最大不同值的数量。analyze 还用这个值来检查优化的数据类型是否该是ENUM,如果该列的不同值的数量超过了 max_elements 值 ENUM 就不做为建议优化的数据类型。
max_memory (默认值8192) analyze 查找每一列所有不同值时可能分配的最大的内存数量。

示例

查询一个字段

1
2
3
4
5
6
7
mysql> select stepType from crmTradeSmsFlowStep procedure analyse(); 
.+----------------------------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+----------+-------------------------------------------------------------------------------------------------------------------+
| Field_name | Min_value | Max_value | Min_length | Max_length | Empties_or_zeros | Nulls | Avg_value_or_avg_length | Std | Optimal_fieldtype |
+----------------------------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+----------+-------------------------------------------------------------------------------------------------------------------+
| crm.crmTradeSmsFlowStep.stepType | 10 | 450 | 2 | 3 | 0 | 0 | 284.0072 | 181.4181 | ENUM('10','40','60','110','130','140','160','220','250','270','320','330','340','360','400','420','450') NOT NULL |
+----------------------------------+-----------+-----------+------------+------------+------------------+-------+-------------------------+----------+-------------------------------------------------------------------------------------------------------------------+
1 row in set (0.17 sec)

stepType 目前为 int 类型,上面的结果,建议改为 ENUM(‘10’,’40’,’60’,’110’,’130’,’140’,’160’,’220’,’250’,’270’,’320’,’330’,’340’,’360’,’400’,’420’,’450’) NOT NULL

全表查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> select * from crmTradeSmsFlowStep procedure analyse();
+---------------------------------------------+------------------+-------------------+------------+------------+------------------+--------+-------------------------+--------------+-------------------------------------------------------------------------------------------------------------------+
| Field_name | Min_value | Max_value | Min_length | Max_length | Empties_or_zeros | Nulls | Avg_value_or_avg_length | Std | Optimal_fieldtype |
+---------------------------------------------+------------------+-------------------+------------+------------+------------------+--------+-------------------------+--------------+-------------------------------------------------------------------------------------------------------------------+
| crm.crmTradeSmsFlowStep.tradeSFSID | 1 | 376962 | 1 | 6 | 0 | 0 | 188481.5000 | 217740.6281 | MEDIUMINT(6) UNSIGNED NOT NULL |
| crm.crmTradeSmsFlowStep.shopID | 1 | 6 | 1 | 1 | 0 | 0 | 2.9401 | 1.6544 | ENUM('1','2','3','5','6') NOT NULL |
| crm.crmTradeSmsFlowStep.memberID | 1 | 388 | 1 | 3 | 0 | 148496 | 16.8742 | 12.7759 | SMALLINT(3) UNSIGNED |
| crm.crmTradeSmsFlowStep.tid | 7041333954030634 | 38963331550441785 | 16 | 17 | 0 | 0 | 17198890865242.2950 | 0.0000 | BIGINT(17) UNSIGNED NOT NULL |
| crm.crmTradeSmsFlowStep.messageTopicQueueID | 2 | 1402014 | 1 | 7 | 0 | 193 | 1562.5533 | 37735.0148 | MEDIUMINT(7) UNSIGNED |
| crm.crmTradeSmsFlowStep.smsType | 2 | 131 | 1 | 3 | 0 | 376769 | 3.6632 | 9.2437 | ENUM('2','4','131') |
| crm.crmTradeSmsFlowStep.stepType | 10 | 450 | 2 | 3 | 0 | 0 | 284.0072 | 181.4181 | ENUM('10','40','60','110','130','140','160','220','250','270','320','330','340','360','400','420','450') NOT NULL |
| crm.crmTradeSmsFlowStep.stepTime | 1499233308 | 1504141200 | 10 | 10 | 0 | 0 | 1499249509.7180 | 2122583.3568 | INT(10) UNSIGNED NOT NULL |
| crm.crmTradeSmsFlowStep.stepOutType | 1 | 2 | 1 | 1 | 0 | 0 | 1.9995 | 0.0226 | ENUM('1','2') NOT NULL |
| crm.crmTradeSmsFlowStep.stepOutID | 1 | 193 | 1 | 3 | 0 | 0 | 11.0440 | 2.3182 | TINYINT(3) UNSIGNED NOT NULL |
| crm.crmTradeSmsFlowStep.created | 1504088017 | 1504171900 | 10 | 10 | 0 | 0 | 1504142055.8102 | 4260253.8171 | INT(10) UNSIGNED NOT NULL |
| crm.crmTradeSmsFlowStep.modified | 1504171916 | 1504171916 | 10 | 10 | 0 | 376961 | 1504171916.0000 | 0.0000 | ENUM('1504171916') |
+---------------------------------------------+------------------+-------------------+------------+------------+------------------+--------+-------------------------+--------------+-------------------------------------------------------------------------------------------------------------------+
12 rows in set (0.42 sec)

根据实际数据来决定是否采用建议

  1. PROCEDURE ANALYSE() 会让 MySQL 帮你去分析你的字段和其实际的数据,并会给你一些有用的建议。
  2. 只有表中有实际的数据,这些建议才会变得有用,而且具有代表性的数据越全越好。
  3. 例如上面的例子。
    1. 针对字段 stepType,给出建议是 ENUM(‘10’,’40’,’60’,’110’,’130’,’140’,’160’,’220’,’250’,’270’,’320’,’330’,’340’,’360’,’400’,’420’,’450’) NOT NULL, 如果这里列出的值还没有覆盖到业务的所有类型,那就是不准确的,这个需要自己根据业务数据做适当的修改,将不全的部分补上。
    2. modified,这个字段保存记录修改时间。由于这个表需要修改的场景不多,所以,测试数据只有一条记录有值,没有修改的记录,modified 为空,所以,PROCEDURE ANALYSE() 给出的建议也是不准的。
  4. 一定要注意,PROCEDURE ANALYSE() 结果,只是建议,可以参考,只有当你的表里的数据越来越多时,这些建议才会变得准确。你自己要能判断哪些是准确的哪些是不准确的,最终,只有你自己才能做出更合理的判断。