标签 mysql 下的文章

阿里巴巴MySQL规范(黄山版)

规范内容取自“阿里巴巴MySQL规范”(黄山版),发布时间为2022.2.3,开源。

第一部分:建表规范

【强制】规范一:是否字段

  1. 表达是否概念的字段,必须使用 is_xxx 的形式命名;
  2. 数据类型必须是 unsigned tinyint
  3. 1表示是,0表示否;

举例:是否删除

正确:使用is_deleted,1表示删除,0表示未删除

错误:deleted, if_deleted, delete_or_not

- 阅读剩余部分 -

为什么不推荐使用外键?

阿里的开发手册中提到:【强制】不得使用外键与级联,一切外键概念必须在应用层解决。

外键和主键一样,都是一种约束,外键约束也称为引用约束或引用完整性约束:

  • 外键列必须引用另一个表中的主键或唯一键列
  • 外键列必须满足引用完整性,也就是说,它们包含的值必须存在于被引用表的主键或唯一键列中

定义外键之后,数据库的每次操作都需要去检查外键约束。对于插入来说,影响了插入速度;对于更新来说,级联更新是强阻塞,存在数据库更新风暴(Database Update Storm)的风险。

所谓 Database Update Storm,指的是在高并发环境下,多个客户端同时对数据库进行大量的更新操作,存在锁竞争问题甚至死锁,从而导致数据库性能急剧下降或完全崩溃。

另外,当数据量非常大的时候,常见手段是分库分表,但外键通常难以跨越不同数据库来建立联系,数据的一致性更难维护。

因此,外键与级联并不适合分布式、高并发集群,但单机低并发业务可以考虑使用外键保证一致性和完整性。

MySQL-避免密码明文写入shell脚本

日常编写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.

解决方法:

  1. 使用 defaults-extra-file 选项

    defaults-extra-file 是 mysql 命令的一个选项,它允许你指定一个包含额外配置信息的配置文件,对于在执行mysql命令时提供一些额外的配置非常有用。

- 阅读剩余部分 -

MySQL中的sql_mode

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 对比

MySQL 和 PostgreSQL 是两个广泛使用的关系型数据库管理系统(RDBMS)。它们都具有强大的功能和广泛的社区支持,但在某些方面存在一些差异。本文将详细比较 MySQL 和 PostgreSQL,包括它们的特点、性能、扩展性、安全性以及适用场景等方面。

2023-08-04T12:15:32.png

- 阅读剩余部分 -

MySQL使用sql语句快速复制表和数据

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;