关系数据库与mysql

下面是阿里的mysql设计原则,可以参考,不一定按照阿里规则,但一个团队一定要有规则,如果现在没有规则,从现在开始,慢慢推广,适应

1.【强制】表达是与否概念的字段,必须使用 is_xxx的方式命名,数据类型是 unsigned tinyint( 1表示是,0表示否) 说明:任何字段如果为非负数,必须是 unsigned。 

2.【强制】表名、字段名必须使用小写字母或数字;禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。 正例:getter_admin,task_config,level3_name 反例:GetterAdmin,taskConfig,level_3_name

3.【强制】表名不使用复数名词。 说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于 DO类名也是单数形式,符合表达习惯。

4.【强制】禁用保留字,如 desc、range、match、delayed等,请参考 MySQL官方保留字。

5.【强制】唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。 说明:uk_ 即 unique key;idx_ 即 index的简称。

6.【强制】小数类型为 decimal,禁止使用 float和 double。 说明:float和 double在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不正确的结果。如果存储的数据范围超过 decimal的范围,建议将数据拆成整数和小数分开存储。

7.【强制】如果存储的字符串长度几乎相等,使用 char定长字符串类型。

8.【强制】varchar是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。

9.【强制】表必备三字段:id, gmt_create, gmt_modified。 说明:其中 id必为主键,类型为 unsigned bigint、单表时自增、步长为 1。 gmt_create,gmt_modified的类型均为 date_time类型。

10.【推荐】表的命名最好是加上“业务名称_表的作用”。 正例:tiger_task / tiger_reader / mpp_config

11.【推荐】库名与应用名称尽量一致。

12.【推荐】如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。

13.【推荐】字段允许适当冗余,以提高性能,但是必须考虑数据同步的情况。冗余字段应遵循: 1)不是频繁修改的字段。 2)不是 varchar超长字段,更不能是 text字段。 正例:商品类目名称使用频率高,字段长度短,名称基本一成不变,可在相关联的表中冗余存储类目名称,避免关联查询。

14.【推荐】单表行数超过 500万行或者单表容量超过 2GB,才推荐进行分库分表。 说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

15.【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。 正例:人的年龄用 unsigned tinyint(表示范围 0-255,人的寿命不会超过 255岁);海龟就必须是 smallint,但如果是太阳的年龄,就必须是 int;如果是所有恒星的年龄都加起来,那么就必须使用 bigint

 

创建索引的原则

  1. 对查询条件,分组条件,排序条件的字段创建索引,有可能是多列索引,update时后面的条件语句也属于查询条件

  2. 创建索引对更新插入删除有影响,相反

  3. 索引字段的长度越小越好,这里指的是性能

Mysql存储引擎使用的B+Tree

  B+树是演变过来的,首先是二叉查找树,平衡二叉树,B树

  1.二叉查找树,树种结点的度不大于2的有序树,最多结点数:2^n -1 ,n为数的高度,如n=3,最多7个结点,n=5,最多31个结点(达到最大结点数叫做满二叉树)

   某一层的最多结点个数 2^(n-1) ,如果n=3,第三层最多4个结点,如n=30,第31层最多 2^30=1073741824,记住这一点,后面会用到

  2. 二叉树如果在不控制的情况下会变为一条直线,失去了查找优势,这时出现二叉平衡树

  3. B树,二叉树实际情况无法使用,因为需要n多次的磁盘IO,B树,一个结点存储更多的key,同时存储数据

  4. B+树,为了存储更多的key值,同时考虑到数据库查询的其它需要,B树结点不存储数据,只存储key,所有数据存储在叶子结点

  5. mysql默认页大小16k,能存储多少数据记录和数据库记录大小有关系,假设叶子结点存储16条数据,一条记录大小1K,非叶子结点存储1000个key

   高度为3 ,总记录数就是 1000*1000*16 = 16000000.

 

视图,记录,字段

  每种数据库有自己视图,我们常说的视图一般是关系视图,可以关联一张或几张表,方便信息查询和权限控制等

数据库事务

  ACID ,mysql数据库隔离级别 ,Read Uncommited ,Read Commited ,Repeatable Read,Serialiable,注意,mysql是这几种隔离级别,其它数据库不一定有

  脏数据,读到了没有提交的数据

  不可重复读,一个事务在执行过程中,两次读的数据不一致,解决方法是mvvc

  幻读,数据做了插入或删除操作,但是其它事务插入或删除了某条数据,出现没有删除干净,或者都删除了的情况,在可重复读的隔离级别下,快照读不会出现幻读,当前读时,innodb 通过间隙锁和行锁共同作用控制,使得查询语句扫描到的数据及数据中间不能插入也不允许修改,从而不会出现幻读现象。

SQL和存储过程

  SQL99和SQL92

 

 

 

posted @ 2020-11-27 23:12  江山小画  阅读(92)  评论(0编辑  收藏  举报