启动:net start mySql;
+ U- a& G% X3 o* u% [0 ` 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;7 u8 @4 U1 B1 v$ T- J G
列出数据库:show databases;: k! d( E" V( A5 G& R
选择数据库:use databaseName;
- _- a6 N6 i( `9 q, P) k0 h/ I 列出表格:show tables;' y6 v" L/ I, h* t8 i4 c# @$ {# h
显示表格列的属性:show columns from tableName;
2 t% ~6 I( E1 R/ P 建立数据库:source fileName.txt;. o l, F$ j! U
匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串; Y% B& [$ b) j; ?$ g. `6 R
增加一个字段:alter table tabelName add column fieldName dateType;
3 ^; s) h" C9 j5 Q& x! J' t( W 增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;
& j, z% @( z. j0 W 多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;. ~8 ^1 T9 d6 d& p" U' n
增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";
* V) n8 k# E3 b' l 每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;4 B6 S, Z/ ^* ?
查询时间:select now();: h% j0 Q8 J# _/ O5 \) y! }
查询当前用户:select user();9 ^% m# S5 m% B' B4 t
查询数据库版本:select version();
* [, d% I' J! A( {8 ~ 查询当前使用的数据库:select database();, T- u4 S& v7 t! ?5 H* ]
( T" u) b' ~) u9 z+ o n 1、删除student_course数据库中的students数据表:) O: m! c9 b& C( n o7 O0 G
rm -f student_course/students.*, F( S4 r( g3 [( k
1 k5 M* o$ }/ x8 q7 E* w; j 2、备份数据库:(将数据库test备份)
( y9 F1 y( m* K# J' V7 n1 C7 M mysqldump -u root -p test>c:\test.txt7 P# Z; D' j# b
备份表格:(备份test数据库下的mytable表格)
2 _( `# T6 I% M: R' \ mysqldump -u root -p test mytable>c:\test.txt
w. B; U( C4 T0 \# C 将备份数据导入到数据库:(导回test数据库)
+ A8 O7 [( W. S- {7 S# U4 r mysql -u root -p test<c:\test.txt
* t |% O# @ l V- Y2 m4 h F. ` % x, O' }. J U+ W
3、创建临时表:(建立临时表zengchao)+ F7 |2 n0 s' U+ ]2 a6 H" @
create temporary table zengchao(name varchar(10));6 \$ w6 _1 `. O i ~
+ Y7 O" N$ I) d/ f( A7 C0 o 4、创建表是先判断表是否存在
% T2 Z+ ~% u: f: q* k create table if not exists students(……);
! t$ R% ^* G2 J5 r* u4 v+ r9 R) R $ m. _$ J8 K# m4 T/ T5 }5 p' d
5、从已经有的表中复制表的结构
1 C- M* U0 j" V$ x% ] create table table2 select * from table1 where 1<>1;% e5 }# s) b7 t6 X3 l
1 k8 G3 N9 q8 b- C' a 6、复制表
% p0 ^1 A" @: V$ q( x2 z% S create table table2 select * from table1;
% y' C: m% ~. y3 k* z. m. V
: _% \( Z% T) n0 g4 ?0 K 7、对表重新命名
" x: ]: C6 a1 p7 R$ n- R& I alter table table1 rename as table2;
/ M6 `1 j1 _* |/ h
2 |8 \, t* }1 \2 V2 \ 8、修改列的类型: H$ o# [ V: d
alter table table1 modify id int unsigned;//修改列id的类型为int unsigned
1 ~( h* x1 b! k" ^) T/ W. \ alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned
4 V- f2 z0 T3 N3 d' O W, W) y. l" p& Y
: ?( e3 N% ?4 r( S9 F 9、创建索引7 W; k/ e: C2 p- m7 V% P5 s4 p3 d
alter table table1 add index ind_id (id);
4 ^4 P1 n& m( `4 {3 N1 G. V/ V create index ind_id on table1 (id);6 L. \, Z$ C2 [9 T' ?
create unique index ind_id on table1 (id);//建立唯一性索引
- Z6 T# d f. F/ Z6 S" l
( D! b6 T5 k; c; d7 T3 R 10、删除索引
2 @* Y3 b1 [, T$ | s drop index idx_id on table1;
) H# ?* E6 q2 O: \ alter table table1 drop index ind_id;7 ~) B5 @5 M/ o; f( N; h
1 m# a' N# N7 f* @4 q: h9 t8 a5 w
11、联合字符或者多个列(将列id与":"和列name和"="连接)- o) r0 @1 W; M& J* w8 b
select concat(id,':',name,'=') from students;! B: s8 } T" G: H( c Y
+ B, d9 B5 I2 z$ ^ 12、limit(选出10到20条)<第一个记录集的编号是0>
6 e6 w. z( L, \- K* I select * from students order by id limit 9,10;0 P L2 o. B3 s6 @- @) P+ a: ^
3 h8 J+ x* N% v# ] 13、MySQL不支持的功能
) `$ S, D! Z! L( f# S% w 事务,视图,外键和引用完整性,存储过程和触发器) `2 r( m: i$ k. Z; @0 V1 ]9 c2 _
( J7 ^) ?' a) M 0 H; G. [) g3 I& e# D5 S. w2 E' p
14、MySQL会使用索引的操作符号* F( Z) {8 p& D0 P
<,<=,>=,>,=,between,in,不带%或者_开头的like. V! \ Z/ g4 Y" e7 S, U
- C# u# O* S- i
15、使用索引的缺点
k8 V! [& |" {) M 1)减慢增删改数据的速度;/ i7 v! }7 Z$ O( K0 Q
2)占用磁盘空间;
- f% u# C8 H3 ?: |0 n) A+ q1 k 3)增加查询优化器的负担;6 y. H( W( W- H
当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;
" G# o+ n* r% T. M9 J8 _- }
4 R) M; p. g' H g$ F" o3 \3 E 16、分析索引效率/ [- z+ m* A: h" q
方法:在一般的SQL语句前加上explain;7 S9 y% h/ @, M/ a
分析结果的含义:
6 p; c) d2 |* c9 P2 y% }6 U 1)table:表名;
+ Z/ ?" L$ X3 y4 i% r3 t: N3 ]9 c% Z 2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;4 j! z( A, W& ?' w( C
3)possible_keys:查询可以利用的索引名;: a7 R, L8 {9 \" j9 N
4)key:实际使用的索引;
% B& I g- f& J/ {* U. a' Y 5)key_len:索引中被使用部分的长度(字节);
) Z. Q- ^1 z6 P0 |/ c* m4 N2 O 6)ref:显示列名字或者"const"(不明白什么意思);* ~! }. l+ d! [' ^( A# V8 Q
7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;& p1 w% P: A) E3 n, C
8)extra:MySQL的建议;: d- }$ N* m5 [
c/ z& _" H# i6 i$ \% q( p9 _' X
17、使用较短的定长列6 R6 J' b5 i: r6 d
1)尽可能使用较短的数据类型;1 @9 Z! t/ ^4 D. U7 \; J, k
2)尽可能使用定长数据类型;% P n U9 |! H, T6 V9 y
a)用char代替varchar,固定长度的数据处理比变长的快些;
% k) L! h6 h$ G; B/ S; l b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;, q E8 P/ c7 V6 W) ?
c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;4 v6 D R( P! @5 D" }
d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;
( n: p* ~0 z2 }: h+ H5 u+ Y/ b/ J 2 O4 t/ o8 J0 K
18、使用not null和enum
9 _; K) e" v5 O# H* v 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;
! l3 Z. ^. g8 j9 G& M7 V+ L 如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;/ g. ?, R+ X; o! A
3 ]: W2 p. b, e; G 19、使用optimize table! n# q0 d) Y U' {2 x. r
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;
. V+ Q+ Q. z+ R' w ( R+ c" i a4 V+ |. Q( t9 M
20、使用procedure analyse()& V6 n; ?; ]8 U- P% l
可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:
+ H# b" E% u! j select * from students procedure analyse();
4 Y% O$ N H0 ~2 O0 U3 U" W4 |% c select * from students procedure analyse(16,256);
9 L. [& u" p& C6 P- ^" D. p; Y 第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;
! b, z" U4 S% r4 @ 3 a( T4 E- J6 q( [7 H% z) p
21、使用查询缓存3 o, Q5 \7 q& ?$ H; B6 e
1)查询缓存的工作方式:
: M6 E) x9 C3 ?: J" r' O3 w- O' G 第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。+ H$ g) H" |- Z
2)配置缓存参数:; O0 Z& I# r3 {8 n2 H) V7 C: j* ]
变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。4 g+ j$ C* ^) v
/ S2 { @6 p9 r' i( P/ G% d 22、调整硬件
( n9 n/ k) X, D4 B: H' B" Y' W% V 1)在机器上装更多的内存;+ Q" g, D0 t( d# J: Q0 b+ H
2)增加更快的硬盘以减少I/O等待时间; w8 J/ ?2 z6 o" J% ^' l( d% x
寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快; A& r5 q: }* M6 k( j* b2 L4 V9 n
3)在不同的物理硬盘设备上重新分配磁盘活动;
& Y, M& X$ x! i/ E: J. x0 ]' x9 l 如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。
) _6 Y4 m" Z# D* ` |