# 1.核心军规
### 1.1尽量不在数据库做运算
* 尽量不在数据库做运算
* 复杂运算到程序端CPU
* 举例: md5() / Order by Rand()不要出现
### 1.2控制单表数据量
* 纯INT不超1000W
* 含CHAR不超500W
* 建议单库不超过300-400个表
### 1.3保持表身段苗条
* 表字段数少而精
* 单表字段数上限控制在20~50个
### 1.4平衡范式与冗余
* 没有绝对的对与错
* 适当时牺牲范式、加入冗余
* 但会增加代码复杂度
### 1.5拒绝3B
* 大SQL (BIG SQL)
* 大事务 (BIG Transaction)
* 大批量 (BIG Batch)
# 2.字段类军规
### 2.1用好数值字段类型
* TINYINT(1Byte)
* SMALLINT(2B)
* MEDIUMINT(3B)
* INT(4B)、BIGINT(8B)
* DECIMAL(M,D)
### 2.2将字符转化为数字
* 数字型VS字符串型索引,更高效,查询更快
* 举例:用无符号INT存储IP,而非CHAR(15)
### 2.3优先使用ENUM或SET
* ENUM占用1字节,转为数值运算
* SET视节点定,最多占用8字节
* 比较时需要加‘ 单引号(即使是数值
### 2.4避免使用NULL字段
* 很难进行查询优化
### 2.5少用并拆分TEXT/BLOB
* TEXT类型处理性能远低亍VARCHAR
* 若必须使用则拆分到单独的表
### 2.6不在数据库里存图片
# 3.索引类军规
### 3.1谨慎合理添加索引
* 索引不是越多越好
### 3.2字符字段必须建前缀索引
### 3.3不在索引列做运算
* 无法使用索引
* 导致全表扫描
### 3.4自增列或全局ID做INNODB主键
### 3.5尽量不用外键
* 高并发时容易死锁
* 由程序保证约束
# 4.SQL类军规
### 4.1SQL语句尽可能简单
* 拒绝大SQL,拆解成多条简单SQL
* 减少锁表时间,特别是MyISAM
### 4.2保持事务(连接)短小
* 事务/连接使用原则:即开即用,用完即关
* 不破坏一致性前提下,使用多个短事务代替长事务
### 4.3尽可能避免使用SP/TRIG/FUNC
* 尽可能少用触发器
* 尽可能少用存储过程
* 减用使用MySQL凼数对结果进行处理
* 由客户端程序负责
### 4.4尽量不用 SELECT *
* 更安全的设计:减少表变化带来的影响
* 特别是有TEXT/BLOB时
### 4.5改写OR为IN()
* 注意控制IN的个数,建议n小亍200
### 4.6改写OR为UNION
* 减少对不同字段进行 "or" 查询
### 4.7避免负向查询和% 前缀模糊查询
* 避免负向查询
【NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、
NOT LIKE】等
* 避免 % 前缀模糊查询
,使用不了索引,导致全表扫描
### 4.8减少COUNT(*)
* COUNT(*)的资源开销大,尽量少用
* 尽量用单独统计表,定期重算
### 4.9LIMIT高效分页
* 推荐分页一:
Select * from table WHERE id>=23423 limit 11;
* 分页方式二:
Select * from table WHERE id >= ( select id
from table limit 10000,1 ) limit 10;
* 分页方式三:
SELECT * FROM table INNER JOIN (SELECT id
FROM table LIMIT 10000,10) USING (id) ;
* 分页方式四:
程序取ID:select id from table limit 10000,10;
Select * from table WHERE id in (123,456…) ;
### 4.10用UNION ALL 而非 UNION
* UNION有去重开销
* 若无需对结果进行去重,则用UNION ALL
### 4.11分解联接保证高并发
* 高并发DB不建议进行两个表以上的JOIN
### 4.12GROUP BY 去除排序
* GROUP BY 实现分组自动排序
* 无需排序:Order by NULL
* 特定排序:Group by DESC/ASC
### 4.13同数据类型的列值比较
* 原则:数字对数字,字符对字符
### 4.14Load data 导数据
* 批量数据快导入:Load data比insert快约20倍
* 尽量丌用 INSERT ... SELECT
### 4.15打散大批量更新
* 大批量更新凌晨操作,避开高峰
* 白天上限默认为100条/秒(特殊再议)
# 5.约定类军规
### 5.1隔离线上线下
* 开发无线上库操作权限
* 原则:线上连线上,线下连线下
### 5.2禁止未经DBA确认的子查询
### 5.3永远不在程序端显式加锁
永远不在程序端对数据库显式加锁
高幵发时是灾难
,极难调试和排查
并发扣款等一致性问题,采用事务
,相对值修改
,Commit前二次较验冲突
### 5.4统一字符集为UTF8
* 校对规则:utf8_general_ci
### 5.5统一命名规范
* 库表等名称统一用小写
* 索引命名默认为“idx_字段名”
* 注意避免用保留字命名
- GitHub---资源收集
- 【GitHub】收录总榜单
- 【Office & Markdown & PDF】资源收集
- 【前端】资源收集
- 【开源项目】资源收集
- 【代码备份】资源收集
- 【代码加密】资源收集
- 【好文章推荐】资源收集
- GitHub---实践方案
- 【Laradock】实践方案
- 【开发规范】实践方案
- 【laravel-snappy】实践方案
- 【队列---Laravel-Horizon 】实践方案
- 【检索---Elasticsearch】实践方案---简单了解
- 【Laravel-admin】实践方案
- 技术选型
- 技术选型结果
- PHP开发流程
- Laravel自带异常
- 技术选型问题 & 解决方法
- 修改(Admin)文件夹路径
- 两个用户表合并
- 创建Token,获取接口数据
- CreateFreshApiToken中间件使用
- Generator从表生成文件,不包括迁移文件
- 添加用户的同时生产令牌
- 其它参考文章
- Laravel-admin常见问题
- form(),show()获取对象数据
- Form右上角按钮重写
- form回调中的错误提醒,回调传参
- 【小工具类】实践方案
- 字符串
- 数组
- 无限级分类递归
- 时间
- 正则表达式
- 文件
- 经纬度、时区
- DataEdit快捷操作类库
- 数据库表结构管理
- 【Guzzle】实践方案---工具类
- Java---大数据在线实验
- 基础实验操作
- 【一】基础操作实验
- HDFS
- 【二】部署HDFS
- 【三】读写HDFS文件
- YARN
- 【四】部署YARN集群
- MapReduce
- 【五】单词计数
- Hive
- 【十】部署Hive
- 【十一】新建Hive表
- 【十二】Hive分区
- ZooKeeper
- 【二十】部署ZooKeeper
- 【二十一】进程协作
- HBase
- 【二十二】部署HBase
- 【二十三】新建HBase表
- Storm
- 【二十四】部署Storm
- 【二十五】实时WordCountTopology
- Kafka
- 【二十七】Kafka订阅推送示例
- Redis
- 【二十九】Redis部署与简单使用
- 【三十】MapReduce与Spark读写Redis
- MongoDB
- 【三十一】读写MongoDB
- MySQL
- 关于最重要的参数选项调整建议
- 索引,Explain优化工具
- 事务级别
- sql好的书写习惯
- limit(分页)
- 赶集网Mysql36条军规
- 分库分表技术演进&最佳实践
- MariaDB 和 MySQL 全面对比
- 永远不要在 MySQL 中使用“utf8”
- 看云--推荐的Mysql优化
- 完整、详细的MySQL规范
- 慢查询日志
- pt-query-digest结果分析
- Redis
- 看云-推荐的redis学习
- Memcache和Redis不同
- 阿里云Redis开发规范
- Centos7
- 虚拟机配置网络
- 硬盘挂载、分区、文件大小
- 防火墙(firewalld、firewalld-cmd、systemctl、iptables)
- 两个机器互相拷贝文件
- 查进程、查端口
- 压缩、解压
- 查看物理CPU个数、CPU内核数、线程数
- apt-get源--阿里
- RAID磁盘阵列
- Docker
- Dockerfile制作常用命令
- registry私有仓库
- PHP_7.2
- Dockerfile
- php.ini
- 使用说明
- Nginx_1.15
- Dockerfile
- nginx.conf
- prod_nginx.conf
- 使用说明
- MySql_5.7
- Dockerfile
- my.cnf
- 使用说明
- redmine_3.4
- Dockerfile
- 使用说明
- gitlab-ce_11.9.6-ce.0
- 使用说明
- Redis_5.0
- Dockerfile
- redis.conf
- 使用说明
- Jenkins
- Dockerfile
- 使用说明
- webssh--python3.7
- Dockerfile
- 使用说明
- 进阶使用
- 高阶使用
- minio
- 使用说明
- aws_cloud9_ide
- 使用说明
- VNC
- 使用说明
- jdk1.8——yum安装
- tomcat9——安装
- guacamole——0.9.13
- libreoffice
- Dockerfile
- 使用说明
- Kubernetes
- kubectl常用命令
- 环境搭建(1.9.6)
- kubernetes1.9.6墙内离线部署
- kubernetes1.9.6单机器部署
- helm安装
- helm常用命令
- Swoole
- 环境的搭建
- swoole的简单实例
- 服务端的cli方式运行
- 客户端的运行方式
- 定时任务的入门
- 删除定时任务
- 初始化定时任务
- 日志管理
- 具体任务的异常捕获
- 手动重启shell脚本
- 阅读感受
- 【读书】登天的感觉——岳晓东
- 【读书】为何家会伤人——武志红
- 【感受】箭扣,一次就好
- 【读书】思考与致富——拿破仑-希尔
- 【感受】做事讲方法
- 【感受】未来畅想
- 【素材】智力问答
- 【百家】曾国藩家训
- 【百家】正说和珅
- 【感受】谈判小技巧
- 【读书】股票作手回忆录——利弗莫尔
- 【感受】最幸福的人——工匠
- 【收藏】土味情话大合集
- 【读书】解忧杂货店——东野圭吾
- 【收藏】家乡名人
- 【读书】把时间当作朋友——李笑来
- 【感受】舆论和八卦
- 【读书】老人与海——海明威
- 【读书】必然——凯文凯利
- 【经典】逍遥游——庄周
- Git+PHPStorm+Composer
- Git命令
- .gitignore忽略规则
- PHPStorm第一次使用
- PHPStorm关联gitlab
- Composer修改镜像源
- Xdebug
- PHP进阶
- 缓存在高并发场景下的常见问题
- 一、缓存一致性问题
- 二、缓存并发问题
- 三、缓存穿透问题
- 四、缓存颠簸问题
- 五、缓存的雪崩现象
- 六、缓存无底洞现象
- Laravel源码解析(知识点)
- 闭包、IOC容器服务绑定延迟加载
- 延迟静态绑定基类
- 反射,依赖注入
- __callStatic 魔术方法,Facade 工作原理
- array_reduce,中间件解析
- Eloquent核心
- Laravel框架加载流程
- 线程、进程、协程
- Linux进程、线程、协程
- poll、epoll
- epoll原理
- Liunx线程调度算法
- 红黑树
- 同步/异步、阻塞/非阻塞
- PHP-FPM
- Nginx
- Swoole
- Go
- 惊群问题
- 线程模型比较
- 并发模型比较
- Lua
- OpenResty
- 数据一致性
- 悲观锁--VS--乐观锁
- 事务--mysql VS redis
- 事务嵌套--Doctrine VS Laravel
- 单体应用中执行顺序问题
- 数据一致性问题描述
- 分布式理论
- 数据一致性---接口幂等性
- 分布式事务---2PC VS 3PC
- 分布式事务---TCC
- 分布式事务---基于消息
- 接口安全性
- PHP & Nginx
- 请求超时问题
- 两者之间的通信原理
- TCP三次握手
- Nginx常用优化
- PHP数组底层原理
- PHP排序函数sort底层原理
- PHP函数---trim()
- 树形数据在关系型库中存储
- 标签(Tag)的各种设计