启动:net start mySql; w- c, ?. I- T( u" Z; [2 p
进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;% R$ _$ ~( G$ T; f& @' ]' v
列出数据库:show databases;( J5 f( v6 i1 D9 [" E4 `
选择数据库:use databaseName;$ U$ O' t4 F& b7 X7 R8 J
列出表格:show tables;6 z2 b& j! B9 A
显示表格列的属性:show columns from tableName;# m( _# ]4 o, }2 g9 O
建立数据库:source fileName.txt;5 w- i5 C$ ~! h) F" F8 \
匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;
( ~4 e8 c* j: c* j/ I 增加一个字段:alter table tabelName add column fieldName dateType;% [ V5 ^" w1 |2 G2 `( M
增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;& D, V- {. @) ^# e, M1 j
多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;
5 s# b7 o3 Z5 } 增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";4 r7 v4 ^2 O+ _" ?$ _8 p
每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;: u/ \4 {+ U: F4 e
查询时间:select now();/ L7 C9 Q t7 i
查询当前用户:select user();' N+ Q! M4 V" J& S9 B
查询数据库版本:select version();: c/ \1 r9 b" x% z4 ^
查询当前使用的数据库:select database();
$ N1 l3 h$ k& V8 N5 Q $ W: D/ `! ?2 _0 k
1、删除student_course数据库中的students数据表:
7 n6 I4 _: k& c7 l& \0 z: h/ k rm -f student_course/students.*1 a; p. m/ F& D$ a+ B* O: z
! U' j! A( |6 c( O9 U 2、备份数据库:(将数据库test备份)/ I9 e2 n4 z% j% `; b
mysqldump -u root -p test>c:\test.txt+ h( V4 C* c2 T
备份表格:(备份test数据库下的mytable表格)
4 h( n$ c: R, t# v mysqldump -u root -p test mytable>c:\test.txt& f/ Q; I8 e$ z3 |" V/ F2 J
将备份数据导入到数据库:(导回test数据库)
3 b/ S9 V6 v# R$ Q mysql -u root -p test<c:\test.txt+ N# c# {# ]* g* E/ \
. d Y' r* C9 V1 e1 }% A% f( q 3、创建临时表:(建立临时表zengchao)
3 l- O8 \+ L$ `6 n7 B- k4 r create temporary table zengchao(name varchar(10));
/ i! o7 a$ ?$ ?' i2 |0 }
3 B9 Q( z2 J6 u& n+ l, o) N1 q 4、创建表是先判断表是否存在$ J7 S3 R& z5 a% x% e" @' m; I- K
create table if not exists students(……);. f/ g3 B& o* \, {- c0 i$ S. H
- ~& @% ~2 y1 t) ~! ?
5、从已经有的表中复制表的结构* h6 }7 X& C; V6 T: B: b n$ `* i6 K
create table table2 select * from table1 where 1<>1;
- y7 q9 O, Y3 u
! `, S4 _% e O4 W; I; Y M 6、复制表9 W# S1 l4 X2 ?3 L) `; k
create table table2 select * from table1;& }7 ?0 b2 Q$ n# `+ R) o( p, P
0 H' n0 o' K7 _: }/ k& O 7、对表重新命名
# t V) b7 w) e alter table table1 rename as table2;2 u6 l* N6 U2 H' }9 p( Y
! c1 z) x4 f% e
8、修改列的类型
+ |1 Q5 c7 ~/ F7 I7 u p alter table table1 modify id int unsigned;//修改列id的类型为int unsigned
' n7 [. A! m0 U0 A& _7 V$ M$ \ alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned- e: I8 o s# o# i" j' _
( Y3 u5 Y& d; A5 X! |: O7 I 9、创建索引1 k- V- W! n! e2 B6 U5 @
alter table table1 add index ind_id (id);
) X+ v; f# g8 e( H6 E. P* K8 R create index ind_id on table1 (id);1 J% `) \& W+ k! i+ f. i X
create unique index ind_id on table1 (id);//建立唯一性索引$ b% s' S F+ Q+ V- |, F% }
0 D V: W, n. P3 B# x 10、删除索引 f) {6 u Y/ b/ Y9 K3 K
drop index idx_id on table1;% A1 p+ M% t4 M, i, ^5 J9 M
alter table table1 drop index ind_id;0 Z7 A- a7 X, H Y8 x/ T; _0 h. K
! c' |3 W2 g) J/ p, m4 C# q 11、联合字符或者多个列(将列id与":"和列name和"="连接)# y8 O; {& J- Q. M- _
select concat(id,':',name,'=') from students;2 V- k2 X- U) E1 |, R
- F& J4 z7 \2 ~2 G6 y/ n
12、limit(选出10到20条)<第一个记录集的编号是0>7 h- z, x+ n% H2 S2 x+ f9 H# r0 }) {
select * from students order by id limit 9,10;
. i/ z* x! @; Z2 w& q" e7 J. R
4 d) y# `1 M/ Z ?% s 13、MySQL不支持的功能
j) G7 v W4 v' x 事务,视图,外键和引用完整性,存储过程和触发器
# u) v/ p# a5 Q4 n* R" q, b
, ]1 n7 W1 t" S4 u
6 T3 h0 B# o. ]' O1 D; ~$ w 14、MySQL会使用索引的操作符号
6 R" U" ^4 [% B5 S% ~$ A- u/ q <,<=,>=,>,=,between,in,不带%或者_开头的like% ^5 o6 @ w, H' j" `6 O
( L* @; t1 }9 `6 i; q
15、使用索引的缺点5 u: ~& V8 d& o% \; ~* d
1)减慢增删改数据的速度;
( O9 }9 B* g% [* b: V 2)占用磁盘空间;) L5 b, o U2 r- I+ z
3)增加查询优化器的负担;
; ]3 B1 [% }* g2 k' D 当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;: k4 {: }0 [& Y1 I( E# [5 I
1 C9 g, B# i4 X( x 16、分析索引效率
% {6 [* X- z: ?* B8 {; d 方法:在一般的SQL语句前加上explain;
) P1 N5 `( p+ R: Y1 R 分析结果的含义:
. r6 _2 C2 j/ I8 \ 1)table:表名;, \+ x6 ^( A A0 r2 i7 j9 O4 T
2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;' s5 C- Y) o" {6 ~. U+ q& z
3)possible_keys:查询可以利用的索引名;2 W; ?. `" p* y) Q9 E( X: @5 V& x
4)key:实际使用的索引;, J0 g- _. D4 z ^4 N% [
5)key_len:索引中被使用部分的长度(字节);; `1 q3 ?( ^7 L6 F
6)ref:显示列名字或者"const"(不明白什么意思);
7 `# n* ]* `4 [1 N. `7 E9 u 7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;# k D/ j9 B( N* f x; [4 p
8)extra:MySQL的建议;6 s2 H9 ]* ^0 y, M. d
- J: c" C; g0 ?. g) a; z 17、使用较短的定长列! `3 n7 L* r1 C' V( S' p; {
1)尽可能使用较短的数据类型;
G- V) K* p7 l 2)尽可能使用定长数据类型;& J! F4 A, d3 r3 u
a)用char代替varchar,固定长度的数据处理比变长的快些;
' F( T5 k6 W" o! M$ ] b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;9 I8 [1 s8 |" h% h* r2 l
c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;
+ {9 G8 ~# |! |2 q1 M! m, R$ E; ? d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;
2 a; m8 J- z" k$ f : T( ?) @7 k4 j0 H; L {
18、使用not null和enum
/ A) a/ I) q- ^3 E, l 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;
[% G7 Z. c4 |$ p7 z 如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;
! x# t( Z* B9 w6 P - |( D1 y& I$ K( F T
19、使用optimize table0 M3 M) X. ^( e5 c
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;& G8 s4 \7 L# b- H( V9 L3 j
' B2 k6 s* U' S
20、使用procedure analyse()4 c c8 {, m F# |5 g
可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:3 L1 k6 B* K" e9 e
select * from students procedure analyse();
( @9 F. V" q- _ select * from students procedure analyse(16,256);
, i% ~+ P4 f" x H* _ 第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;" T# F S0 {- k) {( S
6 H0 c: L, `. X1 u
21、使用查询缓存
( B% h* U1 b/ q- [' G 1)查询缓存的工作方式:/ J: |0 K2 L! c, G: b; f
第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。1 p& t, f/ {3 ^9 B6 V4 o
2)配置缓存参数:5 M4 D9 }2 p) Y# F* R Z
变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。, ^0 O3 d! w; e) G4 u6 G- Q5 U
, Z% s, Q; p& T( k) _( A
22、调整硬件
& ` Y- _8 d2 Y& G% l: \' E# | 1)在机器上装更多的内存;
" F R6 l6 A0 U. A3 z 2)增加更快的硬盘以减少I/O等待时间;4 D. t. a$ K4 h3 I# |
寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;, y( b, r/ c8 d5 g) f/ A' F
3)在不同的物理硬盘设备上重新分配磁盘活动;
; _9 J2 e3 d6 a& A( y" @ 如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。& J" \( o; F# h9 O+ X
|