启动:net start mySql;4 v; Y! M W" J# B1 s
进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;
* B9 f7 m4 o9 F2 u4 H' j 列出数据库:show databases;
0 g4 V ~ E* f/ T) {% B2 w 选择数据库:use databaseName;. @2 `8 W0 r1 ~1 f6 L
列出表格:show tables;
6 ]2 y/ }5 q2 ^0 g 显示表格列的属性:show columns from tableName;, a% h. ~9 [& S
建立数据库:source fileName.txt; _0 H; R5 p" J% s
匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;4 |: Q6 n& [; a4 T3 m3 B# `9 S3 ?
增加一个字段:alter table tabelName add column fieldName dateType;9 l6 j3 m; ^) H" ^8 r
增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;& m- z9 e% G2 Q4 b0 R4 n6 r
多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;
2 |* b1 }: [1 T& \ 增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";
7 q% {- |4 F1 {* f9 y, q& q 每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;) ~6 z- A% t: u7 ^& }
查询时间:select now();
" s ^8 G/ |/ ^ 查询当前用户:select user();
8 n' ^5 t* J4 H8 I+ |- \ 查询数据库版本:select version();
9 B7 y* O7 l5 W' H9 v3 U 查询当前使用的数据库:select database();
9 P1 V$ n$ d# x* N; L6 D- G; P 4 Z7 s& C/ m1 @
1、删除student_course数据库中的students数据表:* T6 M o4 P0 w2 O
rm -f student_course/students.*" V: t6 Z9 Z$ q+ I& \# l
, \; c9 V E! z9 t! A8 E0 H3 v
2、备份数据库:(将数据库test备份)' N1 O' P/ r: \$ X& o$ K
mysqldump -u root -p test>c:\test.txt& e( W& v' ]4 d) g r
备份表格:(备份test数据库下的mytable表格)
5 R) r6 m: m1 z9 V' Y$ ] mysqldump -u root -p test mytable>c:\test.txt
% F6 a/ h6 x" F G% o6 H 将备份数据导入到数据库:(导回test数据库)
% r e8 B+ H/ Z( X! i8 m mysql -u root -p test<c:\test.txt
0 q" R6 m _1 S+ Z
" d! r. l! W+ W/ a! Q+ P 3、创建临时表:(建立临时表zengchao)
% D2 p3 ~0 Y1 ~9 b create temporary table zengchao(name varchar(10));
3 b5 l6 T; D3 V# }4 C. B6 G 5 C% b) k, n3 f; b8 C; e9 g
4、创建表是先判断表是否存在. @! p& }4 J& x1 I8 b- Z: ?7 f4 j
create table if not exists students(……);7 Q2 S1 B# ^# f
; t ^$ k1 \% A( V3 {' f+ r0 O6 M
5、从已经有的表中复制表的结构, h9 d9 o& F+ q* ^* V
create table table2 select * from table1 where 1<>1;
8 C3 C9 e$ P0 P% B; W; X
! m6 K% K# K+ y# C* n 6、复制表! y' M! Y" l, C
create table table2 select * from table1;
: H+ q- ]; Q( d7 y 5 n$ x) p- y; U! S4 G- |( O
7、对表重新命名. \3 z; e0 j% c6 I3 R5 X( L
alter table table1 rename as table2;. c5 e/ g) B, h n& y/ {, E
8 Z& v" I7 H9 g' P
8、修改列的类型
. K% n1 X$ J8 Z+ w; @( M3 I9 U. L% l alter table table1 modify id int unsigned;//修改列id的类型为int unsigned* R1 @: A$ t. Y' p$ u
alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned
. |9 x- }; C: f$ C- L( ?2 Q
1 v; E+ T9 U7 t5 o' o2 C" M: y 9、创建索引4 g0 T: L0 ?3 J' O1 [
alter table table1 add index ind_id (id);
c7 c% w1 u8 c0 z) N! G create index ind_id on table1 (id);, `! b+ x; f, }# u
create unique index ind_id on table1 (id);//建立唯一性索引: ~$ l7 y8 L2 L4 C; |
4 a9 L/ }6 w" }
10、删除索引
7 L7 L, E9 [2 K# @ drop index idx_id on table1;6 \7 B3 R7 n" ~) X
alter table table1 drop index ind_id;
' i2 X3 q# w L3 T" P+ m' j 8 k- A- K1 r0 w5 E# T" z
11、联合字符或者多个列(将列id与":"和列name和"="连接)
d5 D9 j1 _( w: {! k% G' b2 I select concat(id,':',name,'=') from students;% f# N7 K& @, _8 i
+ v7 R' }; H) u* h. H 12、limit(选出10到20条)<第一个记录集的编号是0>
- K0 d h3 {5 F% x/ c9 B select * from students order by id limit 9,10;* x3 ^$ l3 ^8 }; t
- k6 \8 q, Y& `, v+ f6 F# ^
13、MySQL不支持的功能
# S/ V. }9 `9 C$ _' Z 事务,视图,外键和引用完整性,存储过程和触发器
/ P, @( q: t3 Q5 n! d3 o 7 f1 ]) U, b7 k, k
& @; [3 t1 F) t* r3 @ 14、MySQL会使用索引的操作符号/ V8 j' {' T$ P% ~- o2 o. I
<,<=,>=,>,=,between,in,不带%或者_开头的like
! ?. ]6 [+ b# G; f: `0 A0 z
9 D8 ~# [& R+ D& J) _5 Y 15、使用索引的缺点
9 `/ D! [: Q# n. @8 \# _; B 1)减慢增删改数据的速度;
* m/ a% N! X6 V: t. } x5 j 2)占用磁盘空间;
- ^9 m) }5 r+ R 3)增加查询优化器的负担;$ `* b3 @. {3 y) m7 i0 l6 z+ J8 ^4 ^
当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;4 u V( p, C4 W+ I7 u8 y' b
% {8 d! }* w: i* M) t5 v 16、分析索引效率0 f7 p4 x3 a, `) v/ }
方法:在一般的SQL语句前加上explain;
/ H4 Q+ F' N: g7 s: K 分析结果的含义:3 m7 F8 z2 P: @* n) H( w* w5 d
1)table:表名;$ i: {5 Q" P5 w/ ?$ c
2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;9 e7 V) @2 A& U6 ~ d2 \3 @
3)possible_keys:查询可以利用的索引名;+ Z; J! s" \% ?
4)key:实际使用的索引;
: ]7 L/ {8 I: P: X- C 5)key_len:索引中被使用部分的长度(字节);7 ]3 X: a, z# u
6)ref:显示列名字或者"const"(不明白什么意思);
3 A, p! v1 ^/ I 7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;$ [8 W5 Z' m0 ^8 J# f6 w
8)extra:MySQL的建议;
- v) O7 d; Q; z/ K6 l- U& }+ s
6 n% P7 ^! r3 J* h' q8 r& s 17、使用较短的定长列
# ^( O# e) Q6 Q6 F 1)尽可能使用较短的数据类型;9 g5 M$ |' N( v6 H" S
2)尽可能使用定长数据类型;
' e: m+ v* @+ Q$ @ a)用char代替varchar,固定长度的数据处理比变长的快些;4 T& O' ^ [! r6 Q+ P
b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;
5 ^& k% n; k. ~! M c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;
- P( T0 r7 \/ I) g0 A% x d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;7 p- i8 q1 S/ J1 q5 m" A
5 I! z" j' C7 i. I2 w; ]3 H. m 18、使用not null和enum
5 Q t; a8 H2 K+ y! A# a6 c 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;7 u' P% H* `' y- F: b. P B2 [& v
如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;
& E; Z2 H' e) l& x$ C5 t # [9 T5 o- C1 H! i9 x# w2 p3 Q
19、使用optimize table
7 f3 f9 t$ i. y% S8 `; C 对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;
7 _ t6 L* N, Q( E0 ~6 V* H
( E: g$ \* b$ n 20、使用procedure analyse()
- Y* \. c! [" A+ f! W0 v 可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:2 I+ K; O" I4 B! q- ~
select * from students procedure analyse();
3 n' e( B0 a& C9 S select * from students procedure analyse(16,256);( e5 t9 o; E% d0 f% N8 Q
第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;
; m% z7 X& w2 W: V# r 2 J& R' w a0 Z( J$ s0 W
21、使用查询缓存
- k$ E0 c; V9 m+ t) @! o5 l 1)查询缓存的工作方式:
! a6 i7 u. R! x* k& W 第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。% ?# v( B% d! v! K3 W+ [
2)配置缓存参数:
$ s1 r) m4 i5 ^2 w 变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。
! |$ W. P v# ^& v) m) r. t . F- T, }3 a, Y2 N9 c
22、调整硬件
9 Q) Y& f% [7 J: k 1)在机器上装更多的内存;3 q. d. J( L5 @$ g/ _
2)增加更快的硬盘以减少I/O等待时间;+ \" i. R0 h# H* B' Q
寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;
- @ y# g# |4 ~) O4 J+ T$ h7 M2 ~ 3)在不同的物理硬盘设备上重新分配磁盘活动;/ X$ D4 R7 l& A9 w! ?. F0 y
如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。/ C$ Q1 f1 {1 n8 y0 ?: V/ f+ W
|