启动:net start mySql;
) ?) M3 U7 u7 \% {. K4 l 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;5 q- H M6 A4 V' S4 R; H# |
列出数据库:show databases;( ?( G$ G5 ^, S* T/ V G" J
选择数据库:use databaseName;8 ^6 s: J$ H' N9 L. e( ? E- d! X3 `
列出表格:show tables;
& v$ g4 y7 G v* x$ o9 D6 E/ a 显示表格列的属性:show columns from tableName;8 V& k7 }3 I! {& [( ?
建立数据库:source fileName.txt;1 P6 M( A2 f7 ~% N
匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;# L+ B/ x6 p' X. I0 {
增加一个字段:alter table tabelName add column fieldName dateType;
6 h# s9 L, \8 K! {7 P! q( ] 增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;# V O% ~- l! s4 M; z2 X
多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;
1 y% {' X6 \6 V0 V# h r) ] 增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";
, @% m1 H! A. U/ H 每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;
! y( h3 [/ o1 s% x5 T% v 查询时间:select now();8 v$ @0 E2 i$ @$ O6 S. a: g
查询当前用户:select user();
, @& T4 i X& y E; V 查询数据库版本:select version();
7 c) M, g% Y: W+ g* H 查询当前使用的数据库:select database();6 x7 K. o- }# L
@/ o$ a/ Q0 m0 H' A% ^
1、删除student_course数据库中的students数据表:
, P' M( i, u3 \3 b' q rm -f student_course/students.*
4 K6 s( b' ^9 y6 E ! C4 Z4 }1 K& H v6 S ~$ G
2、备份数据库:(将数据库test备份)
# X, l) @6 C. s( K+ d0 N8 O* w e mysqldump -u root -p test>c:\test.txt
$ L- D# V1 g! g6 l( z2 j 备份表格:(备份test数据库下的mytable表格)9 M% N, g' `2 A- V6 T4 U( C/ R
mysqldump -u root -p test mytable>c:\test.txt
% K5 l& T9 }1 }; n5 v# R 将备份数据导入到数据库:(导回test数据库)
# w/ C6 k, R0 S2 ]5 A6 ~- v mysql -u root -p test<c:\test.txt
2 p' d D7 N% }% _7 w7 I, r 2 |) x) _* W6 L! m
3、创建临时表:(建立临时表zengchao)
7 K0 [, y+ x) P9 K2 R$ t create temporary table zengchao(name varchar(10));, R" v; y F8 w9 n+ {
# t1 c$ [' G+ l3 D. W7 D 4、创建表是先判断表是否存在
- _. U0 s, m4 k. u; E4 q9 g4 X- M create table if not exists students(……);! ` t* b7 v7 o0 P7 F' [6 _
: p% Z4 M0 a3 e* n$ u; c
5、从已经有的表中复制表的结构/ k6 r+ C) |# j" _
create table table2 select * from table1 where 1<>1;+ m$ b) V2 B( F; O6 U3 f/ h% @
2 \; e- u# ^ D. k2 G5 o; q$ {+ w
6、复制表
3 J. Y2 {" v, ^ }9 Y$ E! r4 w create table table2 select * from table1;
- k; A# e2 @7 ^: s ! @/ E* u1 B1 i
7、对表重新命名
9 H1 P& l, A3 e; F& r5 |4 m0 S6 t alter table table1 rename as table2;
/ J0 T) q: U9 ^% S# s
1 Q7 V0 u( n, \% @/ L 8、修改列的类型5 U) f. t/ X5 I- I$ I& m
alter table table1 modify id int unsigned;//修改列id的类型为int unsigned% n6 P4 O) e/ y- l: B5 k: \, n1 A
alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned8 \6 [9 W8 H0 I9 _ y
! b# g. A6 V& l. ^+ {1 l 9、创建索引/ Z- T, }/ h, Y& W# b; [! h$ L. A
alter table table1 add index ind_id (id);8 _ d" `6 |$ y+ j
create index ind_id on table1 (id);
: j. g, ` U9 u) s create unique index ind_id on table1 (id);//建立唯一性索引( y3 R+ x- S$ D9 P- ~% ~1 ]
5 g! O! f% d' a. V0 L9 l6 r6 Q) t
10、删除索引
4 ~+ l8 x, e0 N4 u drop index idx_id on table1;! d9 P5 C/ V. U q
alter table table1 drop index ind_id;, j- @# u! g4 C! l
7 m$ j' f: N3 g* g
11、联合字符或者多个列(将列id与":"和列name和"="连接)
3 Z4 U2 O" [" M& d. A select concat(id,':',name,'=') from students;) n% V( c- L u8 \0 S
& y; v' a8 f$ J
12、limit(选出10到20条)<第一个记录集的编号是0># m; ^, y* ]1 {6 s8 M7 R( H# k& R' B
select * from students order by id limit 9,10;
9 x; [$ ^5 L9 z" R) r( s# k0 J 2 X1 c5 Z& u0 Y$ w+ |6 N
13、MySQL不支持的功能# m! a Z( T; R
事务,视图,外键和引用完整性,存储过程和触发器: W# A/ Y* Y, Q: }: y. z. m
+ }4 _" T' R: X5 z% \: H/ F1 g2 O+ L
& X: N2 m4 G5 e! B4 z( P 14、MySQL会使用索引的操作符号( z3 l7 t/ `: \/ }
<,<=,>=,>,=,between,in,不带%或者_开头的like+ Z; g. z8 @ L$ r
& G6 r- X6 y5 D! j 15、使用索引的缺点( |" `3 t' o W; h; r+ v8 T4 V
1)减慢增删改数据的速度;
( S# O1 Y) U, ]3 G/ m" k# a6 R 2)占用磁盘空间;
9 d; n) y& o. G" L# [3 x 3)增加查询优化器的负担;
$ O& r. ?2 r5 k 当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;
]4 K- Y; O" j; ]7 H5 F5 S( |) G: [
0 \( D- k$ j6 \% a3 v6 @ 16、分析索引效率
% X& T% c( ?& }+ x3 E- ]; G 方法:在一般的SQL语句前加上explain;- h- O( b5 a9 L
分析结果的含义:
) K/ I0 ^" S7 b- I0 w L; G% u 1)table:表名;" W \! D$ S- L1 d
2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;* [$ I6 C6 [* Z9 X. c
3)possible_keys:查询可以利用的索引名;7 `! B) Z$ b) }6 F" i5 ]' @) r+ q
4)key:实际使用的索引;7 {5 n+ }2 M* X$ r
5)key_len:索引中被使用部分的长度(字节);
# y% B, x9 ~6 ]1 v" A 6)ref:显示列名字或者"const"(不明白什么意思);( j; [4 c9 Q/ @* R( `" I
7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;
4 u R4 y) b& ?/ _0 [4 e- M 8)extra:MySQL的建议;$ L( O1 J5 |( _
: K9 a' w% n9 u; b2 ]7 i0 l' v 17、使用较短的定长列
7 Q* `+ P; g# X) M 1)尽可能使用较短的数据类型;
4 F- r8 d- A) x4 W0 m2 e 2)尽可能使用定长数据类型;
- L% o. ?* K" i) |" S O9 O0 L5 }( \ a)用char代替varchar,固定长度的数据处理比变长的快些;4 o' c# v3 `2 w: D' Z( L
b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;
% ~0 v) e2 B' \; q! Y/ u3 {9 A( J c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;0 T! J& f% r4 d w# ?! t3 W4 x. n
d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;
0 {7 @# Z% ?0 I3 `4 d+ c
; S# s+ v R' A6 [7 c, b; ? 18、使用not null和enum
/ X0 G1 O& ]/ b- p/ A4 H 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;
5 u* Q. Q( y+ G$ u$ [# ^1 ~- f; j 如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;
9 D* G+ v& l( F) t/ Q" J ; V5 v+ \( {9 W" M" w! y
19、使用optimize table6 f( m% ?! I( v3 |/ U! Q
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;
. M' g5 [& R, D5 r% `( ]+ T+ V" y 4 ~" Z9 y# L: q' E9 P
20、使用procedure analyse()) o( m4 D0 z0 H+ y! y, _
可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:
6 r, G; y$ V) g- r0 X3 t: ~9 v$ L( U select * from students procedure analyse();) E2 m, Y& x' P1 o1 P$ i. U
select * from students procedure analyse(16,256);
$ L$ h& ]; f7 Q* h9 c7 L 第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;
e2 O0 [6 k2 V3 o' `
7 I* K+ N# @2 _) J) q6 [/ z 21、使用查询缓存
0 C$ {3 r! M+ ]+ ^0 m# A; F 1)查询缓存的工作方式:
- }5 P( I2 w2 }& B 第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。
8 |6 @- A- Z6 l8 g, k3 ] 2)配置缓存参数:
" w* d+ F. m3 S3 ?: s9 t J/ G 变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。
4 l, ~$ Q3 j4 {
8 i" S# `5 x; `, Z5 f) [ 22、调整硬件: O; \* n& s$ T2 y/ @8 ]
1)在机器上装更多的内存;8 H1 I! M! T0 B# K0 x2 S' j. U* |
2)增加更快的硬盘以减少I/O等待时间;
7 c* K$ B3 `) @, D 寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;
. |, u0 u! S; {6 A4 {- _ 3)在不同的物理硬盘设备上重新分配磁盘活动;
$ Q5 T0 `2 K0 {" b$ r 如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。# e4 g; J1 h; o/ F& g5 c
|