h5鱼虾蟹平台搭建和MySQL数据库规范及解读

一、基础规范

第一条:必须使用InnoDB存储引擎

解读:支持事务、行级锁、并发h5鱼虾蟹平台搭建Q1446595067官网:h5.haozibbs.com

性能更好、CPU及内存缓存页优化使得资源利用率更高

第二条:必须使用utf8(utf8mb4)字符集

解读:万国码,无需转码,无乱码风险,节省空间,utf8mb4是utf8的超集,由于近年移动设备的增多,emoji表情以及部分不常见汉字在utf8下会表现为乱码,故需要升级至utf8mb4

第三条:数据表、数据字段必须加入中文注释

解读:N年后谁会知道这个a1,a2,a3字段是干嘛的

第四条:禁止使用存储过程、视图、触发器、Event

解读:高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。数据库擅长存储与索引,CPU计算还是上移吧

第五条:禁止存储大文件或者大照片

解读:为何要让数据库做它不擅长的事情?大文件和照片存储在文件系统,数据库里存URI多好

二、命名规范

第一条:只允许使用内网域名,而不是ip连接数据库

解读:虽然IP访问更快,域名访问需要内网dns,但是对于大数据库的扩展和迁库考虑,域名更好

第二条:线上环境、开发环境、测试环境数据库内网域名遵循命名规范

业务名称:xxx 线上环境:dj.xxx.db 开发环境:dj.xxx.rdb 测试环境:dj.xxx.tdb 从库在名称后加-s标识,备库在名称后加-ss标识 线上从库:dj.xxx-s.db 线上备库:dj.xxx-sss.db

第三条:库名、表名、字段名:小写,下划线风格,不超过32个字符,禁止拼音英文混用

解读:见名知意,方便后续维护

第四条:表名t_xxx,非唯一索引名idx_xxx,唯一索引名uniq_xxx

解读:见名知意,方便后续维护

三、表和字段设计规范

第一条:禁止使用外键,如果有外键完整性约束,需要应用程序控制

解读:外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql的性能,甚至会造成死锁。高并发情况下容易造成数据库性能,大数据高并发业务场景数据库使用以性能优先

第二条:必须把字段定义为NOT NULL并且提供默认值

解读: a) null的列使索引/索引统计/值比较都更加复杂,对MySQL来说更难优化 b) null这种类型MySQL内部需要进行特殊处理,增加数据库处理记录的复杂性;同等条件下,表中有较多空字段的时候,数据库的处理性能会降低很多 c) null值需要更多的存储空,无论是表还是索引中每行中的null的列都需要额外的空间来标识 d) 对null的处理时候,只能采用is null或is not null,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=‘shenjian‘,如果存在name为null值的记录,查询结果就不会包含name为null值的记录

第三条:禁止使用TEXT、BLOB类型

解读:会浪费更多的磁盘和内存空间,非必要的大量的大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能

第四条:禁止使用小数存储国币

解读:曾经踩过这样的坑,100元分3天摊销,每天摊销(100/3)元,结果得到3个33.33。后来实施对账系统,始终有几分钱对不齐,郁闷了很久(不是几分钱的事,是业务方质疑的眼神让研发很不爽),最后发现是除法惹的祸 解决方案:使用“分”作为单位,这样数据库里就是整数了

第五条:必须使用varchar(20)存储手机号

解读: a) 涉及到区号或者国家代号,可能出现+-() b) 手机号会去做数学运算么? c) varchar可以支持模糊查询,例如:like“138%”

第六条:禁止使用ENUM,可使用TINYINT代替

解读: a) 增加新的ENUM值要做DDL操作 b) ENUM的内部实际存储就是整数,你以为自己定义的是字符串?

第七条:表必须有主键,例如自增主键

解读: a) 主键递增,数据行写入可以提高插入性能,可以避免page分裂,减少表碎片提升空间和内存的使用 b) 主键要选择较短的数据类型, Innodb引擎普通索引都会保存主键的值,较短的数据类型可以有效的减少索引的磁盘空间,提高索引的缓存效率 c) 无主键的表删除,在row模式的主从架构,会导致备库夯住

四、索引设计规范

第一条:单表索引建议控制在5个以内

解读:一个好的索引设计,可以让你的效率提高几十甚至几百倍,但过多反而适得其反

第二条:单索引字段数不允许超过5个

解读:字段超过5个时,实际已经起不到有效过滤数据的作用了

第三条:禁止在更新十分频繁、区分度不高的属性上建立索引

解读: a) 更新会变更B+树,更新频繁的字段建立索引会大大降低数据库性能 b) "性别"这种区分度不大的属性,建立索引是没有什么意义的,不能有效过滤数据,性能与全表扫描类似

第四条:建立组合索引,必须把区分度高的字段放在前面

解读:能够更加有效的过滤数据

五、SQL使用规范

第一条:禁止使用SELECT *,只获取必要的字段,需要显示说明列属性

解读: a) 读取不需要的列会增加CPU、IO、NET消耗 b) 不能有效的利用覆盖索引 c) 使用SELECT *容易在增加或者删除字段后出现程序BUG

第二条:禁止使用INSERT INTO t_xxx VALUES(xxx),必须显示指定插入的列属性

解读:容易在增加或者删除字段后出现程序BUG

第三条:禁止使用属性隐式转换

解读:SELECT uid FROM t_user WHERE phone=13812345678 会导致全表扫描,而不能命中phone索引,猜猜为什么? int数据类型优先级高于archer, 该查询会把phone转换为inth5鱼虾蟹源码搭建 ,因此需要把表中所有数据改成int,所以必须全盘扫描 phone是varchar类型,SQL语句带入的是整形,故不会命中索引,加个引号就好了: SELECT uid FROM t_user WHERE phone=‘13812345678‘

第四条:禁止在WHERE条件的属性上使用函数或者表达式

解读:SELECT uid FROM t_user WHERE from_unixtime(day)>=‘2017-02-15‘ 会导致全表扫描 正确的写法是:SELECT uid FROM t_user WHERE day>= unix_timestamp(‘2017-02-15 00:00:00‘)

第五条:禁止大表使用JOIN查询,禁止大表使用子查询

解读:会产生临时表,消耗较多内存与CPU,极大影响数据库性能,大表指的是数据量在1000万以上的表

第六条:禁止使用OR条件,必须改为IN查询

解读:旧版本Mysql的OR查询是不能命中索引的,即使能命中索引,为何要让数据库耗费更多的CPU帮助实施查询优化呢?

第七条:禁止使用负向查询,以及%开头的模糊查询

解读: a) 负向查询条件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,会导致全表扫描 b) %开头的模糊查询,会导致全表扫描 一般来说,WHERE过滤条件不会只带这么一个“负向查询条件”,还会有其他过滤条件,举个例子:查询沈剑已完成订单之外的订单(好拗口): SELECT oid FROM t_order WHERE uid=123 AND status != 1; 订单表5000w数据,但uid=123就会迅速的将数据量过滤到很少的级别(uid建立了索引),此时再接上一个负向的查询条件就无所谓了,扫描的行数本身就会很少 但如果要查询所有已完成订单之外的订单: SELECT oid FROM t_order WHERE status != 1; 这就挂了,立马CPU100%,status索引会失效,负向查询导致全表扫描

第八条:应用程序必须捕获SQL异常,并有相应处理

原文地址:https://www.cnblogs.com/meishu001/p/8496046.html

时间: 2024-10-09 06:08:46

h5鱼虾蟹平台搭建和MySQL数据库规范及解读的相关文章

Mac下快速对H5鱼虾蟹棋牌搭建PHP开发环境

Mac下快速对H5鱼虾蟹棋牌搭建PHP开发环境论坛:aqiulian.com,更多PHP搭建MVC开发环境咨询Q:212303635. 最近做了一个后端的项目,是用PHP+MySQL+Nginx做的,所以把搭建环境的方法简单总结一下. 备注: 物料:Apache/Nginx+PHP+MySQL+MAMP Mac OS 10.12.1 自带Apache,Nginx和PHP 1.运行Apache 查看Apache版本,在终端根目录输入如下命令: sudo apachectl -v 终端会输出Apac

h5鱼虾蟹源码搭建源码搭建 redisTemplate教程

h5鱼虾蟹源码搭建 详细咨询Q 2171793408 官网地址:http://wowotouba.com/h5 在网上没有找到redisTemplate操作redis集群的例子,所以只能自己动手,在这里简单说一下过程.首先既然redisTemplate依赖jedis,那我们可以认为他内部操作的就是jedis,同理,我们也可以认为他内部也能操作jedisCluster.接下来就在spring-data-redis的源码里面搜一下jedisCluster这个字符串,发现JedisClusterCon

Python之微信H5斗牛出租平台搭建数据结构基础

微信H5斗牛出租平台搭建下载网站:h5.fanshubbs.com联系Q1687054422一.数据结构基础 a.什么是数据结构 b.数据结构的分类 c.列表 列表d.栈 二.栈的Python实现 a.栈的应用--括号匹配为题 括号匹配实现b.队列 c.队列的实现 d.队列的实现原理--环形队列 e.队列的实现原理--环形队列 ![](http://i2.51cto.com/images/blog/201802/03/07e08bf827bebcb6e258e9ccfd28f20a.jpg?x-

Windows平台安装配置mysql数据库

Windows平台安装配置mysql数据库 作者:Eric 微信:loveoracle11g 去下载mysql软件 https://www.mysql.com/downloads/ https://dev.mysql.com/downloads/mysql/ 解压下载的zip文件 d盘新建文件夹mysql ,解压到新建的这个目录 以后这个目录就是mysql的安装目录 配置my.cnf 打开目录,会看到my-default.ini配置文件 复制这个配置文件可以重命名为my.ini或者my.cnf

MySQL 数据库规范--调优篇(终结篇)

前言 这篇是MySQL 数据库规范的最后一篇--调优篇,旨在提供我们发现系统性能变弱.MySQL系统参数调优,SQL脚本出现问题的精准定位与调优方法. 目录 1.MySQL 调优金字塔理论 2.MySQL 慢查询分析--mysqldumpslow.pt_query_digest工具的使用(SQL脚本层面) 3.选择合适的数据类型 4.去除无用的索引--pt_duplicate_key_checker工具的使用(索引层面) 5.反范式化设计(表结构) 6.垂直水平分表 7.MySQL 重要参数调优

Linux平台安装配置MySQL数据库

Linux系统版本:CentOS7.4MySQL版本:5.7.28在Linux平台有RPM包.二进制包.源码包3中安装方式,这一篇文件主要是以RPM包为例来介绍如何在Linux平台下进行MySQL的安装.下载地址:https://dev.mysql.com/downloads/mysql/ 安装RPM包的具体操作步骤如下:(1)首先卸载mariadb,不然后面会和安装mysql需要的库冲突: [[email protected] ~]# rpm -qa | grep mariadb mariad

centos搭建openvpn+mysql数据库认证

一服务器环境 1.系统版本 CentOS release 5.10 (Final) 64bits 2.软件版本 openvpn-2.3.6-1.el5 lzo-2.02-2.el5.1 lzo-devel-2.02-2.el5.1 easy-rsa-2.2.2-1.el5 pam-0.99.6.2-12.el5 pam-devel-0.99.6.2-12.el5 二配置服务器安装前环境 1.打开ip转发功能 echo "net.ipv4.ip_forward = 1">> 

Mysql数据库规范

一.基础规范 第一条:必须使用InnoDB存储引擎 第二条:必须使用utf8mb4字符集 utf8mb4是utf8的超集,emoji表情以及部分不常见汉字在utf8下会表现为乱码,故需要升级至utf8mb4. 第二条:数据表.数据字段必须加入中文注释 第三条:禁止使用存储过程.视图.触发器.Event 第四条:禁止存储大文件或者大照片 二.表和字段设计规范 第一条:禁止使用外键,如果有外键完整性约束,需要应用程序控制 第二条:必须把字段定义为NOT NULL并且提供默认值 a)null的列使索引

MySql数据库规范与原则

1.数据库表名命名规范 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成; 命名简洁明确,多个单词用下划线'_'分隔; 例如:user_login, user_profile, user_detail, user_role, user_role_relation, user_role_right, user_role_right_relation 表前缀'user_'可以有效的把相同关系的表显示在一起; 2.数据库表字段名命名规范 采用26个英文字母(区分大小写