??xml version="1.0" encoding="utf-8" standalone="yes"?>
一、连接MYSQL?
格式Q?mysql -hL地址 -u用户?Qp用户密码
1、例1Q连接到本机上的MYSQL?
首先在打开DOSH口Q然后进入目?mysqlbinQ再键入命omysql -uroot -pQ回车后提示你输密码Q如果刚安装好MYSQLQ超U用户root是没有密码的Q故直接回R卛_q入到MYSQL中了QMYSQL的提C符是:mysql>
2、例2Q连接到q程L上的MYSQL。假设远E主机的IP为:110.110.110.110Q用户名为root,密码为abcd123。则键入以下命oQ?
mysql -h110.110.110.110 -uroot -pabcd123
Q注:u与root可以不用加空|其它也一P
3、退出MYSQL命oQ?exit Q回车)
二、修改密码?
格式Qmysqladmin -u用户?-p旧密?password 新密?
1、例1Q给root加个密码ab12。首先在DOS下进入目录mysqlbinQ然后键入以下命?
mysqladmin -uroot -password ab12
注:因ؓ开始时root没有密码Q所?p旧密码一就可以省略了?
2、例2Q再root的密码改为djg345?
mysqladmin -uroot -pab12 password djg345
三、增加新用户。(注意Q和上面不同Q下面的因ؓ是MYSQL环境中的命oQ所以后面都带一个分号作为命令结束符Q?
格式Qgrant select on 数据?* to 用户名@dL identified by "密码"
?、增加一个用户test1密码为abcQ让他可以在ML上登录,q对所有数据库有查询、插入、修攏V删除的权限。首先用以root用户q入MYSQLQ然后键入以下命令:
grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";
但例1增加的用h十分危险的,你想如某个h知道test1的密码,那么他就可以在internet上的M一台电脑上d你的mysql数据库ƈ对你的数据可以ؓ所Ʋؓ了,解决办法见例2?
?、增加一个用户test2密码为abc,让他只可以在localhost上登录,q可以对数据库mydbq行查询、插入、修攏V删除的操作Qlocalhost指本C机,即MYSQL数据库所在的那台LQ,q样用户即用知道test2的密码,他也无法从internet上直接访问数据库Q只能通过MYSQLL上的web|讉K了?
grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";
如果你不想test2有密码,可以再打一个命令将密码消掉?
grant select,insert,update,delete on mydb.* to test2@localhost identified by "";
我们来看看MYSQL中有x据库斚w的操作。注意:你必首先登录到MYSQL中,以下操作都是在MYSQL的提C符下进行的Q而且每个命o以分L束?
一、操作技?
1、如果你打命令时Q回车后发现忘记加分P你无重打一遍命令,只要打个分号回R可以了。也是说你可以把一个完整的命o分成几行来打Q完后用分号作结束标志就OK?
2、你可以使用光标上下键调Z前的命o。但以前我用q的一个MYSQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win?
二、显C命?
1、显C数据库列表?
show databases;
刚开始时才两个数据库Qmysql和test。mysql库很重要它里面有MYSQL的系l信息,我们改密码和新增用户Q实际上是用这个库q行操作?
2、显C库中的数据表:
use mysqlQ?Q/打开库,学过FOXBASE的一定不会陌生吧
show tables;
3、显C数据表的结构:
describe 表名;
4、徏库:
create database 库名;
5、徏表:
use 库名Q?
create table 表名 (字段讑֮列表)Q?
6、删库和删表:
drop database 库名;
drop table 表名Q?
7、将表中记录清空Q?
delete from 表名;
8、显C中的记录Q?
select * from 表名;
三、一个徏库和以及插入数据的实?
drop database if exists school; //如果存在SCHOOL则删?
create database school; //建立库SCHOOL
use school; //打开库SCHOOL
create table teacher //建立表TEACHER
(
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default '深圳',
year date
); //l束
//以下为插入字D?
insert into teacher values('','glchengang','深圳一?,'1976-10-10');
insert into teacher values('','jack','深圳一?,'1975-12-23');
注:在徏表中Q?Q将ID设ؓ长度?的数字字D?int(3)q让它每个记录自动加一:auto_incrementq不能ؓI?not null而且让他成ؓdDprimary keyQ?Q将NAME设ؓ长度?0的字W字D(3Q将ADDRESS设ؓ长度50的字W字D,而且~省gؓ深圳。varchar和char有什么区别呢Q只有等以后的文章再说了?Q?Q将YEAR设ؓ日期字段?
如果你在mysql提示W键入上面的命o也可以,但不方便调试。你可以以上命令原样写入一个文本文件中假设为school.sqlQ然后复制到c:\下,q在DOS状态进入目录\mysql\binQ然后键入以下命令:
mysql -uroot -p密码 < c:\school.sql
如果成功Q空Z行无M昄Q如有错误,会有提示。(以上命o已经调试Q你只要?/的注释去掉即可用)?
四、将文本数据转到数据库中
1、文本数据应W合的格式:字段数据之间用tab键隔开Qnull值用\n来代?
例:
3 rose 深圳二中 1976-10-10
4 mike 深圳一?1975-12-23
2、数据传入命?load data local infile "文g? into table 表名;
注意Q你最好将文g复制到\mysql\bin目录下,q且要先用use命o打表所在的??
五、备份数据库Q(命o在DOS的\mysql\bin目录下执行)
mysqldump --opt school>school.bbb
注释:数据库school备䆾到school.bbb文gQschool.bbb是一个文本文Ӟ文g名Q取,打开看看你会有新发现?
后记Q其实MYSQL的对数据库的操作与其它的SQLcL据库大同异Q您最好找本将SQL的书看看。我在这里只介绍一些基本的Q其实我也就只懂q些了,呵呵。最好的MYSQL教程q是“晏子“译的“MYSQL中文参考手册“不仅免Ҏ个相关网站都有下载,而且它是最权威的。可惜不是象"PHP4中文手册"那样是chm的格式,在查扑և数命令的时候不太方ѝ?/P>
而tempdbq个临时数据库,它对性能的媄响较大。tempdb和其他数据库一样可以增大,可以~小。当数据文g需要增长的时候,通常不能保持剩余部分的连l性。这时文件就会生碎片,q种片会造成性能下降。这U碎片属于外来性碎片。要L在tempdb中生外来性碎片,必须保证有够的盘I间。一般将tempdb的容量放到^均用容量。而你也应该允许tempdb自动增长Q比如你有个一个超大的join操作Q它建立了一个超qtempdb定w的时候,该查询将p|。你q要讄一个合理的单位增长量。因为如果你讑־太小Q将会生许多外来性碎片,反而会占用更多资源。sqlserver调优最有效的做法之一Q就是把争夺资源的操作独立出厅Rtempdb是一个需要独立出ȝ部分而tempdb和其他系l库一h公用的,是存取最可能频繁的库Q所有处理时表、子查询、GROUP BY、排序、DISTINCT、连接等{。它最适合攑ֈ一个具有快速读写能力的讑֤上。比如RAID0hRAID0+1卷上。移动tempdb的方法:
1、用Enterprise Manager或sp_helpdb查看tempdb现在存放的位|?BR>2、用
alter database tempdb modify file(name='tempdev',filename='newpath\newfilename',size=20mb)
alter database tempdb modify file(name='templog',filename='newpath\newfilename',size=20mb)
3、关闭sqlserver重v
4、删掉旧的tempdb文g
而我们在建立一个用h据库的时候,也要考虑数据文g攑֓、日志文件放哪、用几个数据文g。数据文件访问当然希望尽可能快。但是通常数据文g对于用户h极其重要Q所以一般考虑数据保护和高可用性,它们放到RAID5中。日志文件呢Q它记录了对数库所做的历史记录Q它用于校验数据库中的数据完整性。它也应该和你的数据文g分开存储Q和数据文g一样事务日志也是会自动增长的,当空间够大的时候事务记录操作得很快。而这时你觉得它太大了Q去~减它,Q而你再一操作数据库,它要p旉d配空_如果你不让写入,数据库将被置疑。所以这不是个好办法。你应该通过文g截断或日志备份,q样可以从事务日志中释放I间。这里说的空间是指日志文件内部可用空_而不是日志文件的大小。日志管理器每秒传输操作可以序写入60KB。对调整事务日志最好的是放C个最快的阵列上,一个办法是RAID0+1。增加一个文件组中的文g敎ͼ往往会改善性能Q因Z创徏更多的线E来扫描数据文g。又比如你有两个上百万的表,分别建立索引。如果你攑֜一个文件组中性能会受很大影响。而比如你建立4个数据文件每个物理磁盘上建立一个,而且把数据文件放到单独的数据文gl?而把每个索引也放到它自己的文件组中。查询性能会显著提?BR>使用DBCC命o来优?BR>D B C C命o像名字的含义一P本来是ؓ了检查数据库的一致性。但后来D B C C命o?BR>成了一些有用的函数。D B C C命o的用有一些限制。以下就是所支持的命令列表?BR>D B C C {
CHECKALLOC[(database_name [, NOINDEX])] |
C H E C K C ATALOG [(database_name)] |
C H E C K TABLE (table_name[,NOINDEX | index_id]) |
CHECKDB [(database_name [, NOINDEX])] |
dllname (FREE) |
INPUTBUFFER (spid) |CHECKIDENT [(table_name)] |
D B R E PAIR (database_name,DROPDB [,NOINDEX])] |
M E M U S A G E |
N E WALLOC[|(database_name[,NOINDEX])] |
OPENTRAN ({database_name} | {database_id})
[WITH TA B L E R E S U LTS] |
OUTPUTBUFFER(spid) |
PERFMON |
P I N TABLE (database_id,table_id) |
S H O W _ S TATISTICS (table_name,index_name) |
SHOWCONTIG(table_id,[index_id]) |
SHRINKDB (database_name[,new_size[,'MASTEROVERRIDE')]]) |
SQLPERF ({IOSTATS | LRUSTATS | NETSTATS | RASTATS[,CLEAR]} | {THREADS} |
{ L O G S PACE}) |
T E X TALL [({database_name | database_id} [,FULL | FAST])] |
T E X TALLOC [({table_name | table_id}[,FULL | FAST])] |
TRACEOFF(trace#) |
TRACEON(trace#) |
T R A C E S TATUS (trace#[,trace#]) |
U N P I N TABLE(database_id,table_id) |
U P D ATEUSAGE({0 | database_name} [,table_name [,index_id]]) |
[WITH NO_INFOMSGS]
有些D B C C命o需要数据库名,而有些需要数据库I D。你可以观看SQL Server的错误日?BR>或运行如下的查询q在S e l e c t语句中用数据库名代替d b n a m e可得到数据库的I D?/P>
存储q有一点就是最后用NTFS格式QNTFS格式的读取速度比FAT32快。其实这是属于SQLServer调优中,pȝ优化的部分?/P>
说到q补充一点,一般媄响SQLServer调优的有4个部分:pȝ调优?.5%Q数据库调优?7.5%Q设计调优占20%Q程序可调优的空间最大占60%。呵呵,但是一般DBA拿到一个系l的时候,设计调优和程序可调优是不可控的,应ؓ他不可能L买来的Y件?/P>
面先看看索引步骤Q这些有利于大家对烦引的认识?BR>一、堆
1、sqlserver在sysindexes表中查到对应的数据行
2、读取indid?应ؓ堆没有烦引所以是0)后,sqlserver开始读取firstIAM|获取堆的IAM的第一?8KB)的位|?IAM堆的各个区域联接在一?
3、sqlserverҎIAM提供的区域地址Q一个区域一个区域的查找Q一个数据页一个数据页的查找,直到获取所需的数据ؓ止?/P>
二、簇索引
1、sqlserver在sysindexes表中查到对应的数据行Q找到indid?后,sqlserver开始读取root列的倹{?列值是栚w面的地址)
2、找到根面后开始搜索,比如要搜索的表是10条记录一,q里是找?981”这个|烦引的值?981”与栚w面的索引比较。由于?981”是?900?000之间。所以sqlserver开始搜?900所在的中间c?BR>3、找到?900”所在的中间后Q将索引值?981”l与中间늚索引比较Q由于?981”是?980?990之间。所以sqlserver开始搜?980所在的数据c?注意q一步是Ҏ中间|数据?
4、找到?980”所在的数据后Q将索引值?981”l与数据늚索引比较Q很快就可以在这个数据页上找到?981”的数据行了?/P>
三、非烦?BR>1、sqlserver在sysindexes表中查到对应的数据行Q找到indid为后Qgؓ2?51后,sqlserver开始读取root列倹{?BR>2、找到根面后,?981”与栚w面的索引比较Q由于?981”是?900?000之间。所以sqlserver开始搜?900所在的中间c?注意q一步是Ҏ中间|叉?
3、找C间页后,烦引值?981”l与中间늚索引比较Q由于?981”是?980?990之间。所以sqlserver开始搜?980所在的叉面?BR>4、找到?980”所在的叉面后Ql叫索引值?981”与叉面上的关键字比较Q在叉面上扑ֈ关键字ؓ?981”的数据行ID?BR>5、根据数据行ID提供的数据页和数据行信息Q定位到指定的数据页和数据行Q找到?981”这条记录是“晶”的?BR>堆在数据表小?K的时候访问速度最快,它不需要去扄引,应ؓ当你的数据本来就在一个页里也没有必要用烦引。簇索引Q在使用烦引查询的时候,区块查询是最快的Q如用betweenQ应Z是物理连l的Q你应该量减少对它的updaet,应ؓq可以它物理不q箋。非烦引与物理序无关Q设计它时必L高度的可选择性,可以提高查询速度Q但对表update的时候这些非烦引会影响速度Q且占用I间大,如果你愿意用I间和修Ҏ间换取速度可以考虑。如果在视图上徏立烦?那视囄l果集就会被存储hQ对与特定的查询性能可以提高很多Q但同样对update语句时它也会严重减低性能Q一般用在数据相对稳定的数据仓库中。好Qؓ什么update会媄响烦引,打个比方:1 2 3 4 5 6 7 8 |1 2 ..它们在insert后是物理q箋的,每个数字代表一条数据,一条数?KQ分割符前正好填满一,在做查询时由于不需要指针蟩转,所以效率是最佳的Q而这是update?把它的数据量改ؓ?.2KQ超q原来的一?8K)的大,q时sqlserver会: 1 2 4 5 6 7 8|1 2.....| 3(1.2k) ?攑ֈ最后面可以插入的空间去。?的指针还是指?,如果q时你再索,当检索到2的时候,物理指针蟩转到3上,然后再蟩转回4。如果看懂的话,应该明白了ؓ什么不提倡update索引q的列,不提倡用varcharcd的列当烦引。应为varchar是变长的Q如果你频繁的update它,你的索引会事得其反。而sqlserver里也提供了填充因子来减少来自q方面的影响Q比如你的因子ؓ20%Q当插入数据?发现q个底?0%的可用空_sqlserver不会再l插入这一而是甌新的一存储如Q? 2 3 4 5 6 | 7 8 1 2 .. 当你再update 3?.2K的时候将不会?分到其他上。那是不是填充因子越大越好呢Q不是的Q如果太大,费I间不算什么,主要是会影响查询效率Q应为在查询q程中最大消耗是来自于读取新c所以你必须Ҏ你的实际情况Q适当讄?/P>
l护索引也是很重要的Qupdate是一个破坏烦引的方式Q它不但使指针蟩转,而且使数据冗余,产生了许多碎片。你需要用DBCC INDEXDEFRAG 整理指定的表或视囄聚集索引和辅助烦引碎片。另外我们知道烦引一般会有一个根比如? 2 3 4 5Q那建立索引的时候根?Q取中间的。当我们开始向q个表填加数据,比如q个列是一个顺序增长的? 2 3 4 5...10000Q这时发生了根节点偏U,应ؓ根还?而,好象这个树变成了单ҎQ只往一个方向长。而这个现象是很常见的。而维护烦引也很简单,最有效的办法是用DBCC DBREINDEX重徏索引?BR>SQL Server在每ơ重启服务时会重建tempdb数据?/P>
如果pȝq行q程?tempdb因需要自动增长了QSQL Serve不会C增长后的大小Q重启服务后仍然恢复到初始大,
但如果用户用了手工调整tempdb的大,重启服务SQL Server会把tempdb重徏为用h定大?/P>
试CZ
tempdb初始化大ؓ8MB
1)使tempdb自动增长
select b.* into #t from sysprocesses a,sysobjects b
重启后用sp_helpdb 'tempdb'
可以看到tempdb又恢复到8MB
2) 用户使用Alter Database调整?00MB,
USE master
GO
ALTER DATABASE tempdb
MODIFY FILE
(NAME = tempdev,SIZE = 100MB)
重启服务后用查看tempdb大小׃ؓ100MB
以下查询可以看到tempdb的变?BR>select a.filename,a.name,a.size*8.0/1024.0 as originalsize_MB,
f.size*8.0/1024.0 as currentsize_MB
from master..sysaltfiles a join tempdb..sysfiles f on a.fileid=f.fileid
where dbid=db_id('tempdb')
and a.size<>f.size
ȝ:
当系l自动调整tempdb大小ӞҎ件的d暂时的d
所以如果我们预知tempdb会增加到某个大时Q可以自行调_从而避免性能下降
减少执行q程中的重新~译
Ҏ的查询而言Q由~译q程产生查询计划所付出的代价占是执行整个查询所付出代h的一部分Q所以用事先编译好的计划可以节省时_避免重新~译的情?/P>
存储q程recompile的原?/P>
referenced objects, running the sp_recompile system stored procedure against
a table referenced by the stored procedure,
restoring the database containing the stored procedure or any object referenced by the stored procedure, or the stored
procedures plan dropping from the cache.
删除或者重E?BR>在过E里使用with recomplie语句Q或者在执行时?BR>使用sp_recomlile 使存储过E在下次q行旉新编?BR>恢复数据库时
或者存储过E计划从高速缓存中Ud
如果q程引用表的有够的数据发生变化
如果用户在DDL语句中插入DML语句
SET CONCAT_NULL_YIELDS_NULL
While these recompilations are normal and cannot be helped, DBAs and developers
should not assume that all stored procedure recompiles are for normal reasons and should take a proactive approach to determine if they have a recompile problem.
可以使用profile跟踪q程的重新编?BR>新徏一跟踪
事g删除全部Q选择存储q程下的 SP:Recompile, SP:Starting, and SP:Completed under Stored Procedure events
sP:StmtStarting and SP:StmtCompleted 可以查看哪些语句引vrecompile