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注入等问题
- 避免数据类型的隐士转换
- 隐士转换会导致索引失效
- 充分使用表上已经存在的索引, 避免使用双%号的查询条件
- 程序连接不同的数据库使用不同的账号, 禁止跨库查询
- 禁止使用SELECT *来查询
- 消耗更多的CPUI和IO以及网络带宽资源
- 无法使用覆盖索引
- 可减少表结构变更带来的影响
- 禁止使用不含字段列表的INSERT语句
- 禁止使用子查询, 可以把子查询优化为join操作
- 避免使用JOIN关联太多的表
- MySQL最多允许关联61个表, 建议不超过5个
- 减少同数据库的交互操作
- 数据库更适合处理批量操作
- 禁止使用order by rand()进行随机排序
- 会把表中符合条件的数据装在到内存中进行排序
- 会消耗大量的CPU和IO以及内存资源
- 建议在程序中获取一个随机值, 然后从数据库中获取数据的方式
- WHERE从句中禁止对列进行函数转换和计算
- 拆分复杂的大SQL为多个小SQL
- MySQL一个SQL只能使用一个CPU进行计算
- SQL拆分后可以提高效率
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Docker应用:容器间通信与Mariadb数据库主从复制
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 第326天
- Shell-Bash变量与运算符
- 逻辑回归的理解与python示例
- Guava|Guava RateLimiter与限流算法
- 我和你之前距离
- CGI,FastCGI,PHP-CGI与PHP-FPM
- 原生家庭之痛与超越