启动:net start mySql;0 Z1 r( k# a6 d6 l4 r( L
进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;
/ q# a- R5 K7 i 列出数据库:show databases;' ~5 Q/ `. Y5 p/ x0 g3 H* }
选择数据库:use databaseName;
8 d: C4 |) W2 }6 H" S- s 列出表格:show tables;) Q9 R/ G4 v: k
显示表格列的属性:show columns from tableName;
9 {8 l, ]2 C: k& t) S% g 建立数据库:source fileName.txt;0 U+ t. J: f) \/ _, h2 s0 P
匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;0 d, {9 X( J- X: a9 k* p
增加一个字段:alter table tabelName add column fieldName dateType;! S! k. q% t" n. w' m+ C
增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;" @ |5 }- ^0 D$ y
多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;
- M; \; R7 C6 {6 ? 增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";$ X5 H, u& T' ?% m
每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;
7 A& ~/ Y8 O5 G, ^) i: R* v 查询时间:select now();
( {3 [, P" N5 X1 X- X4 \5 b4 e 查询当前用户:select user();
8 t8 w7 P/ Q; w+ J1 y+ Q0 Z4 t 查询数据库版本:select version();- i$ ~# e* o+ y! C% u
查询当前使用的数据库:select database();
6 d2 e) V$ ?' c8 K5 h1 ^
6 M1 m0 d. @" O$ l( _5 s0 E3 \ 1、删除student_course数据库中的students数据表:5 D" i" Y; V% y+ o# `% |6 K* v
rm -f student_course/students.*
# G$ B: D7 g6 R% v / O H6 h# s& e
2、备份数据库:(将数据库test备份)2 N2 Q. c' G; }+ R& I
mysqldump -u root -p test>c:\test.txt
# p2 N" D7 p/ b9 Z* ?! }4 u 备份表格:(备份test数据库下的mytable表格)3 d) I2 i" H2 _* H" i, W- `
mysqldump -u root -p test mytable>c:\test.txt; l4 \( y& F f6 ~' G+ h0 W& ?
将备份数据导入到数据库:(导回test数据库)5 f3 Y$ M0 Q6 a+ g
mysql -u root -p test<c:\test.txt9 e0 w# y) z, y/ m
+ p& G+ B' g) x! _. Y* t# [2 o G7 W( c
3、创建临时表:(建立临时表zengchao)
+ j8 y }5 t/ Z) b" T create temporary table zengchao(name varchar(10));
4 r+ d M4 i: C. k7 ^" [
. p! @/ G1 W+ ^5 z1 g# T 4、创建表是先判断表是否存在9 C6 R+ l" D+ M; a" @# [5 y. i
create table if not exists students(……);- I: \3 v: @0 [0 S9 K7 x
* [9 v2 y& G2 c6 F 5、从已经有的表中复制表的结构
8 V h% `' p3 v. b" U create table table2 select * from table1 where 1<>1;
' c# ~. m' c# I, N [. E O; @ ! \1 L( A3 F# d% A! C/ J
6、复制表
" u7 K4 x- `: o9 p# U. s, F create table table2 select * from table1;+ b* a1 I: m1 n) s" Q( B" o2 y! y
! W1 `1 x- X c6 ^ 7、对表重新命名$ L+ E X) q5 X& C# h0 b1 X
alter table table1 rename as table2;
6 v% W# Z: ~* E
" l2 E ~8 z1 c# M 8、修改列的类型
6 n1 y/ X1 ?* i) u" ?0 g+ O alter table table1 modify id int unsigned;//修改列id的类型为int unsigned
8 e& ^" N2 i' h" i) J0 s% V6 I alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned
# p) ~ k: k: q6 N; h: H
0 r) E+ n0 M" F: r7 o: {3 b 9、创建索引- J6 J& {0 r* C5 p6 R" C
alter table table1 add index ind_id (id);
9 B, ~# k- R4 b, | create index ind_id on table1 (id);9 V3 L% M9 V! L9 h5 T, d. K
create unique index ind_id on table1 (id);//建立唯一性索引
9 N1 K% D5 w7 w/ ^1 a; i$ Y " ^5 h- G: q1 Z: g+ `+ j
10、删除索引5 c' N' D8 w- W; [3 t
drop index idx_id on table1;/ Z0 Z1 x8 n! b: h
alter table table1 drop index ind_id;: @& h7 C7 x& C. r1 d
8 `' X$ z. X1 @) I6 O
11、联合字符或者多个列(将列id与":"和列name和"="连接) q% }+ O, U+ z/ h, B
select concat(id,':',name,'=') from students;2 f$ t1 h# N. a( b1 p+ V
3 c) c/ x9 \8 x( v6 h 12、limit(选出10到20条)<第一个记录集的编号是0>
5 r1 }' o6 e, ~& q- { select * from students order by id limit 9,10;
' X! A7 a8 a4 {7 c' n& H' _7 A6 z) g
" E$ q9 w1 a a) ? 13、MySQL不支持的功能
/ ^8 x& x$ n( N% u( N. [ 事务,视图,外键和引用完整性,存储过程和触发器
" |1 [& |: n( n: q# Y* U% }* n* _8 t & ?' T8 b! S9 N' X! ]. @
, p& S1 k& L! o) ~/ t: |1 Y 14、MySQL会使用索引的操作符号4 S" ~" V) @5 a. w4 A- L% o
<,<=,>=,>,=,between,in,不带%或者_开头的like: G. f4 V: ` N. P+ j* h% H: e
3 \/ |$ k. F! V. d& I0 c
15、使用索引的缺点
7 r: I6 l/ d- _3 q! O k( w 1)减慢增删改数据的速度;1 Q. [6 Z. M+ J( M. @
2)占用磁盘空间;
e0 ?0 u( g# W. M; T4 ~ 3)增加查询优化器的负担;
# j! }4 Z1 I& i4 A' G& l8 H7 @4 D 当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;
& S( z2 h3 Z) v: T: a- h6 d9 S8 f
, H/ `3 l7 ]! s( q( ^ 16、分析索引效率) ]" T2 K# b4 n2 L+ }' w
方法:在一般的SQL语句前加上explain;
; l4 ]6 z2 z# } 分析结果的含义:
1 M5 r6 J0 B0 U% w A) L5 G/ Q 1)table:表名;
2 n% ?& E" i/ L/ Z 2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;
# A0 x+ J" W6 U# f- `' B: m 3)possible_keys:查询可以利用的索引名;
# c8 O; K2 d; V 4)key:实际使用的索引;3 @# D/ a; ]1 \ r g( r
5)key_len:索引中被使用部分的长度(字节);
" d6 s1 E8 l: R( R 6)ref:显示列名字或者"const"(不明白什么意思);
8 | N& A7 @ d8 T$ n/ L0 { 7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;
# l2 V; U9 y+ l, @% _+ J% E5 A" Z 8)extra:MySQL的建议;( C7 \2 I( W9 O+ V; d4 h
+ ]* }9 U. \! l3 ? \7 @5 h
17、使用较短的定长列$ x+ u; J' Q+ t* T, N; e. w
1)尽可能使用较短的数据类型;
2 ~" J% e9 Z. \* F 2)尽可能使用定长数据类型;
- x& F3 g: n; i+ a8 n0 D a)用char代替varchar,固定长度的数据处理比变长的快些; F" L+ H; ^- w2 g, G0 G4 R
b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;
+ A0 h H. F6 w/ L/ E c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;& P( [% L5 d1 ~0 Q. [, L
d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;$ [% Y3 a! K' g% d; @
1 e" h6 B+ y, J) Q6 V4 `# g) } 18、使用not null和enum
+ h& }8 _5 p. j6 e+ B W% C! q 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;
" s x) Y' _; \4 Z 如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;
, c2 {, V$ _7 u8 |
" g! B# C; w: d3 s c4 f 19、使用optimize table
; F2 O5 g+ ?- w: n 对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;
$ ^% ?$ Q6 p: \( j4 w. R h( @. Q
! Y5 K* o! E( g M 20、使用procedure analyse()
7 q# O B3 @) R, M 可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:* l) K% B6 i) o/ {" I/ q9 e- Q
select * from students procedure analyse();
6 Z0 h% R* K( g! W; n$ @# c select * from students procedure analyse(16,256);' f# @7 B" t8 a2 ]
第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;
, M( N/ [! Y* r/ y9 w4 d& H
( s8 X1 S/ D3 m 21、使用查询缓存' I4 Q! z# D: u. h6 Q6 F
1)查询缓存的工作方式:# O) v3 O' q U- a4 V4 j( t
第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。& u6 \: R0 ^. B3 A# {" U* k
2)配置缓存参数:. d# x+ J6 G1 q8 K
变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。/ X. r) c6 E4 H+ O* O/ b' z
, d$ g: M2 G) `8 H D4 y
22、调整硬件( f$ r/ @8 l2 j
1)在机器上装更多的内存;2 c u( e, L: q5 E, `0 [
2)增加更快的硬盘以减少I/O等待时间;- g& S+ a5 F, Q% Z, S& P# l
寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;) h; c$ I, O6 \; w% |
3)在不同的物理硬盘设备上重新分配磁盘活动;
: g9 X/ i' u f 如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。! g& j6 ~/ o9 b3 V2 {$ j% I9 @7 E1 ?
|