IDO老徐,在深圳,某上市公司质量部负责人,干了十二年软件测试,公号"简尚" ,博客isTester.com ,关注「软件测试从业者综合能力提升」,微信957863300

用尽洪荒之力整理的Mysql数据库32条军规

上一篇 / 下一篇  2016-10-29 14:40:14 / 个人分类:数据库DB


X:Qs'm Tm0FH dM0

&`'C6?*ke5jN0写在前面的话:

IKz BM:gh ~0

c.JbNOy4fp0总是在灾难发生后,才想起容灾的重要性;51Testing软件测试网-s(T2B4G9gf h2C)c&_

51Testing软件测试网%G9H!]&f.V!b(e

总是在吃过亏后,才记得曾经有人提醒过。

2P!A1Jq2t^e051Testing软件测试网 Co-Rl.O'o

51Testing软件测试网e0^ UG)w+MT

-J-C?U [xt q3n)I0
51Testing软件测试网?;cG?x2?GD

核心军规51Testing软件测试网N:d;l5x:es

t a!C ].o01、不在数据库做运算51Testing软件测试网"?F BU O u.H
cpu计算务必移至业务层

E[WjY"{\ mu051Testing软件测试网SU ?C,I!ql5h{

2、控制单表数据量
;{!a&Z$`.| gk {VKel0int型不超过1000w,含char则不超过500w;51Testing软件测试网.Z6Dge;lr-pLV
合理分表;51Testing软件测试网uG)CJOf??
限制单库表数量在300以内;
51Testing软件测试网JP!TX x5f\

51Testing软件测试网@Q9S e U:}1s"Y

3、控制列数量
"xa&~@8[` [ ~0字段少而精,字段数建议在20以内;
51Testing软件测试网HiG_:t$KBZFn|

4W0AK_f%zcDKPH3m7l04、平衡范式与冗余51Testing软件测试网0gVj/N On[5A
效率优先;51Testing软件测试网?+e7\tA7hM
往往牺牲范式;

G[ \t1pHUN$J0

/w9c9Hz*R05、拒绝3B

[3]1r ]x"C0

8WZo A|3uP0拒绝大sql语句:big sql51Testing软件测试网"B)|7b&n&?%E8y4s
拒绝大事务:big transaction
/V0YBW-w6u0拒绝大批量:big batch

c \!\.aU0z0

IH#pUX w]0
-cK5t(k7N5A8p0
51Testing软件测试网h(J(z_U/Rw4l

51Testing软件测试网S `0n1Y \$W$L6b KTt


l']#fj6Z*n:X#n0

@/D%r:X"b[8@IH0

C4R(g)`:q+k1b tZ P0字段类军规51Testing软件测试网-lw"C&t?}{

j"Qro3v~ G:R06、用好数值类型

vY/z+{r$T051Testing软件测试网~,O5HGGbc

tinyint(1Byte)
*n+Q^Yz$_%_p0smallint(2Byte)
_+u*I~r l{l0mediumint(3Byte)51Testing软件测试网N Sx9L [5c1P.Y
int(4Byte)
W!BA"BuW0bigint(8Byte)51Testing软件测试网'r4Ttp3Z
bad case:int(1)/int(11)

~8a\0wQ B&`&]0

-Z1f E)` u:RXw07、字符转化为数字51Testing软件测试网W!S{#C a)w2A&m

51Testing软件测试网F5H)C}7x9Bh

用int而不是char(15)存储ip51Testing软件测试网+?cyx]&S;i

[)Sq4xB9r5se08、优先使用enum或set

] YL%U3lO V9C0

tP@4S'wP0例如:sexenum (‘F’, ‘M’)

5`xL L UU)r0

7@D0H~R2G(?B3wx051Testing软件测试网-V#\&j/u1E)X'F;|{Gu,v"~

$`;? R*qTb$_mI.l r051Testing软件测试网Z#x\3cUZi9_F

9、避免使用NULL字段

%L;DQ4@*I7E8|?0

7e!rg ^.g0NULL字段很难查询优化;51Testing软件测试网Q;p g'p$G8t7iy{
NULL字段的索引需要额外空间;
9M%O'{6V$n&B&Q1F.|3}0NULL字段的复合索引无效;
51Testing软件测试网`BL6YG.y0l;L7Ga

badcase'name'char(32)defaultnull'age'intnotnullgoodcase'age'intnotnulldefault0

;k l Zmq010、少用text/blob51Testing软件测试网kP8v_F:g?"Q

51Testing软件测试网D&emXsKv,Oo&x1{

varchar的性能会比text高很多;
,jG9mBN6Jj:jk]X0实在避免不了blob,请拆表;
51Testing软件测试网n*Vk-DA9oE G'\

51Testing软件测试网{ gV3PZ9c {W

11、不在数据库里存图片51Testing软件测试网myy5wsD@,M

51Testing软件测试网utfF:a1E@

51Testing软件测试网B;hf IpP*l
51Testing软件测试网Sf$K.Jn0Bk ll

2`Eo{N"J'GbC051Testing软件测试网-M \N)GSD

rz[N3g W,G%Dn0

t H5u8k0nY1@ A;@o0索引类军规51Testing软件测试网pC0\c~ D'~6Ba&w

51Testing软件测试网-q#gSC+G@x8v

12、谨慎合理使用索引

IP0^)Vm"bCG0

(D+B4W@@2l%b"~!C0改善查询、减慢更新;51Testing软件测试网1X"J cjGi @/B
索引一定不是越多越好(能不加就不加,要加的一定得加);51Testing软件测试网Vj%mr-{Ir.}
覆盖记录条数过多不适合建索引,例如“性别”;
51Testing软件测试网OQ$ly k1egT

51Testing软件测试网:m!Wb P0h @*z

13、字符字段必须建前缀索引

(n$M0X%p&R(D051Testing软件测试网s|(mb9wT!^'K

14、不在索引做列运算

b.P}'i1H9Q$`BzS N0
badcaseselectidwhereage +1=10;

&L&NX e9dOnj015、innodb主键推荐使用自增列;

.}P,{"g([?/@6wz051Testing软件测试网]C$q2zel}jG

主键建立聚簇索引;
X3R,T/y2w U6jIv0主键不应该被修改;51Testing软件测试网"F6a7q]z-dv
字符串不应该做主键;51Testing软件测试网cp`0V7s4v
如果不指定主键,innodb会使用唯一且非空值索引代替;

K7v9p A}%S.@#Ih0

u0XN/n$iI3i016、不用外键51Testing软件测试网1Q Y cf a

51Testing软件测试网&I j7m7wt3K

请由程序保证约束;51Testing软件测试网R#j$OU$t%xd$b

k-r?E JD051Testing软件测试网%Y ?L_9X!W]/J
51Testing软件测试网%A dQ Sg\5o

6a{b/B}\:I0
&V'v.jJ1o$qr0
51Testing软件测试网 C)SRd&g$t/o3q

C/Ry1[;o0sql类军规51Testing软件测试网W LO8~G3\

51Testing软件测试网0t&P1p(v2X s/S

17、sql语句尽可能简单51Testing软件测试网G4VV3tw2`1P ]+{#yI

v:l}7R5C'VOq{L0一条sql只能在一个cpu运算;51Testing软件测试网$k5?{Z&|vZ-AQ
大语句拆小语句,减少锁时间;51Testing软件测试网y L tVZV,j
一条大sql可以堵死整个库;
51Testing软件测试网+z K"L\5K$f

R&dl5enA O vD]&?018、简单的事务51Testing软件测试网8h+XWZ_z

51Testing软件测试网M7zzu2}Yg

事务时间尽可能短;

(V0^$kz6D:a _,y-r051Testing软件测试网/@8VSW ?f)T

19、避免使用trig/func51Testing软件测试网U9\'g.CL"^0OI

(a? Q0]Xd(dj?0触发器、函数不用;51Testing软件测试网.Om&?[X)W
客户端程序取而代之;
51Testing软件测试网9U+G na5`#p/A|

V!Rr{QK020、不用select *51Testing软件测试网4PCgJ.w6e

51Testing软件测试网5A$a6d$}'gv(m,}|:a

消耗cpu,io,内存,带宽;
h%I]1@E\0这种程序不具有扩展性;
51Testing软件测试网*`4z*kbc+g0R(x

/w9YM*b5P1{$f021、OR改写为IN()51Testing软件测试网Ub {!Y f

51Testing软件测试网w"D/u [-`%A1[

or的效率是n级别;
aA:cP&IJ i0in的消息时log(n)级别;
0L/I^f:Og/^:X0in的个数建议控制在200以内;
51Testing软件测试网$e~nM9hbE$X

selectidfromtwherephone=’159′ or phone=’136′;

 =>selectidfromtwherephonein(159′, ’136);

B3I9[8|U;[Z_(Yd022、OR改写为UNION

[j\j-K'_{ZI0

i0K.J)qWL"xu0mysql的索引合并很弱智

#\DS1Xo#\#e0
selectidfromtwherephone = ’159′ or name = ‘john’;

 =>selectidfromtwherephone=’159′

 unionselectidfromtwherename=’jonh’

T&CO e_Q)Vg023、避免负向%51Testing软件测试网 G$r"O3Ll:Q;R

C0x p#Al1fg024、慎用count(*)

!e#EZ@6c0

|M;\I0GD!Z025、limit高效分页

^c*{U S$J/v&lkNv Rc051Testing软件测试网];Ot X1{{

limit越大,效率越低51Testing软件测试网OyUBVS

selectidfromt limit10000,10;

=>selectidfromtwhereid >10000limit10;
51Testing软件测试网%wGRKAX(F*?U;}
51Testing软件测试网Z\wE:qYn

26、使用union all替代union51Testing软件测试网 Ov jhSt A

O0}#Z!az @~.}rm"t0union有去重开销

!u |)[TN _]B8OP3}f6} s0

&a `JunVW.w,Y3`#Y [6a0
R9I8N7pw0

BFV0L.[-YN0

I T!I] }|027、少用连接join

:`0~}p7?8p1M'x V0{0

-K1Ahd!f h0
@(E%ME;]+K2l\0
51Testing软件测试网0i{W%S~5B+lX2h

51Testing软件测试网,n3L*@F6@2u O1xc;J

28、少用group by

0Z*R+\2S9`051Testing软件测试网J$AuFmm uf

分组;51Testing软件测试网+m[I!BL8I
自动排序;
51Testing软件测试网G g/B!q'l/X

51Testing软件测试网)EK,TTCe


"xY2o C&sz} u051Testing软件测试网`9o#NV nE

y%^i6r;C"`029、请使用同类型比较

|b-T:`0rps\,Q%mq0

)r2sE#k2dor051Testing软件测试网9VV(I&|&Z(w

p#f9x Sv!H0

-E'b0wY_]!}R030、使用load data导数据51Testing软件测试网Cu*~JU#H J.]

.~9JS0c DmX6cb0load data比insert快约20倍;51Testing软件测试网N.P4`J c$LR*r _

51Testing软件测试网fq5YE/gD6ty:`


t S@ao h-^0
51Testing软件测试网"R*jv{.U

{)o4PL6@u+^$T iK1^031、打散批量更新

] N?BU'r051Testing软件测试网Bdr"T A cQ5f0Y%k)l


%vtm ldR,~0
51Testing软件测试网6BG-u!A:H&l.O

AwakSfmy032、新能分析工具51Testing软件测试网Q&?%U5q#EG}Df.M

showprofile;mysqlsla;

mysqldumpslow;explain;showslowlog;showprocesslist;showquery_response_time(percona);
51Testing软件测试网v.z y~ pr0T9ji
51Testing软件测试网9V;J$u ?sX;iw
51Testing软件测试网k-WL'z.X:Gw#au
此文转载自网络;
51Testing软件测试网-SA!Qs,K
文/小程故事多(简书作者)
/VT.a Q1MA(R0原文链接:http://www.jianshu.com/p/b7849d3f8698
'VS"u4Umx0
51Testing软件测试网J(L~*Ll+?`

TAG: 数据库 MySQL mysql

 

评分:0

我来说两句

xuquan

xuquan

IDO老徐,坐标深圳,测试经理,干了十年测试,公号"简尚" ,个人博客isTester.com ,关注「软件测试从业者综合能力提升」,微信957863300

日历

« 2024-04-14  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 913302
  • 日志数: 427
  • 建立时间: 2012-06-04
  • 更新时间: 2022-02-23

RSS订阅

Open Toolbar