启动:net start mySql;
9 }# }0 }9 ~" D 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;
6 c: ~/ Y% Q* _/ o! u0 V" I 列出数据库:show databases;
3 I$ j7 f ?3 L+ ~2 L: S' ]6 ^1 _ 选择数据库:use databaseName;
8 g$ l$ \# D9 w# Y- g 列出表格:show tables;
# M4 X/ N& b* H- A 显示表格列的属性:show columns from tableName;
' Z% I; J( L. U8 N) Z 建立数据库:source fileName.txt;$ B( X* z6 q1 R5 u
匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;3 g" q" Z: i9 A4 \& T" X
增加一个字段:alter table tabelName add column fieldName dateType;
, W2 D3 T6 P) W J+ d 增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;
) f2 }, J; L+ o 多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;
g# O4 \2 ~" A, \! {) {% g 增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";
9 T# d" M8 _( p0 X( x" _% \; _ 每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;! u. _* f' [% g6 d- u& Y" T( k
查询时间:select now();( J+ u8 i; N$ `/ B0 t8 Z/ w
查询当前用户:select user();
% ?% Q s4 l2 | 查询数据库版本:select version();% f' T# G" i' N4 O+ A. d* J
查询当前使用的数据库:select database();
8 c0 C; d3 s" j# l, g% s8 c! _
" ^; f7 X9 {" ]+ b6 w 1、删除student_course数据库中的students数据表:7 S/ m F. c! W$ d. K. K/ f4 U. @
rm -f student_course/students.*+ N1 M6 q' ^' s1 \1 @6 L8 n1 s
: U2 G; y$ R/ H% \; |9 ~/ v
2、备份数据库:(将数据库test备份)
5 V' h- \& g3 x" ]8 [ mysqldump -u root -p test>c:\test.txt
$ y9 z3 w) Q- W: C8 s) N7 G& @. T 备份表格:(备份test数据库下的mytable表格)
( V2 [$ u2 K6 s$ {7 Q$ @' H! ~ mysqldump -u root -p test mytable>c:\test.txt& t2 ?4 p* x. B- U" q$ L i
将备份数据导入到数据库:(导回test数据库). p' n1 I [/ j9 x* G: C
mysql -u root -p test<c:\test.txt
6 {% V% E0 t7 c0 ~- k ! B; J. R5 i' T# l1 c/ @$ [5 }, `
3、创建临时表:(建立临时表zengchao)8 p9 J' V8 `, B% T4 i
create temporary table zengchao(name varchar(10));& h7 ?& q A! T! S9 w" S- C
. z0 }) x9 [" u: Y& `1 t( A r
4、创建表是先判断表是否存在
8 y4 w5 z, D3 v: n A G' }3 x/ q create table if not exists students(……);7 M! M+ D/ x' _9 g, x
7 V4 C8 j. Q/ l2 ^ 5、从已经有的表中复制表的结构
; C K* d$ _, u6 M: d* y create table table2 select * from table1 where 1<>1;* _ v. M, G, \( o
# r$ K. H: H) p 6、复制表9 x/ |% p$ O, g* ]
create table table2 select * from table1;' a% v+ T1 X) k6 I+ L
( s; I$ G4 N0 t" m# p$ T! [* a
7、对表重新命名
9 m7 P: m; s/ W$ ^/ p# V K7 ^# a alter table table1 rename as table2;
: \" u; i( H" i& F- z ; U* r. C( s' v% m! _
8、修改列的类型2 A ?3 k* y; H* E& ?4 ^
alter table table1 modify id int unsigned;//修改列id的类型为int unsigned: ]7 w1 E! ?5 K
alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned& y( A+ P! A4 r0 J1 A8 a
: w* l6 W& d( G7 z6 W5 ]- P0 T/ d
9、创建索引
! t1 R* B& K, I) M8 k* M alter table table1 add index ind_id (id);! T' B7 u/ U4 C$ ?8 w5 Y- a
create index ind_id on table1 (id);
3 K. ~& d+ e% p [# H' [% R0 S" G create unique index ind_id on table1 (id);//建立唯一性索引
7 Z$ ^$ O* y& x* D 3 \* S8 U/ x% g d$ d1 T
10、删除索引
/ I- c+ C* E3 Q: o+ v) d% g# } drop index idx_id on table1;
, u$ t" s9 s7 }1 G alter table table1 drop index ind_id;1 j! _, J) H: _1 ?! F0 I& z: k
h( h( @& k" ~0 F) c9 |$ ]
11、联合字符或者多个列(将列id与":"和列name和"="连接)6 Q% n* j- P4 F# Z% W) y4 S
select concat(id,':',name,'=') from students;
4 F6 r5 ?- b! h* ?2 k) l ! \3 G( ?! H, Z; |; }/ o' y. m3 i
12、limit(选出10到20条)<第一个记录集的编号是0>
9 X- L' u/ L Y( J7 Z8 G- h* o5 q( [ select * from students order by id limit 9,10;7 S/ u3 e Q1 W$ N
# h! E" M9 g" \/ s9 ~+ d7 P 13、MySQL不支持的功能& Q! J( {0 D0 G0 [ W1 j+ N7 Z
事务,视图,外键和引用完整性,存储过程和触发器
, g9 ~! c( [4 a5 n4 V# J6 h
" x7 x* p' I! h# S. z 0 |2 ~7 w5 D+ V- K- C
14、MySQL会使用索引的操作符号
9 A# K* _0 S' x: d o) |" k5 k2 [ <,<=,>=,>,=,between,in,不带%或者_开头的like# C# N# a/ g- [ n0 B0 a- B/ p! E
6 b: u$ K- m7 e/ t5 m. M
15、使用索引的缺点
0 T( m- s0 o# {7 ?' e 1)减慢增删改数据的速度;
5 J6 P) D& x: ^3 C. k 2)占用磁盘空间;( |6 D- `, ~8 \: q! G$ @8 I
3)增加查询优化器的负担;$ v: }7 t& _0 q6 A7 Z
当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;% i( o4 _1 | F ]: \2 `/ F
- x+ g. O/ r: ~& [
16、分析索引效率7 P% ]& z, \: A3 x! Y( s2 U
方法:在一般的SQL语句前加上explain;
; }+ ^9 {! v% W8 O+ r 分析结果的含义:3 h H2 [ j9 E" z3 s/ l" N6 g
1)table:表名;
$ o. J. K1 ?) ~/ j6 d: Y7 A 2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;! B9 b( q4 {7 T/ H( d
3)possible_keys:查询可以利用的索引名;
) X# y9 ] Y$ w! X3 C 4)key:实际使用的索引;# p! S: i# X; U1 L
5)key_len:索引中被使用部分的长度(字节);
( d: t) T/ A& l, q& ] 6)ref:显示列名字或者"const"(不明白什么意思);: |" x2 c/ C: E7 n+ F% H
7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;
" j8 u7 `$ Y5 K( x: h 8)extra:MySQL的建议;
" C5 P) E; {! o / v( D2 S c" Y% ^5 v" R
17、使用较短的定长列. l3 D' p2 b7 E' ^7 _
1)尽可能使用较短的数据类型;
3 ~/ t! j# S: @' `5 e8 e4 V 2)尽可能使用定长数据类型;
! X8 m9 u5 O* h- W! w0 t a)用char代替varchar,固定长度的数据处理比变长的快些;6 K# H; I9 a5 b# B+ b4 x
b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;
" K5 \% p, H2 i( ]7 b+ R c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;" D8 U2 {* R$ u, M& S& d
d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;* \; d8 a9 l- y) f9 U! J
9 j# P2 }3 t3 {1 \( z 18、使用not null和enum
0 L! v: | y" w2 y 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;
3 U9 }* R9 y) z 如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;( l7 m2 g3 } M. s5 a
( w. }9 Y: v9 o9 ?& @
19、使用optimize table
" [) v# _6 p! V6 T" X& n5 W 对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;; Q* g$ I; Z/ ~8 c
1 b7 E! w3 X4 u, I# f$ u
20、使用procedure analyse()
6 A& r( G* U' ?& I- ~) c 可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:
( a" b9 K" f/ }! n select * from students procedure analyse();
3 y6 @4 L% q/ o* _8 Y select * from students procedure analyse(16,256);& Q4 s2 @1 a/ Z ~: D
第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;
1 B& E; S+ f# r
, Q! y7 r0 g& M9 L: Y5 Z" [ 21、使用查询缓存
1 [$ U2 C8 j* `8 Q8 n8 [ 1)查询缓存的工作方式:9 f0 g3 O/ C' [2 N$ V! }
第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。
2 m$ p1 F# @. V! U4 S 2)配置缓存参数:
- ]" p9 d! f- h& H. G2 b8 s 变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。% y5 G. t& _9 n- \
& Y( L) t/ s7 u4 J/ X% t4 Y
22、调整硬件+ k7 O* `: ^# t3 p
1)在机器上装更多的内存;2 }8 ~, u. H6 l- o6 o6 o2 q
2)增加更快的硬盘以减少I/O等待时间;8 x0 \! Z9 g' q2 y/ k
寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;9 J% D4 u, E; h- A. [$ A6 g% ~/ i( p
3)在不同的物理硬盘设备上重新分配磁盘活动;
6 V* r5 {& R, E4 }, ] 如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。& l. q. V6 P& m2 I5 n
|