启动:net start mySql;
M* t/ R; ^0 A/ ^6 Q$ B 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;" i- E. E; b# c+ Z+ W7 u6 U
列出数据库:show databases;
, i) A5 |5 N9 ~6 D 选择数据库:use databaseName;0 ~2 Q/ o& H# f" l) L4 c
列出表格:show tables;! Z1 z' I. @- k. h# T! [: g+ u1 t
显示表格列的属性:show columns from tableName;
# ~' b* e. `8 x8 e9 k 建立数据库:source fileName.txt;
! a) A8 S- E5 ?; c. S" ^0 { 匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;
* t N' o& l2 h3 V7 B 增加一个字段:alter table tabelName add column fieldName dateType;
7 P! s! W' e5 C 增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;* a8 I' o" r* M& p. l5 W& l# L4 e* E
多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;
7 F* l/ S$ z. }4 z6 c 增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";3 |+ a+ W0 s* t7 z1 U6 H& ^9 A9 ^
每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;
" R; {# [% T5 ?$ m6 _' y 查询时间:select now();6 V X9 n. e) ^- t" |
查询当前用户:select user();
" {8 V+ q/ ?4 b- g- t. v& ` 查询数据库版本:select version();
% Y7 }' Y5 D. B& U 查询当前使用的数据库:select database();
8 T C H- A# c4 j% @2 E# w- k # l4 T/ s8 C6 X7 f
1、删除student_course数据库中的students数据表:& ^& Q" U$ r3 N/ T. [4 h3 n' M
rm -f student_course/students.*0 A- t/ W/ q C1 B1 x0 w7 T
. \! \. }; @1 ~) B; K$ K 2、备份数据库:(将数据库test备份)! h) ~' f5 r) T2 {* g
mysqldump -u root -p test>c:\test.txt
- j# T/ C3 a5 @2 l4 R 备份表格:(备份test数据库下的mytable表格)' }* t- U/ |$ }0 d: C
mysqldump -u root -p test mytable>c:\test.txt0 P+ U8 Z3 d) _3 F( y
将备份数据导入到数据库:(导回test数据库)& |- W# y5 i' i# f- w& b; H
mysql -u root -p test<c:\test.txt
0 D; u) p6 Z) \2 l) Q 3 b- e2 r2 B0 V7 o; {
3、创建临时表:(建立临时表zengchao)
8 o, B# X9 S* p- s3 t create temporary table zengchao(name varchar(10));0 j1 s+ e6 s7 ]! |" ]
& z2 G/ J3 p( t2 ?$ }# f6 } 4、创建表是先判断表是否存在
! q9 e6 m5 F8 c" w( p2 W* S h create table if not exists students(……);; K7 A9 L; v! ~4 B' m1 v
5 v3 ? v$ [" f6 F) A3 l
5、从已经有的表中复制表的结构( I/ r, A/ p' M* i4 C# C x8 d& j
create table table2 select * from table1 where 1<>1;" F, d6 g5 h6 B) f4 X' g- V1 K6 _
2 P% h( r( {9 x& H( ]
6、复制表
$ N, ^! H% H& S/ K; r2 J create table table2 select * from table1;: n2 E& Z4 a; c3 b, F0 i% a
" y6 W) t6 C8 |1 W2 d8 U4 X 7、对表重新命名* G: _3 y0 W2 f
alter table table1 rename as table2;
; r! P+ E+ R, b: e8 D1 {& D
; Z. p/ ~- U# X0 F1 {4 T7 X4 o" m( X# B 8、修改列的类型) T' y% l; |1 f: {! F9 U9 F
alter table table1 modify id int unsigned;//修改列id的类型为int unsigned
, n, Y; Q+ k: {2 q6 i5 k2 z alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned2 Y0 N0 ]( S" @$ D! n* R/ t# }
+ K7 {: ]3 Z6 e" j, `( { 9、创建索引6 Y& o1 ?% N6 W6 Q' |
alter table table1 add index ind_id (id);8 n5 A& Z" l+ H5 I; v
create index ind_id on table1 (id);
- R% H# ~( c- } create unique index ind_id on table1 (id);//建立唯一性索引
" D0 A% g- x8 m R' a5 W U* T; I/ t: O7 d. F( t
10、删除索引( p2 y: r6 d; I, A$ @
drop index idx_id on table1;
: A) I' N3 i S* c+ ]/ t# C alter table table1 drop index ind_id;: n' Y E* j' [+ M8 ^ ~9 T
+ i0 o. {( l) N; T/ u
11、联合字符或者多个列(将列id与":"和列name和"="连接)
1 _: B% p5 C& v) o N0 ?& { select concat(id,':',name,'=') from students;
4 W; d: Y5 a; | - z3 a' B% N6 A) I/ Z2 _/ ]5 I
12、limit(选出10到20条)<第一个记录集的编号是0>
: { a: L4 h4 w# w# t" c" Y select * from students order by id limit 9,10;
; T, g% a0 {* y! I# ?$ o7 V
* D R- U1 l! m$ R4 y R' L, ?. K 13、MySQL不支持的功能
, p9 R% a! j0 p% M, d 事务,视图,外键和引用完整性,存储过程和触发器
5 A" M0 a; x2 [, M! K 9 J6 }6 ^) ?: B4 e( e
' d& ^0 t; X: w( E0 c9 O# k! G 14、MySQL会使用索引的操作符号7 H1 a: A2 J0 S1 @4 ~
<,<=,>=,>,=,between,in,不带%或者_开头的like) ~# h: |8 I. ~& _
, e4 }. J7 C; m# V. I" l 15、使用索引的缺点
0 Y8 G2 F: |9 w) W, l$ t7 O2 C+ U$ s 1)减慢增删改数据的速度;$ X! t, G: o# a) z8 g
2)占用磁盘空间;
4 P8 \+ h: i0 v/ d: ?' X6 V7 w 3)增加查询优化器的负担;$ j$ U& I. U- \1 ~
当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;
# q" b/ C) [, ~2 ~+ J7 h
. L+ {4 S! J& W9 W 16、分析索引效率: d ~: f" r2 u$ m
方法:在一般的SQL语句前加上explain; ~* v' R m: r( k
分析结果的含义:/ @ h. D! R9 ]
1)table:表名;
5 s# Z. W# s& a% f: V: e6 v7 P 2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;' u; {: T2 Q& P# L S7 c
3)possible_keys:查询可以利用的索引名;
5 a6 e" _9 n" f 4)key:实际使用的索引;' |3 e7 K7 w1 q/ b7 a; @. Y
5)key_len:索引中被使用部分的长度(字节);
, O# J! ^3 ~, S; `5 q1 k 6)ref:显示列名字或者"const"(不明白什么意思);
$ Y: ?5 v4 N5 \& f/ N, K8 l 7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;
1 L2 e" T) }$ Y/ G5 n! I 8)extra:MySQL的建议;
1 q* X4 h6 o& h, s9 X8 u% o$ q
1 r/ w; e2 r, s6 Y h 17、使用较短的定长列
( l5 C: H( }$ ~2 H 1)尽可能使用较短的数据类型;
: r- D; A) a+ u/ ^4 f3 I' { 2)尽可能使用定长数据类型;( w6 J! }9 I% K" {/ l
a)用char代替varchar,固定长度的数据处理比变长的快些;3 L- Y2 Y: Q; [' k! K2 {' B
b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;
! N$ _/ C+ W' r( c c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;
3 h* ~" C. K" C# B: ~! s# c d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;8 o7 C! a, J' i5 A7 g
6 k7 V# A/ |/ F! g5 N9 k6 n 18、使用not null和enum
, \7 o( k: ?7 K 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;) j' |0 |/ s: |. s
如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;
; F/ {! B n$ K4 z) r9 `
+ j& n- E2 K; Y( O6 V- C; Y 19、使用optimize table# L' e2 j: k$ D0 ~2 G
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;
) g( t" r- ]! T3 Q+ N6 y : e' g/ G' G. O7 u' A
20、使用procedure analyse()
5 X9 S% m( D# j' J 可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:! s# N) ^/ Y, y$ o+ M
select * from students procedure analyse();
6 h& U+ {9 O' T6 [4 h3 X- W select * from students procedure analyse(16,256);
) j( _# V M' r( j& C. A 第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;7 m* b$ G( m( L& j+ P; L- f" W# _8 V
8 [3 ?) M) W0 U. ~; w& k3 Q
21、使用查询缓存0 H# `" v2 `6 a3 d
1)查询缓存的工作方式:# w2 ?) `) m& e+ @4 K
第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。
$ c: w, f; u4 h: [- I. l4 v 2)配置缓存参数:
* i4 h7 h! N+ I+ h% w, B) n 变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。
8 |# @8 y$ a, ^) F& Y( o
1 k1 C$ F: X8 v' g! F% z 22、调整硬件. [4 V& x) n: L6 f# Q. u6 H& A# l
1)在机器上装更多的内存;
" n4 s' x0 d( M 2)增加更快的硬盘以减少I/O等待时间;
1 T$ L! N3 z& W" y1 A9 l3 f5 f 寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;' x9 l0 B# v% j& y
3)在不同的物理硬盘设备上重新分配磁盘活动;* B7 _# U5 p3 n6 i* b( y
如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。
/ p& a# ^) c/ f' t8 q4 X |