启动:net start mySql;
0 E4 U) T$ w! u/ b1 ^2 u5 u& }3 y- O 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;
% ]" I x' g+ k l1 S8 o 列出数据库:show databases;
* \6 a w: @( s/ j 选择数据库:use databaseName;& h: a/ _ {7 S! L) j4 X
列出表格:show tables;
$ B/ C: j+ p0 H; ~! @ 显示表格列的属性:show columns from tableName;8 W. p) d4 @2 y. N
建立数据库:source fileName.txt;5 r" A' i7 G9 U7 ^" G
匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;
! o# G/ l k2 }. Y- p% O$ F 增加一个字段:alter table tabelName add column fieldName dateType;( m* ^7 F* Q/ o+ j/ x8 g! _
增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;
% n4 c; Z7 T# J# g g. M9 i 多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;8 ~+ `1 d4 Y1 Z. y- A
增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";: q% g- O5 s5 o$ |8 Z B) g) w8 U
每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;5 n! @+ L! Q8 T7 H
查询时间:select now();, Y2 o2 }' o( g- L. \& F) a7 m+ j
查询当前用户:select user();
: I4 M) U" R0 o9 v, b 查询数据库版本:select version();
) `) f. ]7 x2 c3 O$ ^ 查询当前使用的数据库:select database();+ f* A0 t5 P3 F/ n: O7 n
( G' D& Z: ]- P4 L( Y$ [/ H
1、删除student_course数据库中的students数据表:' L) S0 M5 H+ A+ s6 e V
rm -f student_course/students.*" T, _- @! Q4 d7 P1 e: }! \
' X+ k( [/ s3 n$ i1 o6 W 2、备份数据库:(将数据库test备份). @1 u* W. D3 j y
mysqldump -u root -p test>c:\test.txt! m9 F1 b* o" X
备份表格:(备份test数据库下的mytable表格)
4 d2 w3 ^; ?9 n8 w* R2 b4 L1 g! q mysqldump -u root -p test mytable>c:\test.txt
+ @1 L6 V* u% H8 h 将备份数据导入到数据库:(导回test数据库)
0 e2 C! q$ a9 e- ]4 X& ? mysql -u root -p test<c:\test.txt( ^1 @7 y5 {! M0 T* i V; J
8 x9 f/ ~' z6 D5 @9 }1 z: s 3、创建临时表:(建立临时表zengchao)
% n- A' C2 {$ H! [2 o create temporary table zengchao(name varchar(10));: V- B7 y7 r# E- P. P. E5 {
3 i# p4 P0 p0 w+ ]' R8 f 4、创建表是先判断表是否存在* ~& z% f3 Z4 H3 X" Y
create table if not exists students(……);
' W* o* A% H$ I. t 3 J" ~, C4 {% X+ A$ O5 g3 ^8 j e
5、从已经有的表中复制表的结构* \ W5 K9 I5 |" j, j
create table table2 select * from table1 where 1<>1;
1 F6 K3 T7 o7 W0 G) z 7 e/ r- f3 f- \* H3 K/ P- z
6、复制表% u" e5 y: h# M) @: \
create table table2 select * from table1;; ~" ?# n- s4 J8 o
+ Q! }; C6 _. m8 M9 N 7、对表重新命名# F K& r" ?2 E( Q
alter table table1 rename as table2;
/ _4 J, ?: L1 M# K
. D4 q. f; H+ v- i/ {. |* B 8、修改列的类型& Q5 A5 j+ o* Q7 K* D& Q" x9 v
alter table table1 modify id int unsigned;//修改列id的类型为int unsigned/ ^0 c( i! O- x/ X+ o0 V
alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned
q; G$ m8 b4 l2 }, a
1 L5 O% Z* y" g( h 9、创建索引
/ Y: R% C& ]) | alter table table1 add index ind_id (id);+ g: c R7 V! }- t$ B
create index ind_id on table1 (id);
. z2 ^& Y4 d/ T( `6 G0 ?8 e create unique index ind_id on table1 (id);//建立唯一性索引3 X3 I5 t: I! g9 I/ a" ~0 P
6 T( t# T) A7 J- y E3 O! u. i* Z5 ]
10、删除索引
4 v# k J/ P) u8 C/ Y$ p0 u drop index idx_id on table1;2 D# d' A8 p; u9 K* r
alter table table1 drop index ind_id;
2 |! A7 p# j0 q6 J! |
7 S7 r/ K/ ]' O0 h0 q/ t1 w. r+ ~4 S' @ 11、联合字符或者多个列(将列id与":"和列name和"="连接); w- ?% `- d E! `6 e- ~
select concat(id,':',name,'=') from students;1 W9 Y2 H4 x$ U' J$ o, O" f5 W* o& V# _
' O( ~; @' C& i1 q6 o' H9 ~
12、limit(选出10到20条)<第一个记录集的编号是0>
2 |( J1 Q# S, g( w! f select * from students order by id limit 9,10;
2 p$ K4 D% ^( c8 s
% L$ r; |( u: | 13、MySQL不支持的功能+ k$ R2 W& Y. s0 ` V
事务,视图,外键和引用完整性,存储过程和触发器
0 e/ H w, y+ Q3 R! O& q. i. N / x/ L$ a' y1 n
+ D: m5 m" u9 b/ z! T
14、MySQL会使用索引的操作符号& \0 {6 T! K) m+ [3 X2 ]. N
<,<=,>=,>,=,between,in,不带%或者_开头的like
& M" q! I) l' q6 P" D! Z 5 Y* U. J9 I2 G/ }
15、使用索引的缺点* T) m% A$ X' J3 l# r6 ?: |2 K: G* ]
1)减慢增删改数据的速度;! J1 J* u2 y9 G" _! b
2)占用磁盘空间;
0 c2 {! V9 E& M5 i% s1 N! _- c 3)增加查询优化器的负担;
/ C2 f/ K5 w2 ~. Z# c# X) S/ E/ A 当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;
4 R% W( K2 j, E' @6 d8 |1 \) `' o1 v' ? ; t5 ^. `4 ~. k+ o. E! t' f
16、分析索引效率
/ \) Z6 `4 K0 W0 p" b) b 方法:在一般的SQL语句前加上explain;6 T! [5 }8 A8 S4 |3 v
分析结果的含义:& E( b4 k" f% K
1)table:表名;
' S- E9 _" x; j0 f6 p3 A$ C 2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;
- B, S2 _2 ?* ?8 J3 ^( ~) z0 H 3)possible_keys:查询可以利用的索引名;
( l- x( q9 P( \- v5 o9 e7 R 4)key:实际使用的索引;9 E( u! c/ @$ O9 n; t! i; L" p
5)key_len:索引中被使用部分的长度(字节);7 w G2 O0 {$ R t4 f6 Z
6)ref:显示列名字或者"const"(不明白什么意思);2 I7 Y8 |, {' h' S
7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;
$ { G# h. u( e. x3 Q 8)extra:MySQL的建议;. b/ A1 p+ y" K. r* O
! I$ C" S7 R8 X: q9 a! J
17、使用较短的定长列
7 Q; \7 N# w& \ 1)尽可能使用较短的数据类型;
: J3 u' w6 Y( D) E w 2)尽可能使用定长数据类型;4 K( X3 b, }, Z+ Z- Z, @$ x7 f9 b: R
a)用char代替varchar,固定长度的数据处理比变长的快些;
# f* s, I" Q9 O! @1 K/ I* s7 ` b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;' F+ C- K& J5 U8 S
c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;
& P% r. ]5 }6 z3 {, {1 {8 r d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;: ^4 S( s# C/ ?- r1 ^
4 a# |; c& g/ v
18、使用not null和enum
. H" D) `1 G5 |% H* u1 | 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;
; w! {3 j% H9 a0 I! A 如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;! G X) s* H! A4 R! f
/ G o' s4 }) F$ @5 p8 ~+ ]! T. g
19、使用optimize table4 N. C, V. j+ U
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;3 R. @- V; R1 N3 S
9 a, U9 w& u" u 20、使用procedure analyse()
$ _* f* I N0 P# t 可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:: y; g% _; r5 X; o0 K. Q) p2 M
select * from students procedure analyse();: P8 m6 U p" \5 p* Y! E
select * from students procedure analyse(16,256);
# t, u! C7 O* P5 y8 } 第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;) {; Y# i$ E) X3 |
8 L: X' I, P( q9 E1 W- o; [7 l
21、使用查询缓存+ ?- {: \+ R8 W: d3 o5 \6 K
1)查询缓存的工作方式:
! k* g! n% m9 ^* F/ J& {3 p! K 第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。
6 i" Y9 Z* O1 J 2)配置缓存参数:$ w: m4 d/ z7 H% _1 |
变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。
4 ]+ J4 G" |" j, \2 {/ s . B0 a R. d7 O1 R( [8 u' Z3 O* k/ K
22、调整硬件% b" Z/ c f) }1 a& D
1)在机器上装更多的内存;# u; B4 @5 b' f0 H; R
2)增加更快的硬盘以减少I/O等待时间;( [9 Z' p$ G. b0 ^1 o9 X1 j+ b/ O) t, ^
寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;$ x' f0 V/ Z v/ H+ p+ B5 T
3)在不同的物理硬盘设备上重新分配磁盘活动;% `( o3 e; q4 r+ Q( ^
如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。. B" O2 F0 S" k- a; p; `
|