阿里巴巴MySQL规范(黄山版)
规范内容取自“阿里巴巴MySQL规范”(黄山版),发布时间为2022.2.3,开源。
第一部分:建表规范
【强制】规范一:是否字段
- 表达是否概念的字段,必须使用
is_xxx
的形式命名; - 数据类型必须是
unsigned tinyint
; - 1表示是,0表示否;
举例:是否删除
正确:使用is_deleted,1表示删除,0表示未删除
错误:deleted, if_deleted, delete_or_not
规范内容取自“阿里巴巴MySQL规范”(黄山版),发布时间为2022.2.3,开源。
【强制】规范一:是否字段
is_xxx
的形式命名;unsigned tinyint
;举例:是否删除
正确:使用is_deleted,1表示删除,0表示未删除
错误:deleted, if_deleted, delete_or_not
阿里的开发手册中提到:【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
外键和主键一样,都是一种约束,外键约束也称为引用约束或引用完整性约束:
定义外键之后,数据库的每次操作都需要去检查外键约束。对于插入来说,影响了插入速度;对于更新来说,级联更新是强阻塞,存在数据库更新风暴(Database Update Storm
)的风险。
所谓 Database Update Storm
,指的是在高并发环境下,多个客户端同时对数据库进行大量的更新操作,存在锁竞争问题甚至死锁,从而导致数据库性能急剧下降或完全崩溃。
另外,当数据量非常大的时候,常见手段是分库分表,但外键通常难以跨越不同数据库来建立联系,数据的一致性更难维护。
因此,外键与级联并不适合分布式、高并发集群,但单机低并发业务可以考虑使用外键保证一致性和完整性。
日常编写mysql脚本时常用命令:mysql -h${mysql_host} -P${mysql_port} -u${mysql_user} -p${mysql_password} ${mysql_dbname} -e "source ./sql/sql1.sql"
命令行将提示:Warning: Using a password on the command line interface can be insecure.
解决方法:
使用 defaults-extra-file
选项
defaults-extra-file 是 mysql 命令的一个选项,它允许你指定一个包含额外配置信息的配置文件,对于在执行mysql命令时提供一些额外的配置非常有用。
sql_mode 是 MySQL 数据库中的一个参数,用于设置 SQL 执行的模式。它定义了 MySQL 在执行 SQL 语句时的行为和规则。通过设置不同的 sql_mode 值,可以改变 MySQL 的默认行为,从而提供更严格或更宽松的 SQL 语义。
sql_mode 可以影响以下方面:
NULL 值处理:控制 MySQL 对待 NULL 值的方式,如是否允许插入 NULL 值、NULL 值的比较规则等。
严格模式:控制 MySQL 是否执行严格的数据校验,如插入的值是否符合列定义、是否允许插入不完整的日期或日期时间等。
零值处理:控制 MySQL 对待零值的方式,如是否允许插入零值、零值的比较规则等。
日期处理:控制 MySQL 对日期的处理方式,如是否允许插入无效的日期、日期的比较规则等。
字符集处理:控制 MySQL 如何处理字符集和排序规则,如是否区分大小写、是否允许存储非 Unicode 字符等。
自增列:控制 MySQL 对自增列的处理方式,如插入时是否需要指定自增列的值。
MySQL 和 PostgreSQL 是两个广泛使用的关系型数据库管理系统(RDBMS)。它们都具有强大的功能和广泛的社区支持,但在某些方面存在一些差异。本文将详细比较 MySQL 和 PostgreSQL,包括它们的特点、性能、扩展性、安全性以及适用场景等方面。
阿里云标准-Mysql安全基线检查
1. [中危]
修改默认3306端口 服务配置
描述
避免使用熟知的端口,降低被初级扫描的风险
加固建议
编辑<conf_path>/my.cnf文件,[mysqld] 段落中配置新的端口参数,并重启MySQL服务:
port=3506
MySQL使用sql语句快速复制表和数据
复制表结构
使用like:create table newName like oldName;
使用子查询:create table newName select * from oldName where 1=2;
复制表结构及数据create table newName select * from oldName;
复制数据到新表
两个表结构一致:insert into newName select * from oldName where id>xx;
两个表结构不同:insert into newName(field1, field2, ...) select field1, field2, ... from oldName;