启动:net start mySql;+ l4 m D. H0 D( V
进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;
* W5 d3 D2 G" v. ` ~$ C8 p 列出数据库:show databases;
' L+ M; x" }6 [: N7 M5 G& { 选择数据库:use databaseName;
0 H$ ]2 i& R) D- } 列出表格:show tables;( S" D$ o6 G4 r$ i( S. V
显示表格列的属性:show columns from tableName;, q- f! x2 c8 M! L/ p8 C
建立数据库:source fileName.txt;
" j- Y$ L% F( L# _( v( f 匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;
4 O& W8 a9 H* J8 |: R 增加一个字段:alter table tabelName add column fieldName dateType;" _# q: N" c0 |5 ]* J: }" x
增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;( R/ |0 a6 \: F
多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;
' a/ g* e$ S; c1 f" h( I3 I 增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";
, \6 _: V3 Y, s9 a3 B: Y2 @# f 每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;1 d2 M( ^1 \3 G" u0 y* N5 h
查询时间:select now();
# N8 U& [) ^6 j9 p/ w 查询当前用户:select user();
. p9 y1 \4 t0 ^7 [6 s1 Q: I 查询数据库版本:select version();
8 R/ E d/ B/ e/ y: ] 查询当前使用的数据库:select database();( H2 T% Y. @* K
; r& k/ G7 Q' j! A. s1 _. n9 Z
1、删除student_course数据库中的students数据表:& l4 j. r" u) _% l" Q+ h D: a
rm -f student_course/students.*
" Z! w$ y" l( T4 e5 m" o ( g2 f- }4 {8 v- r3 J3 [
2、备份数据库:(将数据库test备份)
# c- \& F5 j! w mysqldump -u root -p test>c:\test.txt/ M4 d& ^) V8 t! H( w; G' Q) C0 c
备份表格:(备份test数据库下的mytable表格)5 m* Z( U* Y: B6 M/ c# l) g
mysqldump -u root -p test mytable>c:\test.txt5 g5 ^& n$ O% H: @& K; n
将备份数据导入到数据库:(导回test数据库)* Y) A+ J( H& S' L7 N
mysql -u root -p test<c:\test.txt
' t# Q* G2 S4 u* j
7 H, @' h# r+ }8 y4 M 3、创建临时表:(建立临时表zengchao)3 k- }% t# M" Z- C! l4 E4 A
create temporary table zengchao(name varchar(10));. h" V9 p7 b$ W+ j
6 h9 b2 u3 h" y 4、创建表是先判断表是否存在/ \: R9 Z8 E* o1 |. @
create table if not exists students(……);5 {8 g# p6 f2 G# N/ S
5 J5 E0 p! N2 M# W
5、从已经有的表中复制表的结构* H8 D5 X) l" C; h3 o3 E* o
create table table2 select * from table1 where 1<>1;
6 c. C8 U4 s0 o' s1 a' c& c- j
3 o: | q7 h; v: J" X+ X7 S 6、复制表! w1 l* g+ a+ e* u4 n& Z, v
create table table2 select * from table1;
: M; T8 `0 I$ v% T5 Z/ [1 y
0 Z( }& J* x: s. R+ f6 U1 f 7、对表重新命名" P) |1 r$ `/ p8 ^: W {
alter table table1 rename as table2;5 f% R* I/ R: c2 i4 D9 }1 e
6 h2 Y& U0 w: p, Y' r+ E. T, [. n
8、修改列的类型
" p# p& f( _3 ?2 u* x3 B& |8 ? P* K alter table table1 modify id int unsigned;//修改列id的类型为int unsigned& i% V" x0 U( U2 v- I
alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned
* X. Y! B6 z* K& R0 ?% [' m8 c
/ s: U4 _5 K! z 9、创建索引
9 O4 _4 W5 W3 z; ~$ A0 Z, s' { alter table table1 add index ind_id (id);
) @' f2 o: Y6 X8 ^$ d% s, t+ O! ~ create index ind_id on table1 (id);
* P* s( j# Z K6 l0 x* ~ create unique index ind_id on table1 (id);//建立唯一性索引$ q& Q1 _6 H- q9 I7 n8 z: f
: j; d* {2 _1 T0 g: N/ s$ ~+ l1 w5 `
10、删除索引* \" [4 K. O: a# ?: \7 }% [
drop index idx_id on table1;0 m4 k9 M4 F. @9 i0 C' Z
alter table table1 drop index ind_id;5 ~( w9 o0 P3 I" W$ C9 w
, l* ]# Z! ^- s4 \8 J 11、联合字符或者多个列(将列id与":"和列name和"="连接)
# g F; j+ g; e, B" t$ J select concat(id,':',name,'=') from students;5 M% R' k4 X3 _* ~& ^6 r0 M" C0 z
) S/ P& Z- c( A+ ~# I
12、limit(选出10到20条)<第一个记录集的编号是0>
+ ~! F% `. N7 \1 G/ D! x select * from students order by id limit 9,10;1 j; v+ n; m/ G2 M& c
8 y: O; Q$ @& b# N5 g+ }- ] 13、MySQL不支持的功能
) S0 X5 s6 T, {) ~1 C6 k; G) I! [ 事务,视图,外键和引用完整性,存储过程和触发器
: U8 @' k) L. V+ | * ^+ d6 u! q0 f8 J! B
2 d( X) U2 J5 B 14、MySQL会使用索引的操作符号
! ]7 y6 s& a0 U <,<=,>=,>,=,between,in,不带%或者_开头的like
8 u$ P2 K3 M: Q+ t( v ) O0 e: N9 ~6 i
15、使用索引的缺点1 U( U% ~; e- C
1)减慢增删改数据的速度;3 O5 s" N/ |0 `& d. R* ^
2)占用磁盘空间;5 y# o- B2 a h% y3 \5 t
3)增加查询优化器的负担;& g) X; u* Y! h" ?+ `4 K
当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;
2 X. X% X7 W) n+ b2 c3 U
: k: a" i3 U3 t" f2 I5 m( Y- m* W 16、分析索引效率
& `) X2 R {" t( Q) u) Q 方法:在一般的SQL语句前加上explain;
( U5 V0 c5 t1 }% u5 Q6 h5 J 分析结果的含义:* r5 M. h, F; u5 T1 f1 ?
1)table:表名;" Q5 |/ \% P- Z1 g6 ^/ a
2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;0 s; b) p {- D/ i1 W
3)possible_keys:查询可以利用的索引名;
$ r$ T) S8 _, J1 j% z2 Z. c/ P3 E 4)key:实际使用的索引;
, u H& \- a0 ^3 S+ K 5)key_len:索引中被使用部分的长度(字节);
/ W& y6 k* ]' a. u" @) y2 ]' x7 u6 ]& I 6)ref:显示列名字或者"const"(不明白什么意思);
8 @! u. [1 X- G* O; i" h+ z 7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;; d- I: f) I0 s; v4 e
8)extra:MySQL的建议;- R+ F' i) x$ t% U( P- h# |
7 j& a7 p7 d9 K- v 17、使用较短的定长列
0 I& w e4 g3 c6 r7 a 1)尽可能使用较短的数据类型;* R' p" S3 D1 Q1 q6 q* W
2)尽可能使用定长数据类型;; L0 |* P! h2 [9 f
a)用char代替varchar,固定长度的数据处理比变长的快些;
* P( s" u6 D/ K+ \9 b/ ?' t1 g; Y9 N b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;! m ]0 n6 r* ]! ^
c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;: A. B4 B& \, k- j; l4 x5 F
d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;
$ i( Z( o, Z# E" X5 g6 K" T+ y2 U k& H/ n- k* b8 K1 G* Z% i
18、使用not null和enum
5 p: c' S$ L/ |3 @ 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;
) U) b3 u0 s5 L: [2 q 如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;
3 T, i) h9 F- e5 k6 a' _; O & b& Z/ A% [- `: P% f
19、使用optimize table
' m" Y6 m, U: V: {- L 对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;# Q% g1 `. B% `$ n B y' |
5 N- `' H" F$ N# G- ] 20、使用procedure analyse() o$ a0 c: n% R+ y0 z
可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:
+ R' r+ ]$ g% l select * from students procedure analyse();& U7 p* R. c5 d% T
select * from students procedure analyse(16,256);
8 V! P5 k) x U* R# r( e 第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;' t2 `4 J* p: r+ I
, r- ~7 D' U( V
21、使用查询缓存
9 }# X( {$ s5 x4 k 1)查询缓存的工作方式:' o q: m f+ j) V
第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。
1 b' l. g. ]. M O: |( L0 g$ w* z) ` 2)配置缓存参数:8 |* v& p+ Z8 u
变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。
! Q, _; J* g3 F$ H8 T% j# ^5 {" o
% s4 v- u! h/ V. r 22、调整硬件- @) j" W m& r6 }; f( U+ X; P% \
1)在机器上装更多的内存;) C1 q- a, d- i5 J
2)增加更快的硬盘以减少I/O等待时间;$ G& H# v Z9 C" f' ]
寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;
* q; ~7 U# Q, E2 T+ r0 i 3)在不同的物理硬盘设备上重新分配磁盘活动;+ M) R% L7 g% t2 u5 q+ t! c1 ~; w
如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。6 @6 e7 w4 h6 T( L3 H/ }
|