增加字段必须要有默认值
例如:
ALTER TABLE tmp_test ADD COLUMN gmt_CreateDate TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00’;
增加的字段可以指定字段顺序,需要加在哪个字段后面,用关键字
after column_name
建议表设计都设置为NOT NULL 且默认值非NULL且有默认值的字段属性,有利于提高数据比对检索的性能,更加有利于索引结构的优化
同一表增加多个字段,不分多条语句,而应只用一条变更语句
例如:
ALTER TABLE tmp_test ADD COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0;
ALTER TABLE tmp_test ADD COLUMN gmt_CreateDate TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00’;
应该改写成:
ALTER TABLE tmp_test
ADD COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0,
ADD COLUMN gmt_CreateDate TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00';
DDL操作的过程
①申请表对象加锁,只允许读不允许更新
②复制一份变更对象表的结构代码
③原数据结构基础之上修改,新建一组临时文件,MyISAM引擎和InnoDB引擎的文件有所不同,分别为:#***.frm、#***.MYD、#***.MYI, #***.frm、#***.ibd
④变更对象表中的数据写入到临时表中
⑤速度读写完毕的情况下,完全锁定被变更的表,并且删除被变更表
⑥对临时文件执行RENAME操作
⑦刷新数据字典信息
⑧释放锁
调整的SESSION变量
①建议增加SESSION级别的sort_buffer_size 值,以加速DDL过程需要做的排序操作;
②建议增加SESSION级别的read_buffer_size 值,增加顺序读的速度;
③建议增加SESSION级别的tmp_table_size 和max_heap_table_size值,增加内存缓存数据的能力;
④若是存在InnoDB引擎转MyISAM的操作,建议在线增加key_buffer_size的值,增加索引数据的缓存能力;
M-M 复制架构,只有一台提供全部或主数据服务
推荐DDL语句,在当下M-M架构中属于备用数据库服务器上优先执行,有四项优点:
①不立即影响数据库提供的数据服务
②不阻塞主备之间数据复制的日志恢复操作
③DDL语句执行过程,若出问题只影响备库的稳定性,而很少会影响主库
④若有数据服务无缝切换功能(例如:heartbeat、自主数据层等),可以在备库执行完成后,进行数据服务提供的主备库切换,尤其是数据容量大的表变更时,可以减少对业务影响程度及减少停机维护时间和次数
M-M-multiS复制架构
针对双主复制,外加多从模式,就要分操作类型进行了,一般原则:线上环境不删除字段,修改为兼容性的属性,
为此针对此类操作我们建议:
①IP:10.10.1.124也即中转兼备用服务器上,先执行SET sql_log_bin=0; 然后执行DDL变更;
②待上一步骤完成,再在对应的只读性质的丛库上执行DDL变更;
③待上述步骤都正常完成,再在IP:10.10.1.123服务器上执行SET sql_log_bin=0; 然后执行DDL变更;
索引优化命令执行顺序和坚持的原则:
①优先执行创建索引的语句;
②确保增加了对应的索引结构之后,再删除多余的索引;
③用户行为触发而执行频率越高的SQL命令,性能确保其性能最佳;
④数据变更类型(UPDATE OR DELETE)的SQL命令,索引可选择性优先;
数据库对象表结构的变更
①若是增加字段或字段属性值域扩大等类似操作,必须优先于应用程序发布;
②若是字段的删除操作,则等应用程序成功发布之后再执行;
③若是字段类型变更,不兼容的情况下,则与版本发布同一时间段内完成(注:一般是停机维护类型);
④若是涉及索引的变更,则先于应用程序发布进行增加,等应用程序成功发布上线之后,再删除多余的索引。
DML语句不允许出现@number方式替代字段名称
不合理的写法:UPDATE table_name SET @1=NOW() WHERE @2=1;
正确的写法:UPDATE table_name SET column_name1=NOW() WHERE column_name2=1;
UPDATE OR DELETE 禁用LIMIT子句
不合理的写法:UPDATE table_name SET column_name1=NOW() WHERE column_name2=1 LIMIT 1;
正确的写法:UPDATE table_name SET column_name1=NOW() WHERE column_name2=1;
INSERT语句需要写清楚值和字段对应关系
不合理的写法:INSERT INTO table_name VALUES(NOW(),DATE_ADD(NOW(),INTERVAL +1 DAY));
正确的写法:INSERT INTO table_name(gmt_create,gmt_modify) VALUES(NOW(),DATE_ADD(NOW(),INTERVAL +1 DAY));
DML语句少用不确定性函数
常见被大家使用的不确定性函数:UUID()、RAND()、SYSDATE()等函数,若无特殊用处之外,请以确定性函数替代之。
异步复制
replicate-ignore-db复制模式的注意事项
数据更新或数据结构变更的时候,必须先执行
USE db_name的方式,到目标数据库对象内再执行其他SQL语句,禁用类似:INSERT INTO db_name.tablename……语句,
这样的语句数据库不会进行复制,经过测试
sql_log_bin
MySQL5.1及以上版本支持参数:sql_log_bin,可以设置
SET SESSION sql_log_bin=0的方式,
达到修改类型的SQL语句操作不会登记到二进制日志文件中,从而可以达到不会被复制到其备库上,为解决少量主备数据不一致、复制中断,以及特殊的数据更改或数据结构变更等应用场景提供了方便;
sql_slave_skip_counter
用于跳过出错的SQL语句数量设置的参数,某些紧急情况或可忽略的错误,则可以借助此参数先恢复复制的正常运行,步骤:
①STOP SLAVE;
②SET GLOBAL sql_slave_skip_counter=N 注释:N为跳过SQL的个数,不建议盲目跳
③START SLAVE;
阅读(4255) | 评论(0) | 转发(1) |