启动:net start mySql;
7 E' k. r; b# k! s6 Z/ P! |5 a7 ^ 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;! g( o8 U6 o: h, ^+ K' G' ~
列出数据库:show databases;
% l, Z9 P( q6 g 选择数据库:use databaseName;" E- D' B. l2 p' [
列出表格:show tables;" Q+ L6 k, S# c) y. V
显示表格列的属性:show columns from tableName;
( W) b! v. G" m7 I r$ u# x 建立数据库:source fileName.txt;+ N9 i7 B) {2 N
匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;
6 t# k/ A8 K# U# J6 v2 l7 I 增加一个字段:alter table tabelName add column fieldName dateType;
3 a& o) P, i6 n9 w( x 增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;9 m! n ~+ N8 h o" F# a0 M# ], ~6 U
多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;" S: e2 R( [' B5 l$ @1 K
增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";
9 [4 l1 g3 v: F6 N( b7 ?/ K/ C 每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;
( V- y0 H4 Z3 ^- D+ {# y 查询时间:select now();. C' c9 C' F& x
查询当前用户:select user();
2 z* b% k* G. ~. i* S$ i3 x7 } 查询数据库版本:select version();& ^5 H! X8 [1 l# h/ K, [
查询当前使用的数据库:select database();
$ M8 E X& o& l7 ]% y1 U - h8 m1 X8 e% t+ Y+ ?( ?3 u
1、删除student_course数据库中的students数据表:+ o2 ?4 t( O/ z. i9 R+ P- h, V/ |$ f
rm -f student_course/students.*- a3 E4 A9 u" Z5 ^% K5 G
2 c3 ~* T' i$ L, n
2、备份数据库:(将数据库test备份)
( q' c ?$ q: u7 \3 e; I9 k mysqldump -u root -p test>c:\test.txt+ S8 E$ l; P. A" I% F+ k
备份表格:(备份test数据库下的mytable表格)
7 J/ W) |7 _4 { mysqldump -u root -p test mytable>c:\test.txt
& V% c# o' a9 m' V# ~: j! ] 将备份数据导入到数据库:(导回test数据库)0 q* K! Z! e/ o! X# A7 ^6 r" p2 M
mysql -u root -p test<c:\test.txt
- d# ^* G5 ?5 q$ j; Y0 i 0 Q O" ~. x0 o+ A: S
3、创建临时表:(建立临时表zengchao)
& {( f8 R7 n, \ create temporary table zengchao(name varchar(10));! v6 O+ P" h0 n& X
+ T {4 Q I, z Q% v- l) j, J
4、创建表是先判断表是否存在
" ]0 U0 |% |8 l" {# Y, l1 I create table if not exists students(……);
1 E/ I) F' X0 V* V+ I( ] 3 f6 ^6 G- D- i# [% b* n% g5 W
5、从已经有的表中复制表的结构8 v, a9 f* @: ?, b. G8 Q' } v
create table table2 select * from table1 where 1<>1;
) F$ c0 @5 M4 \ . q$ ~2 g5 P, T% C9 E* H- X
6、复制表
$ G4 Z$ d+ H" x create table table2 select * from table1;
$ p' w r! _+ m; H
4 b* |3 j4 X6 S# Y# m6 k+ L 7、对表重新命名# M7 I1 D5 a- I( {& c8 }- J
alter table table1 rename as table2;: b( v- B: Z, t4 w7 x$ C- |8 a
2 n) t+ Q3 n: c A" Q ] 8、修改列的类型$ Y8 P: l, O( t( O
alter table table1 modify id int unsigned;//修改列id的类型为int unsigned' t2 ] ?7 m) s$ v
alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned" B3 n0 ~) E1 f. G
) K" A; n o! l$ `( c* Y 9、创建索引
7 O/ ~" l) w, @* B0 m+ g- i+ K alter table table1 add index ind_id (id);
8 L+ ], `9 `5 p% Z4 r6 n create index ind_id on table1 (id);
- V' S* B2 k& N- A8 S: m create unique index ind_id on table1 (id);//建立唯一性索引
) w8 \. N! Q6 \3 \& `$ S8 R
3 ~! b: J, B+ ~+ Z D; r; g2 S 10、删除索引4 l# b5 c$ T! v5 W# ^6 b4 V' r
drop index idx_id on table1;3 E4 u4 _; ~0 ?( @2 A6 A
alter table table1 drop index ind_id;
/ C; S. D9 G5 v; }! R
. {, c* {) o& M& Y! O9 d* s- d5 [0 H 11、联合字符或者多个列(将列id与":"和列name和"="连接). m- G1 y; J: A: u8 H1 \8 s; i( A
select concat(id,':',name,'=') from students;
. [% m6 K- h5 Y2 E' T' ^+ z: E
$ n4 l7 m3 [3 N0 Q& ? 12、limit(选出10到20条)<第一个记录集的编号是0>
- o8 U1 [) @: u% S6 F ^9 ~ z select * from students order by id limit 9,10;
$ R# P$ ~$ b) r3 L7 r * V$ K* _; b1 w) X8 k% H
13、MySQL不支持的功能
( O5 v, Z3 _. ~+ N+ M9 I+ k 事务,视图,外键和引用完整性,存储过程和触发器% o- f. y2 d: S$ n
* D- _5 \: k, D% U: Z
# H) q/ L/ {8 k( `. Z8 W! I 14、MySQL会使用索引的操作符号
/ I/ |" X+ u: o; [ <,<=,>=,>,=,between,in,不带%或者_开头的like6 P: a; o" d2 d: x% o* M
8 {- R7 R+ d' p, l& K' ^* N9 s9 T 15、使用索引的缺点
& {/ X: s; F8 `9 X 1)减慢增删改数据的速度;3 M/ d) @6 W# o- U W
2)占用磁盘空间;
# s( D. Y/ Y) e8 j) U8 C* P+ V- k! w 3)增加查询优化器的负担;
2 I5 w: V8 h8 L' @$ l 当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;; O9 f% A. ^" N$ Y o; e) v
5 w6 I; s+ {7 s5 U. K
16、分析索引效率8 u% q5 w$ G3 |9 J. d/ `, ?( j
方法:在一般的SQL语句前加上explain;- }# Q! m! ~6 p* Q" r6 ^
分析结果的含义:( l. @' J& B' x% o
1)table:表名;
8 L; S* t8 E5 G: {' X$ ] 2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;; ^, P" U' J; \- e% f
3)possible_keys:查询可以利用的索引名;, @- ^) j. j/ P" \* J: [; T, X0 [9 p
4)key:实际使用的索引;
# @$ a4 k7 X! o$ y6 N. d9 x0 E 5)key_len:索引中被使用部分的长度(字节);
8 |+ C, t' p: ?$ U# ^* D 6)ref:显示列名字或者"const"(不明白什么意思);
. e7 B* o3 Q4 ~1 X4 z9 v 7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;
; J5 U6 H' q4 ]8 B5 C! x q: C! A 8)extra:MySQL的建议;$ _) F( n; s9 O& V' Z
0 C% R9 m _: c
17、使用较短的定长列
/ m7 a3 P, z8 X% r# E 1)尽可能使用较短的数据类型;8 z1 \" K! J q
2)尽可能使用定长数据类型;/ N2 [1 g; S( |$ y. _, }4 u9 e
a)用char代替varchar,固定长度的数据处理比变长的快些;
" o& P% {5 [. X. P, {, k b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;
3 r& p# Z! W- b* p$ j/ u' j c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;
# S) T( D- e/ n$ ] d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;4 g4 S6 M9 Y9 M( K
" p% I+ \) b8 O7 x7 y v; M$ B 18、使用not null和enum
I; P0 b7 B$ \" P# V 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;
' O, z" Q% T) [ 如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;
5 S& I) q8 U( q, Y : d J/ `$ `4 s |
19、使用optimize table! k2 r; C# I8 `" G3 I
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;
) s' A8 C% h8 q+ R0 R/ t 9 ?( R' h& \7 J, q3 V& _/ _2 _; ]" L
20、使用procedure analyse()
- {$ @( i2 o& ^$ | 可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:
1 K* _. ]2 t! A8 P select * from students procedure analyse();
" v" p7 p' R# J( y select * from students procedure analyse(16,256);& n- B+ h" _3 z( b9 G
第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;1 W% |; M- b5 w* S1 Z( S
7 N) Z4 F8 }4 ]1 Z y/ k
21、使用查询缓存
! |" P7 Z, r8 D: {( X 1)查询缓存的工作方式:
6 c8 j5 J' q+ }/ Z 第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。 ?3 l/ A# k) o) j! a6 z* @
2)配置缓存参数:
8 A* a, Z; U# B D0 _: F 变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。! H3 X9 W0 U/ [' ?5 g) _$ o
1 S; p2 \, S' W9 J& c 22、调整硬件, {; d( l: `3 m# w: g
1)在机器上装更多的内存;- n& s, {# V8 D' r6 U
2)增加更快的硬盘以减少I/O等待时间;4 j1 a# q) J, w
寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;
8 v) E$ I# [$ d' c9 w- l 3)在不同的物理硬盘设备上重新分配磁盘活动;
$ k4 U( N4 _6 N 如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。
) Q+ G: `+ C q) D3 ]5 { |