启动:net start mySql;, n% ], m+ A; b
进入:mysql -u root -p/mysql -h localhost -u root -p databaseName; F! Q/ x/ l g. t; U
列出数据库:show databases;* w# f% q* `1 l$ q
选择数据库:use databaseName; w2 z: A7 w- C7 W3 I& e4 M f
列出表格:show tables;6 a3 M9 v# k6 Z" x# u
显示表格列的属性:show columns from tableName;
& g6 g6 e2 d S2 T 建立数据库:source fileName.txt;
5 _, [0 j* f! c0 n 匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;
0 O/ `: H, j# g3 n 增加一个字段:alter table tabelName add column fieldName dateType;
A" A$ P# E* j* i" A 增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;' y8 f0 P& O7 R# o$ n5 L6 r- M
多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;
. k8 y+ w! ?: f+ Q1 t 增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";' I" E O: k( s q
每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;
4 R: ^& D e* D8 \7 K" t5 j; N 查询时间:select now();% m2 E) \+ U6 v9 n2 Z1 x6 {! J, _
查询当前用户:select user();9 I6 i$ {; n- f* U9 H# F
查询数据库版本:select version();
- A' B( E0 h& w' `$ o 查询当前使用的数据库:select database();0 f% V: I; d( D# F3 ]- l, H7 n
' N/ ~1 g @& w' U& Q3 m
1、删除student_course数据库中的students数据表:8 m9 W5 S0 e3 a4 L+ U/ X% w
rm -f student_course/students.*
9 o, o6 j" m0 i" d6 M 2 S4 G+ q' p% h. N8 f
2、备份数据库:(将数据库test备份)
0 E6 |; E Q( J7 p- l, w' D% t0 P mysqldump -u root -p test>c:\test.txt4 D, }, k7 f2 {$ l: x4 W
备份表格:(备份test数据库下的mytable表格)
- E2 x$ K' X0 [0 _) ] mysqldump -u root -p test mytable>c:\test.txt
; A+ t% X# E$ D0 f 将备份数据导入到数据库:(导回test数据库)" U! J6 {3 l( u/ s6 l
mysql -u root -p test<c:\test.txt
+ R1 b5 ~3 k) }( p( } $ u) O/ e3 b0 s9 q) L: ^5 ], }6 G
3、创建临时表:(建立临时表zengchao)
2 H; ?" Q4 |0 R+ J. \ create temporary table zengchao(name varchar(10));
P+ b1 J1 \0 a! y" ~ @. e
$ L% n5 v9 Z" A 4、创建表是先判断表是否存在! s# _% y6 u# J% I; t0 r
create table if not exists students(……);
, n! u) [2 q, t7 ]
* z* Y# ~$ ~5 f' n4 h+ h& }3 P: q 5、从已经有的表中复制表的结构
6 W7 Y( V7 O. I7 n2 R create table table2 select * from table1 where 1<>1;
) B/ j2 ]# q( p! j* n; C [ + a9 F5 M, R! G4 `( B
6、复制表3 g9 D0 ~ V y! z' e ^
create table table2 select * from table1;
9 p1 ^* I J/ V1 F8 w 6 a" r' |9 w, w; x. f
7、对表重新命名0 t) }4 g- I; m& s) z* Y
alter table table1 rename as table2;( R/ \* ]5 p8 O" T# T0 M% J; U
& B3 a- g. z# O8 X
8、修改列的类型7 X8 _2 Y) M! B# }2 Y+ z0 [7 y7 B
alter table table1 modify id int unsigned;//修改列id的类型为int unsigned
, d* i; E1 g- u7 z alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned
& Y) z* f5 z; u0 }
$ H2 L; ~. y: i8 ^! O9 C7 z; h 9、创建索引
# X% a* N7 H. @5 }) ]) r# n( a alter table table1 add index ind_id (id);
" W, X+ G3 e( a5 m1 h create index ind_id on table1 (id);( I. _; V" c& Y$ Y; K2 R& P8 }: m
create unique index ind_id on table1 (id);//建立唯一性索引
v* v& O' U$ ?* h" s
- a" e* S8 @- q: u! T+ R2 x9 @ 10、删除索引$ v4 j/ h9 W" M6 }8 i
drop index idx_id on table1;
7 W0 G. A( R4 M- a" `2 d alter table table1 drop index ind_id;
. G: N: c$ N) a
# s9 H* R7 `- `, a 11、联合字符或者多个列(将列id与":"和列name和"="连接)
y* o. K! X$ B. U/ G8 k select concat(id,':',name,'=') from students; A' e9 m+ V) M$ l
& b5 p, i% I9 ]# a1 i
12、limit(选出10到20条)<第一个记录集的编号是0>) u8 \% ^. ?$ a o
select * from students order by id limit 9,10;
+ Y7 ~# n4 \' n
: k* A$ a: i6 I+ \ 13、MySQL不支持的功能
. W; H) [/ Y1 E$ i) S M1 `, V 事务,视图,外键和引用完整性,存储过程和触发器- o4 ? M2 S. L
$ |7 b) I) S) h
% q( x1 l- \' f: g, X8 G/ l2 u7 ^ 14、MySQL会使用索引的操作符号: ^) D. q; b8 y1 H
<,<=,>=,>,=,between,in,不带%或者_开头的like
1 ?1 h; l( k3 x- B3 k, P( [) j
. j6 K+ l% U# {: C- |/ _( k 15、使用索引的缺点
6 O4 j& z8 m+ ]/ X2 ? 1)减慢增删改数据的速度;1 z5 `& y" T; x% Z1 d
2)占用磁盘空间;
4 E/ U5 ~+ N9 C. [5 f 3)增加查询优化器的负担;
& ?5 x( ?& O2 U( q 当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;- R; `; C4 U+ z9 `: l" E
0 U8 y5 E4 u. ^
16、分析索引效率
0 ?% F" F( r0 U2 O. Y& \ 方法:在一般的SQL语句前加上explain;) F9 J- r f+ Z6 T+ k5 c
分析结果的含义:; c$ R, i! s) B8 b( m8 f( b7 Y
1)table:表名;
" T4 o& Q# A6 e 2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;. @4 O6 p l! k
3)possible_keys:查询可以利用的索引名;$ T9 S8 b5 r9 @* S
4)key:实际使用的索引;
# k& O$ o6 ]5 O/ s. o 5)key_len:索引中被使用部分的长度(字节);
; T3 c* D$ A- u% d 6)ref:显示列名字或者"const"(不明白什么意思);5 f' y8 j7 L# @: L6 Q
7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;
Y. ?! V+ B! J8 w# B7 ]1 B7 q 8)extra:MySQL的建议;/ R! b/ ^ z4 d8 A k0 W# P
6 f: k1 N( d U c& d 17、使用较短的定长列8 E( J& y4 b2 K7 K8 G& M
1)尽可能使用较短的数据类型;
: L0 a0 k$ H+ V5 m3 W7 U0 N 2)尽可能使用定长数据类型;
! U0 s$ z* l8 u7 V/ V6 q8 K a)用char代替varchar,固定长度的数据处理比变长的快些;
8 b9 l, Q$ [; I3 A: H2 F: Z% } b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;
6 J8 v; p ^/ W2 h0 r! m# e9 W' u c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;
9 K! c }, Q3 m d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;# `5 Q; \9 a) Y
( {! l, I8 {/ `/ g, E* i, b
18、使用not null和enum6 d; A' Q) V6 N7 H2 C
尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;
0 p6 e$ I# C% i. Y 如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;9 ^4 ?2 i- D! F& @' s, O( C
2 f. J& f/ V' Q( @
19、使用optimize table, s Q I' E1 q' q0 b& c, O1 H: M& f
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;" E" r7 n0 c' Z" p& O
7 x y ^. d6 u# O
20、使用procedure analyse()
9 W- X Q$ w [ G I 可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:
' I0 s) n3 x- ]& j/ C# i select * from students procedure analyse();
2 i! P8 F! b( ?9 f select * from students procedure analyse(16,256);0 ^8 g1 u: b: a4 v
第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;, s, y) ]5 @& C
$ A; }+ l- p- R+ l' ? 21、使用查询缓存8 K/ e6 p7 x7 b; T& ]( O
1)查询缓存的工作方式:! r. w7 H6 q5 _# ?* Y
第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。' n. I7 l$ v: m* |5 b+ p0 A0 g8 I
2)配置缓存参数:
+ i2 z7 v2 y" P+ |+ S' i+ B4 P 变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。$ v- Q8 M4 {4 G4 Y# x9 b7 p8 K
5 X9 r6 h/ f* x( k; ], c' i p) Q 22、调整硬件
. B4 U0 }7 O% N; L5 E5 Y l) D 1)在机器上装更多的内存;; a, G' B3 w1 ?( ]% S2 a
2)增加更快的硬盘以减少I/O等待时间;
. R% P7 l8 K# l. b, S 寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;& C* Z+ ^- {- }2 e
3)在不同的物理硬盘设备上重新分配磁盘活动;
]# x# I% }' v% E 如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。
# j: H! C1 P+ \ |