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

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

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

51Testing软件测试网Zq(`:h&_o

(sO;]GNj:U3l0写在前面的话:51Testing软件测试网]q.NY0Z+G5E?7{Z

51Testing软件测试网 cC5b E],^

总是在灾难发生后,才想起容灾的重要性;51Testing软件测试网#dL"W6kc!CtJ(c

51Testing软件测试网a0I%IWv X5n

总是在吃过亏后,才记得曾经有人提醒过。51Testing软件测试网}#S~R[V

7Of \G n(H0
+J3\.n])~+PV#I0

M8FL&Zi6y*r:z fB0
51Testing软件测试网6w&B/KzL%R imvx

核心军规51Testing软件测试网5qj_;IAt

0]]8tUH,i)P(v3ge01、不在数据库做运算51Testing软件测试网"|+d ~a'wlT
cpu计算务必移至业务层
51Testing软件测试网h }j:Mf J

;yr V uW Fw Y02、控制单表数据量51Testing软件测试网,Kg0aG'm+]%L1wsLb
int型不超过1000w,含char则不超过500w;
Z8iB3{ jw0合理分表;
ML7F`1},S%aPGy0限制单库表数量在300以内;

Q@ {V2h ]0q/T051Testing软件测试网`uzT$L4nYz

3、控制列数量
0Jh7f!Mk7KK7IFWT0字段少而精,字段数建议在20以内;

}5U&sD5{051Testing软件测试网)s:FC6wZ H8I

4、平衡范式与冗余51Testing软件测试网\9M;{)x#q \F
效率优先;51Testing软件测试网]mAt-R M,y$[
往往牺牲范式;

IU-@1_GV051Testing软件测试网sQ a t~3d$aW

5、拒绝3B51Testing软件测试网J:w!VQ!EQ

51Testing软件测试网P;gue7@q

拒绝大sql语句:big sql
%r+of,Y%O} yb0拒绝大事务:big transaction
S){s B#DP U(o e'CV0拒绝大批量:big batch

Mo#r'cHY/?Z0

B6roR1B*iL l)B.s051Testing软件测试网S_T-J*? t

Exr2IX5x*DX051Testing软件测试网/t&Pk1NuOWF


G}8zIl KYTf0
51Testing软件测试网u/I Kn[q

51Testing软件测试网C N.H nD0m

字段类军规

&TC&G-Yp wY%@+\0

.{H;}:xSK!Z_Ul5I6J06、用好数值类型

-N:?^*MT}4HK ^2R!v051Testing软件测试网/Ea3rmB:v \

tinyint(1Byte)
BZF O4} i0smallint(2Byte)51Testing软件测试网9f S-G K F;j#n]6G
mediumint(3Byte)
"^8f$[{a5Fw"M*N myN0int(4Byte)51Testing软件测试网2D*n9vq x&h(b
bigint(8Byte)51Testing软件测试网9t#C3n7M6~5}Eb
bad case:int(1)/int(11)

'o+l*N Lp"S9GF0

`h`'@,yMjH;[U07、字符转化为数字51Testing软件测试网f}kC @}1VNq!N

51Testing软件测试网9V"TVs+N]m4K

用int而不是char(15)存储ip

3No_L]051Testing软件测试网3lPHD+~G

8、优先使用enum或set

,_}5w]O@ZJ#}051Testing软件测试网r7^;EX6D9u,g

例如:sexenum (‘F’, ‘M’)

K+O?$\8F@1j,| OwF051Testing软件测试网U;H;r`I |


;H8s c Y(y#f${xv1l.C0

$~3W Q5^r3C~0

al9|)CLgc8b09、避免使用NULL字段

JQ!T%e{ ER6`051Testing软件测试网&_%jB*Ya

NULL字段很难查询优化;51Testing软件测试网'L?*Wl*rw*u
NULL字段的索引需要额外空间;
/omfUb`8_0NULL字段的复合索引无效;

)JI+qm&}#k a}0
badcase'name'char(32)defaultnull'age'intnotnullgoodcase'age'intnotnulldefault0

k'Z0?C&EH+E]V010、少用text/blob51Testing软件测试网t1l"b Dd5k] ^

4| uz.ie L'K(YX0varchar的性能会比text高很多;51Testing软件测试网6JJ.x9]'y.s(j
实在避免不了blob,请拆表;

gP x-w,T0

8uM.uC&kC L e011、不在数据库里存图片

!wWJP\Z!\in6J5^0

u `$Am.Bp3@051Testing软件测试网1?Q%O} a,J;u
51Testing软件测试网 N&[2Yh-Mf

3t J7\0f#V9a051Testing软件测试网It&mb9t!{

/f}^'SbN8}0
51Testing软件测试网.c5i0AC4gk7Bq

索引类军规

5W%Fla4cnG:oWs0

8M2s s4dw3m2v E012、谨慎合理使用索引

3g m^h!B%I+i}051Testing软件测试网?$J#n8Y)PG(Om6}o OH E

改善查询、减慢更新;
gp2Z$w w0索引一定不是越多越好(能不加就不加,要加的一定得加);
q8y9Tr9\0覆盖记录条数过多不适合建索引,例如“性别”;
51Testing软件测试网K$t;J"K d^'tT7L

51Testing软件测试网 NV6rF!z!{

13、字符字段必须建前缀索引51Testing软件测试网-GJ+GQEQdq

6Noi5Ho!q5sg014、不在索引做列运算

w H Jv{dKBzE0
badcaseselectidwhereage +1=10;
51Testing软件测试网x:k_r KEd)t

15、innodb主键推荐使用自增列;51Testing软件测试网e?,C5E.|!?n}

kd+Fy@6L(X0主键建立聚簇索引;51Testing软件测试网!a#W.m7JLYDm
主键不应该被修改;51Testing软件测试网5IVU'UTJXH
字符串不应该做主键;51Testing软件测试网4Y%c `0K'\mm
如果不指定主键,innodb会使用唯一且非空值索引代替;
51Testing软件测试网N*h"zlt8S A

51Testing软件测试网 Pd!E8rM

16、不用外键

TkO?FU~ F051Testing软件测试网)t8] SW-s/M R

请由程序保证约束;51Testing软件测试网e;_2XvS

51Testing软件测试网8F$d^g!s:N2t

51Testing软件测试网'S&\+y5b%]%l8A

q8SAv;L,T4D051Testing软件测试网 zXK8T;xEmq


;Z&k5w[6?N)W8n0

&jK(N,E/m9c5g$KaW0
51Testing软件测试网b3JX5E#z:b

sql类军规

6i#l V d-x!F"H0
51Testing软件测试网k ?D i!x

17、sql语句尽可能简单

"D l!HV-w/`$qin q051Testing软件测试网LYf$r!rn;Ms

一条sql只能在一个cpu运算;51Testing软件测试网t-zd7M1U%oV
大语句拆小语句,减少锁时间;
8S1Ey2C'MIOs_ t0一条大sql可以堵死整个库;

GVm7B,e2R}:J0

K`Cm0CSs?xkv018、简单的事务

{@K#e I\1K051Testing软件测试网~?%JTbK

事务时间尽可能短;51Testing软件测试网/f-y,_ DT"rFQ

;N8g0atPi-|L019、避免使用trig/func51Testing软件测试网O` [/Gtyu#y!k.Gk

51Testing软件测试网"v,}+JK?*Jb

触发器、函数不用;51Testing软件测试网-{2jCCzx'a!o0c
客户端程序取而代之;

^8\ f~2h)hac.S0

g#M;r)l:k+ac020、不用select *51Testing软件测试网`;}7w$}+M)X

yw j:^{wv0消耗cpu,io,内存,带宽;
tu:Z+cS M_K0这种程序不具有扩展性;
51Testing软件测试网8Q1P:a7EHKr,a%K)U,H

51Testing软件测试网 F%^fs7qn Rt

21、OR改写为IN()

#Nc SJc8V?(U0

8g,QqQg-G+`'@M0or的效率是n级别;
Li7f1zOKJ0in的消息时log(n)级别;
{)n)^2UI)Nn0in的个数建议控制在200以内;

"w!g r!uI;V!~%zi0|0
selectidfromtwherephone=’159′ or phone=’136′;

 =>selectidfromtwherephonein(159′, ’136);
51Testing软件测试网\ |*Bd"C/]

22、OR改写为UNION51Testing软件测试网-@enj:o

51Testing软件测试网-p5QUb!oep*|2^b,k'?

mysql的索引合并很弱智

X:Gv!v#Gs"k0
selectidfromtwherephone = ’159′ or name = ‘john’;

 =>selectidfromtwherephone=’159′

 unionselectidfromtwherename=’jonh’

o0We&V:]ij023、避免负向%51Testing软件测试网9Q:J-lN;M+C?

51Testing软件测试网J)wD N6_a3{|![~e)vl

24、慎用count(*)51Testing软件测试网cT"E,fEz.D

51Testing软件测试网"?-~XtE7|;?^x

25、limit高效分页

\Na)FT_(n v;E051Testing软件测试网9@E G$eta0p,C

limit越大,效率越低

F_0n8qhdK0
selectidfromt limit10000,10;

=>selectidfromtwhereid >10000limit10;

(W&n4|A)Zm0
51Testing软件测试网8q4@'OcN

26、使用union all替代union

tl{/m(SU#[0

$i:r ~L!_4Db;i z-rL0union有去重开销

1WG)K LE\(d/K.`L0

T&Q5}~:ouk#Ju7I051Testing软件测试网uWR!y0](x0DR
51Testing软件测试网 a C y Yj+r v\]#C

51Testing软件测试网cCTN-|n_

27、少用连接join51Testing软件测试网v D)j/d7w&?dE

51Testing软件测试网^Ps-^@7Q4W


.e [2my._[%s['m0

Q P5A?O|0

3x%V9zbQ028、少用group by51Testing软件测试网~L8ME5Ci#F

0E8[8N-YN0分组;
|kA&u%r.{*X1V0V0自动排序;

$Wu Z5u2Fi051Testing软件测试网1Ko6[$aY


6u}8E%a%BS|0

&]9MJ ^3Y-W~6p0

V1m[5H w"J029、请使用同类型比较

R~$S"X,Q$T051Testing软件测试网5K y&?bt}


+?e2PN\X]s1t0

R+i;T(uT.qY0F*L4_051Testing软件测试网6r)HmG9@&R8S

30、使用load data导数据51Testing软件测试网@ iqSD]5tJs`'f

51Testing软件测试网5GUb3F"[nj3U

load data比insert快约20倍;51Testing软件测试网[!^4o6W.k

wR'P mZ d0
(o5d*g Yc1z0
51Testing软件测试网Nc_Y cI qf}

51Testing软件测试网z%ds$YP eB1R

31、打散批量更新51Testing软件测试网 n n5Z} U G

51Testing软件测试网!CDmT?-EV


$u6{ql2]0

ck9B q5Wk1MCW051Testing软件测试网N6MJX)I

32、新能分析工具

P^e5Os)L4n"u#P+x0
showprofile;mysqlsla;

mysqldumpslow;explain;showslowlog;showprocesslist;showquery_response_time(percona);
51Testing软件测试网pL0h MSR$`,ZV z

1an~8])W'nt)v0

W;E;tE%sXP0此文转载自网络;

E7zEN+J1B'L St0
文/小程故事多(简书作者)
}8y%y t\(Lc i0原文链接:http://www.jianshu.com/p/b7849d3f8698
kQ {E7UR sn!V0

$}3N#@;k@ZL_0q+_7F0

TAG: 数据库 MySQL mysql

 

评分:0

我来说两句

xuquan

xuquan

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

日历

« 2024-04-30  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

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

RSS订阅

Open Toolbar