启动:net start mySql;
+ f4 H: D4 N4 I- l: Z+ v 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;
; d9 [1 [6 v! u: K% H3 D& z 列出数据库:show databases;/ m4 o9 Q% |1 A' h1 c1 M
选择数据库:use databaseName;
4 O+ |- E$ J: Z0 r- g' |- f& | 列出表格:show tables;# v: z/ f) J! K$ X! C$ b
显示表格列的属性:show columns from tableName;
5 g, T {& N# w/ r* H- Q8 \, _ 建立数据库:source fileName.txt;
& J6 Z. x3 Y0 W3 c* F# f 匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;
6 {3 `5 n1 G4 K, ?% P+ L K; K! H0 X 增加一个字段:alter table tabelName add column fieldName dateType;
9 K9 d2 z5 a1 I+ l' u1 L 增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;
1 {6 a% f: C: y6 e7 X* X 多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;
2 \7 ?3 F; P* `4 G2 m! ]3 `7 L 增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";( d, o1 i' c, J7 {
每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;( i# K+ ?8 m3 U, ?/ B' ]9 h& H
查询时间:select now();
4 U8 {% R% w$ ~$ ~ 查询当前用户:select user();
% k1 o0 q" m% U; A: n 查询数据库版本:select version();1 r0 O( u6 Q1 q' _; y
查询当前使用的数据库:select database();
2 N6 ~" s# O2 X# b. z: l # t% J; Z& i! R4 ]: l
1、删除student_course数据库中的students数据表:
# H: R' M$ @* I, R3 U rm -f student_course/students.*0 Z, @* D/ \, ~1 L% [
, i4 V4 h5 y5 F/ R9 K9 b" j
2、备份数据库:(将数据库test备份)" ]' |$ t( I6 o6 }
mysqldump -u root -p test>c:\test.txt
: y8 W# h5 u$ ]5 q0 p, F7 n 备份表格:(备份test数据库下的mytable表格)4 p8 d* q2 p0 H; |! L' v& L+ q
mysqldump -u root -p test mytable>c:\test.txt5 n7 s. H) {& l5 B7 G
将备份数据导入到数据库:(导回test数据库)
" u& V) r( b2 F1 E |7 G7 B mysql -u root -p test<c:\test.txt2 ?+ k {' f. l2 l
6 k+ T. Y6 I& N# {( K% L; s# W. d 3、创建临时表:(建立临时表zengchao)" A8 o$ c; I+ o/ c& n# N. f; k- n
create temporary table zengchao(name varchar(10)); ^1 u7 t) I0 E" m+ R
5 U0 y& h/ f0 m8 {; t# i }+ z
4、创建表是先判断表是否存在
_: t3 d& A$ u5 J$ R create table if not exists students(……);
: J5 @. f, u6 G) ~* |
* q! E k2 K1 l/ ^. E 5、从已经有的表中复制表的结构
/ x6 v+ r) C. o: h/ R create table table2 select * from table1 where 1<>1;
! ]& u+ ]- m! n# w# _+ O ; e9 ]/ b. y7 N j3 ~
6、复制表' x8 d; E3 m$ q+ ^0 i5 W
create table table2 select * from table1;& T) M+ M# ?" ?! P, k& S9 l9 I
; w8 @! U3 G/ ]6 d: n0 [1 d6 Y
7、对表重新命名
0 Y+ ~8 v# Z8 u c% J6 X- j alter table table1 rename as table2;
# a: Z- }; k4 l: P% t 3 `% A8 r; z4 U& N2 ` e# }
8、修改列的类型5 j% l( ^7 n& C7 z- l0 j; L0 F
alter table table1 modify id int unsigned;//修改列id的类型为int unsigned7 ?- b& Z0 c l9 |3 J
alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned
: s8 S( A; h1 [+ N9 M. [$ S, M; M7 P
7 s3 j. f; J! y m; L2 P' f 9、创建索引
6 g5 A. _5 e& a, k8 K alter table table1 add index ind_id (id);* Z9 U) f' _6 ~0 v- ~
create index ind_id on table1 (id); Y) y9 f0 B' S2 m9 b8 O0 c! a
create unique index ind_id on table1 (id);//建立唯一性索引0 b, _/ y& c2 j6 O
& `: M. A v# r( v7 n! I. l 10、删除索引
4 N. `% R' v$ ^. \ drop index idx_id on table1; Y0 E% @/ J3 a
alter table table1 drop index ind_id;
* d( i6 ~8 b; B: y7 ?, V9 Z7 V ( ]% U* F: z. H
11、联合字符或者多个列(将列id与":"和列name和"="连接)
- c' H6 [2 w# \: n, H select concat(id,':',name,'=') from students;
2 N( V5 ?- E. x, b9 M
9 P3 S5 h5 D. o! V7 z/ e! u( ? 12、limit(选出10到20条)<第一个记录集的编号是0>3 A* Z D, `3 T$ b( y' k
select * from students order by id limit 9,10;
& K7 x, e: J2 e0 {1 b$ w, e
" f# C" F9 _- W& P 13、MySQL不支持的功能
7 x& {. e4 p% l$ L7 Y 事务,视图,外键和引用完整性,存储过程和触发器
1 o% s9 P1 Z7 Q% x% }- V
F2 [7 R- V/ e' ~, d
- G) U) O; z- }* S! k7 S6 s 14、MySQL会使用索引的操作符号
( d6 O7 d$ S3 H! O/ \ <,<=,>=,>,=,between,in,不带%或者_开头的like' a( \$ u4 e2 ^3 V! n! o
9 q6 A; b0 E' B
15、使用索引的缺点' E. U! j% |4 o: m$ E
1)减慢增删改数据的速度;3 Z9 O" O. o4 m5 r. u2 C$ \, P+ u
2)占用磁盘空间;8 V/ s7 U6 [1 e# s3 M
3)增加查询优化器的负担;
8 i) k6 F8 n! S2 K; _/ Z 当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;
1 M" J# q) n1 U ) ?3 P+ o7 I4 z0 ?
16、分析索引效率
& U. O I4 K6 n5 O7 a' ~ 方法:在一般的SQL语句前加上explain;
1 t# S# Y& r2 ^$ `# E! A$ x 分析结果的含义:1 W% K# |+ A5 V1 v# \
1)table:表名;. v5 h5 g9 ]- k& x' a# [3 _8 l
2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;
. p q( }5 I8 ?. |' N) Q' l' | 3)possible_keys:查询可以利用的索引名;
4 t5 R: I3 p( k1 N3 x 4)key:实际使用的索引;& W3 j; m9 B& F R( G! q. J9 v
5)key_len:索引中被使用部分的长度(字节);
5 }* ]0 k6 J: z6 k( m; |4 R9 h 6)ref:显示列名字或者"const"(不明白什么意思);" Y8 ^4 b9 q( `7 d5 Q" Z8 |
7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;
' b, O) M: \% F3 p: e 8)extra:MySQL的建议;
5 H, p3 ^$ x/ y5 m0 n: _9 X2 Y' U
4 L: d- m! F8 N, } K; q& Q: N 17、使用较短的定长列+ z2 @7 X' I+ N' W
1)尽可能使用较短的数据类型;
7 M$ C5 W9 `) P' v 2)尽可能使用定长数据类型;3 h' Y u4 g0 s, f
a)用char代替varchar,固定长度的数据处理比变长的快些;
: q( U+ W( q3 p6 P6 p* ] b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能; U5 f; x4 Q5 D# b2 M- M
c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;6 ?+ C ^' s! {% B. S
d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;
* b, x. y% B' H2 b
; d5 B5 A; C" E) {7 l% [- _ 18、使用not null和enum
" s3 x: T2 H- v 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;# f( v# o) a% H- z) [
如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;
3 T8 V) h' |+ b+ w
) b; z! H2 H8 K) x( g/ D! h& v7 S 19、使用optimize table( w7 |5 t- G* ~* p
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;
# O; n# J8 |& G, X' b4 Y; h
6 V$ W, @- f% x8 f# y 20、使用procedure analyse()
6 X) p4 m! ]7 f: p- l% C/ f 可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:- I1 R, u/ _5 @8 m
select * from students procedure analyse();
2 E5 ~% j2 T; G* o( h0 |& z* F select * from students procedure analyse(16,256);4 e$ l9 ]1 U K
第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;' b2 K" [/ ~; y, U# o: _
& E2 K5 I% A! G 21、使用查询缓存4 ]9 i4 c, Z7 a
1)查询缓存的工作方式:5 ~2 L' `/ V; L0 \- ]. m( _
第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。 n5 r |6 B% R2 l
2)配置缓存参数:% @. ~8 t7 F0 A( o6 ]
变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。
~$ Z; m5 |4 e; h8 X4 B5 Z+ J
5 k2 f2 z; y6 p6 w- V8 ^# j 22、调整硬件5 E( J$ w: ?. w9 b
1)在机器上装更多的内存;
2 t* v, W$ c8 V: ^* W 2)增加更快的硬盘以减少I/O等待时间;
2 C) `: Q4 ?: g- _! k 寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;
: F7 z' y( P P$ A 3)在不同的物理硬盘设备上重新分配磁盘活动;: J9 \0 q6 v {$ u5 M1 p5 v
如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。& R# r. R: S# o# ?5 T$ ?
|