5 T, _" h9 P) P" g 4、创建表是先判断表是否存在 " d- ?5 j% Y1 G& a( L: Q create table if not exists students(……); 2 @5 I7 d: q2 k0 r9 I . w; T3 O5 i8 k( ^0 {) S% u' j) T
5、从已经有的表中复制表的结构 8 W) w( f0 Y8 O8 x/ f. H( q create table table2 select * from table1 where 1<>1;9 A7 F0 {& K: E) b4 W' q$ S
9 z+ [/ E2 ^, r. ] 6、复制表 - Q$ h+ I# z% t/ C' c create table table2 select * from table1;. G$ ^) i, P6 W, E' p. l) x
?2 A9 i U) {( [- `- B 7、对表重新命名 ! X( ^1 }) X, Z8 {# W& { alter table table1 rename as table2;- d9 \( |1 q' p4 z
7 T. V( I& p2 ]) D1 y' \6 O4 p 8、修改列的类型# j" F' v+ u# n. I9 A; I
alter table table1 modify id int unsigned;//修改列id的类型为int unsigned 7 R. M. R: f j% F" t8 I- }3 | alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned " M( P5 i) _) D2 r1 J+ {# A # v/ m5 T4 ?! v+ A/ W9 k& r# W; m& ]
9、创建索引 0 V+ {7 o; k% R$ o( z% p alter table table1 add index ind_id (id);. R' }% k$ @9 V: j' Z+ R' l
create index ind_id on table1 (id);# T5 v5 c7 f. e
create unique index ind_id on table1 (id);//建立唯一性索引+ z2 g, k9 X, H: ]( `4 i; O
. |" s" F; |" t; n
10、删除索引6 o9 Z7 N) g- Z0 M6 t. m: y
drop index idx_id on table1;% K6 {- V+ B: A; x% k. ~
alter table table1 drop index ind_id;, t' q `! y( e" u
% j# Y6 H+ M- t; B6 j' _( R! Q; D
11、联合字符或者多个列(将列id与":"和列name和"="连接) ( }: g! G# F% q/ X$ e0 G* \) R select concat(id,':',name,'=') from students;4 C- j2 c' f- l3 m, \4 b5 ?
! P7 N; i% B2 W 12、limit(选出10到20条)<第一个记录集的编号是0> 1 O% q" x3 O0 _' T% @ o; |, |: A$ t select * from students order by id limit 9,10;: j( P) k) s! k9 T
* \5 v% U2 D3 ^
13、MySQL不支持的功能$ ]% H0 ~2 s) ~* K% _
事务,视图,外键和引用完整性,存储过程和触发器 ( Q2 H7 V9 x* U * {, X! L0 L: }$ O1 D( R % g" ]$ ?0 w3 G7 L 14、MySQL会使用索引的操作符号0 d T: m! j! p% Z
<,<=,>=,>,=,between,in,不带%或者_开头的like* f8 _( _5 ?- \' j# m+ @# }1 s: {
! u/ O4 p0 l# g; c/ I* ?- p 15、使用索引的缺点 ! ]' E6 Z4 j: r: Z, |4 ^( o. ?- u 1)减慢增删改数据的速度; 5 f1 u8 c* W. z6 W- V. W9 c 2)占用磁盘空间; 0 r! s% w2 x# M1 h 3)增加查询优化器的负担;: d9 z, E' }; E$ Z( X" p: b" L
当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案; & P9 F1 X( v7 M. z ; i. d* R* S+ B" ~: b 16、分析索引效率- U5 Q1 V V( }, O
方法:在一般的SQL语句前加上explain; 8 {. U9 X! c! x/ d" ~) ] 分析结果的含义:# Z0 X0 L" m. D% M' @2 ^$ s, i
1)table:表名; 4 I0 H/ L6 i" u/ c; C 2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的; & U6 B+ u) _, l9 m 3)possible_keys:查询可以利用的索引名;' b3 ?7 U( o* k( f
4)key:实际使用的索引;. ?0 m. w5 _# z% l
5)key_len:索引中被使用部分的长度(字节); / T0 g3 T: P; v+ M; M 6)ref:显示列名字或者"const"(不明白什么意思);7 R( s3 e' i2 Z+ a. _+ Q7 s
7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;+ C: B% R0 |7 n }
8)extra:MySQL的建议;1 K: V; h% X4 H D0 u% i1 `8 ~
6 Q# g T) B+ p0 O8 P: D. I 17、使用较短的定长列 % f% Z# o& w# v2 O% | 1)尽可能使用较短的数据类型; ) m) B5 o5 b9 ^ D8 T* b 2)尽可能使用定长数据类型;; K# }8 v# O! x. Q" v# B" I1 c. q; L
a)用char代替varchar,固定长度的数据处理比变长的快些;6 ^& j2 ^' [# {& h2 b
b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;5 w' o( {: D& v4 k# n8 L, E: I4 c; y
c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;5 i- t/ B! V: n6 e
d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大; , e* {6 K! W; c/ J c 6 }" t0 L- o4 l4 C- H 18、使用not null和enum % u; Q+ ^) A3 `& s 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;8 h3 t" _' M7 K8 T/ F. O
如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的; : D4 Q( p7 x1 L( o' W9 i8 \ . w8 J Y# R3 ]% d4 T
19、使用optimize table/ d% ^4 q* c6 t1 x) {( Y# \. _1 \
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表; 3 X$ m# J3 g6 `8 U9 \ K9 z. w& d2 @. c% w
20、使用procedure analyse() $ A. t6 `( L1 y" K% q8 Q; s- v 可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如: . n, r2 I- o% H/ p) C+ R7 b+ N1 l9 K select * from students procedure analyse();' C* E; c% w3 E
select * from students procedure analyse(16,256); & w, _0 c8 \& a 第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长; 0 J I% Q: w3 d2 v' G/ Y ( Z2 ?% H1 I k# B
21、使用查询缓存. _: t& c+ m4 n4 `
1)查询缓存的工作方式: 8 B7 @( Q- M# w" E- m) B v 第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。: {# J2 |" j5 U6 i5 F5 ]5 Y4 ~
2)配置缓存参数: & ~3 e' f* e9 P% ^( r- w3 G4 p 变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。5 {. ?. o3 G: T2 E! E4 k
6 u8 p* f* P7 Y, h% l- k 22、调整硬件, ]6 l) a" b I4 L4 _* E6 R
1)在机器上装更多的内存;# W* e% Q' A) B, i' m
2)增加更快的硬盘以减少I/O等待时间; 0 i- e9 P5 ]. B3 k 寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快; $ Z0 o& W" ^ k5 g! i4 s/ p 3)在不同的物理硬盘设备上重新分配磁盘活动; # u. B* W$ A: s% G$ m5 k F 如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。7 L# F# [' i- ~1 Z- @7 ?3 R, L( W) V2 c1 |