启动:net start mySql;) c# m) |9 b7 b+ p. C: s, ~1 O: Y
进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;3 [0 h0 y. d& z4 a1 w
列出数据库:show databases;5 B# W6 O* F. f
选择数据库:use databaseName;
7 _7 q3 R0 \$ Q) U9 g 列出表格:show tables;
8 u5 J) R* \, b% B! p% N 显示表格列的属性:show columns from tableName;$ L1 H; _2 Z n* D; C
建立数据库:source fileName.txt;+ { @5 c* d0 ^' l5 ?
匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;# D1 |" g U9 F
增加一个字段:alter table tabelName add column fieldName dateType;
4 ]9 c2 t. @) q4 B! [ 增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;$ G8 b1 C0 i* W
多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;
1 W% _& n+ L8 k. Q1 y 增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";, ^5 Z# k' n6 {9 S P$ J
每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;
9 ~- C6 w* S& r R 查询时间:select now();
* n/ Y: [8 @" }/ `' i% C4 d$ | 查询当前用户:select user();7 \- G2 m8 ~; s2 m9 B, k9 U Y
查询数据库版本:select version();
6 j7 z1 S. b* j 查询当前使用的数据库:select database();
! U' C1 X; S8 d; ` ) G& ?3 b+ m! J& m1 k
1、删除student_course数据库中的students数据表:
, p% u# B* j7 x$ s5 H rm -f student_course/students.*' X+ v) u* [; L$ ~
4 ~% b1 F: @" d/ @" U+ |
2、备份数据库:(将数据库test备份)
b+ o: t6 k# M. _ mysqldump -u root -p test>c:\test.txt7 Z, ?2 }- ?, @2 v2 o2 L3 u0 h
备份表格:(备份test数据库下的mytable表格)* t4 X& b: i; {% P' r T) b
mysqldump -u root -p test mytable>c:\test.txt. K) q* j. I: d" [& O2 R
将备份数据导入到数据库:(导回test数据库)
+ K1 j0 m" D) ~ L+ u mysql -u root -p test<c:\test.txt
) E/ b1 V' O( B7 S6 }
9 ]# V& h7 g T5 \' n 3、创建临时表:(建立临时表zengchao)
2 b8 |( _3 x: T" D create temporary table zengchao(name varchar(10));2 Z- q+ T& b7 R9 p a. c( q
( x' I) e$ B6 _1 p
4、创建表是先判断表是否存在
T4 `6 h0 N k2 d; u. S; }6 D create table if not exists students(……);
R3 K6 ?( T# X: y3 B* y9 S
. R+ b8 F8 ^. B 5、从已经有的表中复制表的结构$ ~: x% v2 q2 ?4 c
create table table2 select * from table1 where 1<>1;1 i0 U8 i4 c5 G9 Q
& o0 P. A9 r: i. w+ }( ?6 g4 b3 r1 Y
6、复制表
. P7 ]9 P& P% A% c create table table2 select * from table1;
" l1 M/ g: o1 @: ~: H8 U 8 l7 e* `' J: j5 H% b) v3 b8 ^
7、对表重新命名
' h$ \% K' ~/ {5 N" ^* ` alter table table1 rename as table2;
& ?8 Y- R. `4 x( i) Y$ j! h9 B
, P, c; p( `/ i 8、修改列的类型
( [0 O: j. k- _ alter table table1 modify id int unsigned;//修改列id的类型为int unsigned/ W6 t1 q7 f5 V2 \ f$ F7 E9 K# a
alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned# y' L2 e) U: H7 J" {, c
+ e+ W* ^! b- L1 j 9、创建索引
$ y- y+ d5 Z( `4 p( u2 t alter table table1 add index ind_id (id);: b- O/ ]8 e9 J% {
create index ind_id on table1 (id);# ?9 q4 r, r2 \3 r! D
create unique index ind_id on table1 (id);//建立唯一性索引! p- ?+ i% r$ H, q. M* d
2 o) q3 M! d/ {" F: B
10、删除索引# t) @( X2 p6 f3 H3 j
drop index idx_id on table1;
9 F5 s' n/ U! P {" e alter table table1 drop index ind_id;. {, a* ~. i9 ~8 d+ D0 m
/ v: T9 G7 v+ L
11、联合字符或者多个列(将列id与":"和列name和"="连接)9 t- K" Q$ d0 B/ B& G I/ O/ R
select concat(id,':',name,'=') from students;2 _% D9 `, x! ~) Q: ]1 k
; h/ q2 i0 E* O 12、limit(选出10到20条)<第一个记录集的编号是0>2 j) t9 ~5 @' E& l) J9 E- P
select * from students order by id limit 9,10;
+ [; u) `; r4 {4 T q$ f; _
1 ?; b) c6 j4 P/ Q6 t! U 13、MySQL不支持的功能9 ^: ?- e9 E* f. h
事务,视图,外键和引用完整性,存储过程和触发器3 ?* _8 Z4 ^" C) K- E
7 U: B( v7 H+ n( [: G- Q! o$ p! M. |
4 h# `; z* V! s& X' Q+ s8 V: l 14、MySQL会使用索引的操作符号3 M# w: T0 D) X6 M9 ? H" q; B
<,<=,>=,>,=,between,in,不带%或者_开头的like2 r0 D4 Q0 H4 x. D* |/ n, \
- D6 ]% I) Z; x, H7 i* r
15、使用索引的缺点
# ?* F0 w7 j. J/ v: h, M 1)减慢增删改数据的速度;* P' j) o. b9 {! r2 C1 l
2)占用磁盘空间;) B, x. f1 [9 E
3)增加查询优化器的负担;
/ }. K/ C8 f1 U r, X; S' w% H! m 当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;
# ^; z& \ K" J# _1 f3 D
8 v1 K# F& _4 _3 e7 |0 x/ D$ m 16、分析索引效率1 D" \5 F) G( R/ {9 W
方法:在一般的SQL语句前加上explain;
# f. S" c* `5 n1 l: X) ^ h! r 分析结果的含义:/ P6 R! F. N5 R# V/ Z9 v% M U( v
1)table:表名;
' M; p% S; ]# {7 j& X6 s- _* e. g 2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;/ O. x" j `" r1 b6 x
3)possible_keys:查询可以利用的索引名;
2 k0 Z, w |, r 4)key:实际使用的索引;
& ^) R0 A! l3 Z- i) [ 5)key_len:索引中被使用部分的长度(字节);
# C" L7 N# Y! D9 ` 6)ref:显示列名字或者"const"(不明白什么意思);& X/ ^, f) C4 U# J* f
7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;
( |2 Z1 H& ^3 P/ O 8)extra:MySQL的建议;
3 Q) X1 E' g+ v , y5 t+ A- ?, ~1 r5 |
17、使用较短的定长列) R8 ?3 v5 ~# [* z8 \3 `9 n
1)尽可能使用较短的数据类型;
0 o5 k7 A8 \/ q) R 2)尽可能使用定长数据类型;8 e e! ~0 U0 A. Q" u4 f5 J/ x! N1 t
a)用char代替varchar,固定长度的数据处理比变长的快些;
8 n* D2 G6 g4 J b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;* _. S6 F% h* ~* f- K- J2 G0 u, v
c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;
$ n p1 |! t* M; q U( T' m d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;
1 u) d) u$ I2 v! F# `( g ' n% M9 ?2 a4 C5 f" W
18、使用not null和enum
; T* c* s# e P1 w( a 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;: M8 E1 }" |2 u
如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;5 j' K$ _5 Y( S) {
! r6 {% a# f6 c1 E6 P
19、使用optimize table8 G, W3 D; h7 u2 q
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;; r2 H, `8 ^8 `* S7 R* [6 w
9 S+ o) n' \5 Q. Y 20、使用procedure analyse(); h; M, D" X, }+ ]$ N! W
可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:
# ]1 b4 ^6 C7 ~# f- a select * from students procedure analyse();
5 p; d* n. ^3 B* l' B- ] select * from students procedure analyse(16,256);' R( X% \( h! q5 \" Z9 _/ C
第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;2 l, {2 H! n+ U
/ r6 j' v% v, N1 F9 E
21、使用查询缓存
0 o! o5 }, v3 A5 [ 1)查询缓存的工作方式:
; z9 q) g) r/ ?$ Z 第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。
9 a4 I+ {8 ^5 p% U 2)配置缓存参数:
2 r% {/ ?4 A% W- w7 @ H 变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。) o. ~/ y% E& P! G2 f2 K/ T
$ ^- o2 O' ~: T) j1 S/ G 22、调整硬件4 g. U& k! q* d8 y7 B, p1 E6 ~+ t
1)在机器上装更多的内存;, x# T- I+ Z$ Q( n0 K8 L: |3 ~
2)增加更快的硬盘以减少I/O等待时间;
6 c# A2 o' f3 i- m" }( s! N9 |; O 寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;/ ~2 X$ l1 M: ]8 C! `3 Z
3)在不同的物理硬盘设备上重新分配磁盘活动;
% S$ ^- i" W2 z! o0 M1 Q* g 如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。% E5 S" \4 l0 N' u
|