龙空技术网

探究数据库修改表字段时产生的效率差异,欢迎大家提出意见

银行小马农的日常 155

前言:

今天你们对“mysql新增字段设置默认值”可能比较着重,各位老铁们都需要剖析一些“mysql新增字段设置默认值”的相关内容。那么小编在网上汇集了一些对于“mysql新增字段设置默认值””的相关知识,希望同学们能喜欢,小伙伴们快快来学习一下吧!

MySQL常用的修改表字段,一般来说有三种写法:

1、修改字段的默认值情况,可以使用alter table ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

2、 修改字段的名称,同时修改类型,可以使用alter table CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]

3、只修改字段的类型 可以使用alter table MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]

但在修改默认值时,如果采用了modify的语法,将产生巨大的消耗,模拟过程如下所示:

1. mysql> create table payment_test select * from sakila.payment;2. 3. mysql> alter table payment_test MODIFY amount decimal(6,2) NOT NULL DEFAULT 4.22;4. Query OK, 16049 rows affected (1.24 sec)5. Records: 16049 Duplicates: 0 Warnings: 06. --实际上发生了大量的读写操作7. mysql> SHOW STATUS WHERE Variable_name LIKE'Handler%';8. +----------------------------+-------+9. | Variable_name | Value |10. +----------------------------+-------+11. | Handler_commit | 1 |12. |……………………|13. | Handler_read_rnd_next | 16050 |14. | Handler_write | 16049 |15. 16. Handler_read_rnd_next17. The number of requests to read the next row in the data file. This value is high if you are doing a lot of table scans. Generally this suggests that your tables are not properly indexed or that your queries are not written to take advantage of the indexes you have.18. 19. flush status后采用alter语句,耗时大减20. mysql> alter table payment_test alter amount set DEFAULT 4.22;21. Query OK, 0 rows affected (0.02 sec)22. Records: 0 Duplicates: 0 Warnings: 023. 24. --没有发生读写操作25. mysql> SHOW STATUS WHERE Variable_name LIKE'Handler%';26. +----------------------------+-------+27. | Variable_name | Value |28. +----------------------------+-------+29. | Handler_commit | 1 |30. |……………………|31. | Handler_read_rnd_next | 0 |32. | Handler_write | 0 |

通过查询相关资料,探究其原因可能是:

(1)表字段的默认值是放在表的frm(.frm:表结构文件.MYD:表数据文件.MYI:表索引)文件中;

(2)ALTER COLUMN会更新frm文件,而不会涉及到表的内容;

(3)MODIFY COLUMN会涉及到表数据的内容。

由此产生了效率上的巨大差异。在实际运用中,对于大表变更尤其需要注意这些细节。

最后,抛出一个问题:是否有其他的变更操作也能够采用这样的方式?可以参见《高性能MySQL 》一书,提到了几种场景,但官方并未确定,可能存在一定的安全性问题。

标签: #mysql新增字段设置默认值