数学建模社区-数学中国
标题:
数据库结构的优化
[打印本页]
作者:
杨利霞
时间:
2020-4-24 18:13
标题:
数据库结构的优化
6 k0 X8 j0 h$ P9 A4 f
数据库结构的优化
% z9 ~# ?4 G8 m* V5 V: i
1、选择合适的数据类型
, U: b! D( S" X
数据类型的选择,重点在于“合适”二字,如何确定选择的数据类型是否合适了?
. ? x# \ ~- |* d$ I1 n
1、使用可以存下你的数据的最小的数据类型。(时间类型数据:可以使用varchar类型,可以使用int类型,也可以使用时间戳类型)
. Z& G+ R" a, l* O- K
2、使用简单的数据类型,int要比varchar类型在mysql处理上简单。(int类型存储时间是最好的选择)
7 _% M7 t2 E, J0 n) T: d) k
3、尽可能的使用not null定义字段。(innodb的特性所决定,非not null的值,需要额外的在字段存储,同时也会增加IO和存储的开销)
2 C! V& L4 |6 U5 z" H
4、尽量少用text类型,非用不可时最好考虑分表。
. e# T. m. M$ H3 p) i: w7 x" P
$ c- u9 z" k: [% t4 a* A
2、数据库表的范式化优化
- t7 A+ K7 Y2 O' [, w( ]% }
范式化是指数据库设计的规范,目前说道范式化一般是指第三设计范式。也就是要求数据表中不存在非关键字段对任意候选关键字段的传递函数依赖则符合第三范式。
$ F! ~3 l6 e. I& X: k" B& _3 A" I
% ~/ _! B* }' u N8 n2 J. A5 r' N# ]
反范式化
8 ?& {% s' a& z8 H/ S
反范式化是指为了查询效率的考虑把原本符合第三范式的表“适当”的增加冗余,以达到优化查询效率的目的,反范式化是一种以空间来换取时间的操作。
8 ]2 ?! T0 b5 ~$ C5 o! d9 O
4 b( x9 w4 a, F
3、数据库表的垂直拆分
9 f$ H7 G" |+ g* p
垂直拆分定义
E+ H4 z. W2 h% S* \5 [6 H7 S* i3 a
所谓的垂直拆分,就是把原来一个有很多列的表拆分成多个表,这解决了表的宽度问题。
9 I2 q9 Q6 L [! _
垂直拆分原则
3 i B' S" a5 W+ @; [* P0 |
通常垂直拆分可以按以下原则进行:
; E L+ k1 l4 j3 @1 _6 n
1、把不常用的字段表单独存放到一个表中。
9 z, X0 z# {+ f
2、把大字段独立存放到一个表中。
5 Q2 _" R5 y% a2 Q+ n6 h
3、把经常一起使用的字段放到一起。
- O4 ~8 [" X" j# j) K+ d
8 A2 H( R- f( u( A; k9 B; B
4、数据库表的水平拆分
8 F1 S2 d( l! e- ^4 _ v/ H0 B
- q& l0 C# n3 A! h
为什么水平拆分
# s2 }" S. k k) `. H0 V1 P
表的水平拆分是为了解决单表数据量过大的问题,水平拆分的表每一个表的结构都是完全一致的
& `1 v* T& W; x+ v; F1 y- R+ D' z9 \
- T, M3 E. _3 H" f9 y9 e
水平不拆分原因
! N2 v# o( c; |9 M2 ^# ~
如果单表的数据量达到上亿条,那么这时候我们尽管加了完美的索引,查询效率低,写入的效率也相应的降低。
3 @, e" W4 j& Y! l7 ^, R
8 j5 Z8 u' N( |, `# V
如何将数据平均分为N份
2 u: G# x N$ I1 J6 H% |
通常水平拆分的方法为:
: c) I0 V/ @' D
1、对customer_id进行hash运算,如果要拆分为5个表则使用mod(customer_id,5)取出0-4个值。
& P z+ i( T' D) l
2、针对不动的hashid把数据存储到不同的表中。
i J0 J0 t) L0 n* o3 [3 u0 ^
+ |7 Y! Y, s% m h" `
水平拆分面临的挑战
. }# s2 t. D% ^/ _! B
+ C/ G+ h5 U! B0 P; F" s
1、夸分区表进行数据查询
7 |8 v7 K$ Y% U* s' U: C! _& C$ \; l
前端业务统计:
; _ p# J3 b6 r4 X" m8 }
业务上给不同的用户返回不同的业务信息,对分区表没有大的挑战。
. [% U3 P K* }
2、统计及后台报表操作
1 i8 ?* h' w* O6 h+ L
但是对后台进行报表统计时,数据量比较大,后台统计时效性比较低,后台就用汇总表,将前后台的表拆分开。
" p) F" u1 k+ T* `
————————————————
, j: d4 Y( z- o* p5 _
版权声明:本文为CSDN博主「Cgy25」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
. V: T, B* U. _$ e+ r
原文链接:https://blog.csdn.net/Cgy25/article/details/105690070
3 c9 @! [3 \3 E4 W8 u4 h0 E) A
j, V7 y5 s7 S3 y4 Q
% X k- |' A( S1 b0 e1 g
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5