MySql与数据库设计规范

1. 用Homebrew进行安装

brew install mysql

一直等到出现
We've installed your MySQL database without a root password. To secure it run: mysql_secure_installationMySQL is configured to only allow connections from localhost by defaultTo connect run: mysql -urootTo have launchd start mysql now and restart at login: brew services start mysql Or, if you don't want/need a background service you can just run: mysql.server start

安装成功.
2. 对数据库进行初始化配置
  • 启动服务
mysql.server start

  • 初始化配置
mysql_secure_installation

根据提示进行数据库的配置
是否需要配置密码
Press y|Y for Yes, any other key for No: // 选择Y则需要配置8位数的密码

输入Y以后, 可以看到提示
LOWLength >= 8// 长度大于等于8就可以 MEDIUM Length >= 8, numeric, mixed case, and special characters // 长度大于8数字、混合大小写和特殊字符 STRONG Length >= 8, numeric, mixed case, special characters and dictionary//长度>= 8,数字,混合大小写,特殊字符和字典 file Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:

这里根据你的要求输入0 , 1 , 2就可以
然后会提示你输入密码
Please set the password for root here.New password:

然后确认密码:
Re-enter new password:

如果密码输入的不符合要求, 会这样提示
Estimated strength of the password: 25 Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y ... Failed! Error: Your password does not satisfy the current policy requirements

当密码设置成功以后
是否移除不用密码的那个账户
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment.Remove anonymous users? (Press y|Y for Yes, any other key for No) : //是否移除不用密码的那个账户

输入
Y

是否禁止远程登录
Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network.Disallow root login remotely? (Press y|Y for Yes, any other key for No) : // 是否禁止远程登录

输入
N

是否删除test库
By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment.Remove test database and access to it? (Press y|Y for Yes, any other key for No) : // 是否删除test库

输入
Y

是否重新加载
Reloading the privilege tables will ensure that all changes made so far will take effect immediately.Reload privilege tables now? (Press y|Y for Yes, any other key for No) : // 是否重新加载

输入
Y

回车以后就可以看到
All done!

登录数据库
mysql -uroot -p

输入刚刚的密码, 就能够登录上现在的数据库了.
【MySql与数据库设计规范】数据库服务
启动:brew services start mysql停止:brew services stop mysql

数据库设计规范 数据库命名规范
  • 所有数据库对象名称必须使用小写字母并用下划线分割
  • 所有数据库名称禁止使用MySQL保留关键字
  • 数据库对象的命名要做到见名知义, 并且不要超过32个字符
  • 临时库表必须以temp为前缀, 并且以日期为后缀
  • 备份库, 备份表必须以bak为前缀并以日期为后缀
  • 所有存储想同数据的列名和列类型必须一致
数据库基本设计类型
  • 所有表必须使用InnoDB存储引擎
    • mysql5.6版本以后InnoDB为默认引擎
    • 支持事务, 行级锁, 更好的恢复性, 高并发下性能更好
  • 数据库和表的字符集统一使用UTF8, 如果存储表情, 需要UTF8的扩展
    • 可以避免字符集的乱码问题
  • 所有的表和字段都需要添加注释
    • 防止数据库字典的维护, 防止人员流失导致不知是啥
  • 尽量控制单表数据量的大小, 建议控制在500万以内
    • 500万并不是MySQL数据库的限制, MySQL并为对大小做限制
  • 谨慎的使用MySQL分区表
    • 分区表在物理上表现为多个文件, 在逻辑上表现为1个表, 查询效率会降低
    • 建议使用物理分表
  • 尽量做到冷热数据分离, 减小表的宽度
    • 减少磁盘IO, 保证热数据的内存缓存命中率
    • 利用更有效的利用缓存, 避免读入无用的冷数据
    • MySQL最多4096列
  • 禁止预留字段
  • 禁止在数据库中存储图片/文件等二进制文件
  • 禁止在线上数据库做压力测试
  • 禁止从开发/测试环境直接连接线上数据库
索引设计规范
  • 限制单张表上的索引数量, 单张表索引不超过5个
    • 索引可以提高效率, 同事降低插入效率
    • 禁止给表中的每一列都建立单独的索引
  • 每个InnoDB表必须有一个主键
    • 如果没有主键, 那么会以第一个非空字段为主键
    • 不能使用更新频繁的列作为主键, 不使用多列主键
    • 不使用UUID, MD5, HASH, 字符串列为主键
    • 主键建议使用自增ID值
  • 常见索引列建议
    • 在SELECT, UPDATE, DELETE等语句的WHERE从句中的列作为索引
    • 包含在ORDER BY, GROUP BY, DISTINCT中的字段
    • 多表JOIN的关联列
    • 一般建立一个联合索引, 效率更高
  • 如何使用索引列的顺序(MySQL从左到右)
    • 区分度最高的列放在联合索引在最左侧
    • 尽量把字段长度小的列放在联合索引的最左侧
    • 使用最频繁的列放到联合索引的左侧
  • 避免建立冗余索引和重复索引, 主键就是一个唯一, 非空的索引
  • 对于频繁的查询优先考虑使用覆盖索引
    • 覆盖索引: 就是包含了所有查询字段的索引
    • 避免了InnoDB表进行索引的二次查找
    • 可以把随机IO变为顺序IO加快查询效率
  • 避免使用外键
    • 降低写的性能
    • 建议在业务端实现
数据库字段设计规范
  • 优先选择符合存储需要的最小的数据类型
    • 尽量将字符串转化为数字类型存储, 比如IP地址, 使用INET_ATON将字符串转成整型, 使用INET_NTOA将整型转化为字符串
    • 对于非负数据采用无符号整型进行存储
    • VARCHAR(N)中N代表的是字符数, 而不是字节数, 使用UTF8存储汉字VARCHAR(255)=765个字节
    • 过大的长度会消耗更多的内存
  • 避免使用TEXT, BLOB数据类型
  • 避免使用ENUM数据类型
  • 尽量把所有的列定义为NOT NULL
    • 索引NULL列需要额外空间来保存
    • 进行比较和计算时, NULL需要额外处理
  • 禁止使用使用字符串存储日期
    • 使用TIMESTAMP(4个字节)或DATETIME(8个字节)类型
  • 财务相关的必须使用Decimal类型
数据库SQL开发规范
  • 建议使用预编译语句进行数据库操作, 防止sql注入等问题
  • 避免数据类型的隐士转换
    • 隐士转换会导致索引失效
  • 充分使用表上已经存在的索引, 避免使用双%号的查询条件
  • 程序连接不同的数据库使用不同的账号, 禁止跨库查询
  • 禁止使用SELECT *来查询
    • 消耗更多的CPUI和IO以及网络带宽资源
    • 无法使用覆盖索引
    • 可减少表结构变更带来的影响
  • 禁止使用不含字段列表的INSERT语句
  • 禁止使用子查询, 可以把子查询优化为join操作
  • 避免使用JOIN关联太多的表
    • MySQL最多允许关联61个表, 建议不超过5个
  • 减少同数据库的交互操作
    • 数据库更适合处理批量操作
  • 禁止使用order by rand()进行随机排序
    • 会把表中符合条件的数据装在到内存中进行排序
    • 会消耗大量的CPU和IO以及内存资源
    • 建议在程序中获取一个随机值, 然后从数据库中获取数据的方式
  • WHERE从句中禁止对列进行函数转换和计算
  • 拆分复杂的大SQL为多个小SQL
    • MySQL一个SQL只能使用一个CPU进行计算
    • SQL拆分后可以提高效率

    推荐阅读