版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一 开发 第1章帮助的使 第2章表类型(引擎)的选 Mysql引擎概 各种引擎的特 第3章选择合适的数据类 char与 text和 第4章字符 字符集概 Mysql支持的字符集简 Unicode简 Mysql字符集的设 第5章索引的设计和使 Mysql索引概 Mysql如何使用索 第6章锁机制和事务控 如何加 死 事务控 第7章SQL中的安全问 SQL注入简 第8章SQLMode及相关问 MysqlSQLMode简 SQLMode与可移植 SQLMode与数据效 第9章常用SQL技 利用groupby的withrollup子句做统 用bitgroupfunctions做统 第10章其他需注意的问 第二篇优化 第11章SQL优 优化SQL的一般步 定位执行效率较低的SQL语句 索引问 索引的分 常用SQL的优 优化insert语句 优化groupby语句 优化orderby语句 mysql如何优化or条件 使用SQL提示 第12章优化数据库对 逆规范 第13章锁问 insert…select…带来的问 第14章优化Mysql 查看Mysqlserver当前参 mit的设置 第15章I/O问 使用SymbolicLinks分布 第16章应用优 使用连接 减少对Mysql的 使用mysqlquery 加cache层 负载均 利用mysql分流查询操作 第三篇管理 第17章mysql安装升 安 rpm安装步 mysql升 mysql降 第18章Mysql日志管 错误日志 查询日 第19章数据备份与恢复 冷备份 逻辑备份 位置恢复 MyISAM表修复 第20章Mysql安全 正确设 权限 尽量避免以root权限运行 删除帐号 给mysqlroot帐号设置口令 设置安全并定期修改 FILE、PROCESS或SUPER权限授予管理员以外的帐号: loaddatalocal带来的安全问题 使用merge引擎潜藏的安全 防止DNS droptable命令并不收回以前的相关 使用 增加 old- secure- skip- 第21章Mysql Mysql概述 安装配置 日常管理 经常查看slave状 Slave上出现logevententryexceededmax_allowed_packet错误怎么 多主时,自动增长变量的问 第22章Mysql MysqlCluster概述 MysqlCluster架构 安装配置 管理 Cluster的启 Cluster的关 第23章Oracle向Mysql数据迁移 导出为insertsql文 第24章应急处理 忘记root MyISAM表超过4G无法 数 如何DNS反向解析 第25章Mysql管理中一些常用令和技巧 修改用户 第一篇1章的语法是什么样呢?最好的办法是学会使用mysql的帮助。方法很简单:按照层次看帮mysql>?Youaskedforhelpabouthelpcategory:Formoreinformation,type'help<item>',where<item>isoneofthefollowingDataDefinitionDataTypesFunctionsandModifiersforUsewithGROUPBYGeographicFeaturesStorageEnginesStoredRoutinesmysql>?dataYouaskedforhelpabouthelpcategory:"DataFormoreinformation,type'help<item>',where<item>isoneofthefollowingName:'INT'Anormal-sizeinteger.Thesignedrangeis- Theunsignedrangeis0to 知道show命令都能看些什么东西,可以用如下命令:mysql>?Name:SHOWhasmanyformsthatprovideinformationaboutdatabases,tables,columns,orstatusinformationabouttheserver.Thissectiondescribesthosefollowing:SHOWCHARACTERSET[LIKE'pattern']SHOWCOLLATION[LIKE'pattern']SHOW[FULL]COLUMNSFROMtbl_name[FROMdb_name][LIKE'pattern']SHOWCONTRIBUTORSSHOWCREATEEVENTevent_nameSHOWCREATEFUNCTION mysql>?create[table_option...][table_option...]第2章表类型(引擎)的选Mysql引擎概mysqlMyISAM、InnoDBBDB、MEMORYMERGEEXAMPLENDBClusterARCHIVE、CV、BLACHOLE、FDERATE等,其InnDB和BDB提事务安表,其引各种引擎的特有低低高低低高低高高高低Myisam是Mysql的默认引擎,当create创建新表时,未指定新表的引擎时,默(表定义、.MYD(MYData,数据)、.MYI(MYIndex,索引)。数据文件和索 如何选择合适的引并作为1个对象它们。对于诸如数据仓储等VLDB环境十分适合。3章选择数据类型的基本原 InnoDB引擎和数据列建议使用VARCHAR类型对于InnoDB数据表,内部的行格式没有区分固定长度和可变长度列(所有数据行用可变长度VARCHAR列简单。因而,主要的性能因素是数据行使用的总量。由于CHAR平均占用的空间多于VARCHAR,因此使用VARCHAR来最小化需要处理的数据行的总固定长度数据列与可变长度的数char 值需需 'ab'abmysql>CREATETABLEvc(vVARCHAR(4),cQueryOK,0rowsaffected(0.02mysql>INSERTINTOvcVALUES('ab','ab');QueryOK,1rowaffected(0.00sec)mysql>SELECTCONCAT(v,'+'),CONCAT(c,'+')FROM |CONCAT(v,'+')|CONCAT(c,'+') |ab | 1rowinset(0.00textBLOB和TEXT值也会引起自己的一些问题,特别是执行了大量的删除或更新操作的时候。删除这种值会在数据表中留下很大的"空洞",以后填入这些"空洞"的记录可能长度不OPTIMETABE使用合成的(snteic)索引。的建个,这在据。来以(散列值对于类似<或>=等范围搜索操作符是没有用处的。我们可以使用MD5()函数生成散列值,也可以使用H1CC2值高同果算字有格,就在不必要的时候避免检索大型的BLOB或TEXT值。例如,SELECT*查询就不是很好的想能毫无目的地在网络上传输大量的值。这也是BLOB或TEXT标识符信息在合成的索格的数据行中检索BLOB或TEXT值。主数据表上运行SELECT*查询的时候不会通过网络传输大量的BLOB或TEXT值。浮点数与定点mysql>CREATETABLEtest(c1float(10,2),c2decimal(10,2));QueryOK,0rowsaffected(0.29sec)mysql>insertintotestvalues(131072.32,131072.32);QueryOK,1rowaffected(0.07sec)mysql>select*from | | |131072.31|131072.32 1rowinset(0.00在mysql中float、double(或real)是浮点数,decimal(numberic)是定点数。浮4章字符集是一套符号和编码的规则,不论是在oracle数据库还是在mysql数据库,都Mysqlmysql服务器可以支持多种字符集(可以用showcharacterset命令查看所有mysql支持对规则是一对多的关系,MySQL支持30多种字符集的70多种校对规则。UnicodeASCII,ASCIIASCII256够用的。于是各个国家或组织都相继制定了符合自己语言文字的标准,比如gb2312、big5文字的编码方案。Unicode"UniversalMultiple-OctetCodedCharacterSet",简称为UCS。UCS可以看作是"UnicodeCharacterSet"的缩写。Unicode有两套标准UCS-2和UCS-4,前者用2个字节表示一个字符,后者用4个字节表示一个字符。以目前常用的UCS-2为例,它可以表示的字符数为2^16=65535,基本上可以utf8、gb2312、gbk、latin1gb2312和gbk。因为gb2312字库比gbk字库小,有些偏僻字(例如:洺)不能保存,因此定答复的话最好选用gbk。Mysql f中设置:./configure--with-如果没有特别的指定服务器字符集,默认使用latin1作为服务器字符集。上面三种设置可以用showvariableslike'character_set_server';命令查询当前服务器的字符5Mysql 在MySQL5.1中,对于MyISAM和InnoDB表,前缀可以达到1000字节长。请注意前缀的限制应以字节为单位进量,而CREATETABLE语句中的前缀长度解释为字符数。当引使用R-树。默认情况MEMORY(HEAP)引擎使用hash索引,但也支持B-树索引。设计索引的原句中的列,或连接子句中指定的列,而不是出现在SELECT关键字后的选择列表中的列。重复值的列,其索引效果。例如,存放的列具有不同值,很容易区分各行。而用来记录的列,只含有“M”和“F”,则对此列进行索引没有多大用处(不管搜使用短索引。如果对串列进行索引,应该指定一个前缀长度,只要有可能就应该这样做。例如,如果有一个CHAR(200)列,如果10个或20个字符内,多数值是惟一的,那1020I/O更为以在内存中容纳的值。这增加了找到行而不用索引中较多块的可能性。为这个索引中不会有许多不同的值。)利用最左前缀。在创建一个n列的索引时,实际是创建了MySQL可利用的n个索引。越长。如果有一个索引很少利用或从不使用,那么会不必要地减缓表的修改速度。此外,和BETWEEN运算。在模式具有一个直接量前缀时,索引也用于LIKE运算。如果只将btree索引与hash关键元素与常量值的比较关系对应一个范围条件。Hash索引还有一些其它特征:它们只用(该类索引不能用来按顺序搜索下一个条目)。MySQL不能确定在两个值之间大约有多少行(这被范围优化器用来确定使用哪个索引)。如果你将一个MyISAM表改为hash-索引的MEMORY表,对于BTREE索引,当使用>、<、>=、<=、BETWEEN、!=或者<>,或者LIKE'pattern'(其中'pattern'不以通配符开始)操作符时,关键元素与常量值的比较关系对应一个范围条件。“常量值”系指:查询字符串中的常量、同一联接中的const或system表中的列、无关联下面是一些WHERE子句中有范围条件的查询的例子:下列范围查询适用于btree索引和hash索引SELECT*FROM WHEREkey_col= ORkey_colINbtreeSELECT*FROM WHEREkey_col> ANDkey_col<SELECT*FROMt1 WHEREkey_colLIKE'ab%' ORkey_colBETWEEN'bar'ANDMysql索于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记果一个表有1000行,这比顺序至少快100倍。注意如果你需要大部分行,顺序读空间列类型的索引使用R-树,并且MEMORY表还支持hash6如何加LOCKtbl_name[ASalias]{READ[LOCAL]|[LOW_PRIORITY][,tbl_name[ASalias]{READ[LOCAL]|[LOW_PRIORITY]WRITE}]UNLOCK死LOCKTABLES设定表锁定的地方或者涉及InnoDB之外的引擎设置锁定的地方检测死锁。事务控MySQL通过 MIT,STARTTRANSACTION,COMMIT和ROLLBACK等语句支持本STARTTRANSACTION|BEGINCOMMIT[WORK][AND[NO]CHAIN][[NO]RELEASE]ROLLBACK[WORK][AND[NO]CHAIN][[NO]RELEASE] MIT={0|1}默认情况下,是mit的,如果需要通过明确的commit和rollback来提交和STARTTRANSACTION或BEGIN语句可以开始一项新的事务。SETMIT可以修改当前连接的提交方式,如果设置了SETMIT=0,则设置之后的所有事务都需要通过明确令进行提交或者回滚。mysql>mysql>select*frommysql>select*fromEmptyset(0.00Emptyset(0.00mysql>startQueryOK,0rows QueryOK,1rowmysqlselect*fromEmptyset(0.00mysql>QueryOK,0rows-mysqlselect*from | |name | |100 1rowinset(0.00 QueryOK,1rowmysql>select*from | |name | |1.00| |2.00 2rowsinset(0.00mysql>startQueryOK,0rows QueryOK,1rowaffectedmysql>commitandQueryOK,0rows QueryOK,1row(0mysql>select*from | |name | |1.00| |2.00| |300 3rowsinset(0.00mysql>QueryOK,0rowsmysql>select*from | |name | |1.00| |2.00| |3.00| |400 4rowsinset(0.00mysql>select*fromEmptyset(1665mysql>select*fromEmptyset(1665mysqllocktablett3write;QueryOK,0rowsaffected(0.00mysql>select*from QueryOK,1rowaffectedmysql>QueryOK,0rowsaffected(000-mysql>startQueryOK,0rowsmysqlselect*from | |name | |100 1rowinset(37.71不同的savepoint。需要注意的是,如果定义了相同名字savepoint则后面定义的savepoint会覆盖之前的定义。对于不再需要使用的savepoint,可以通过releasesavepoint命令删除savepoint,删除后的savepoint,不能再执行rollbacktosavepoint命令。mysql>select*from+ | |name+ | |2.00| |3.00| |400+ 3rowsinset(0.00mysql>select*from+ | |name+ | |2.00| |3.00| |400+ 3rowsinset(0.00mysql>startQueryOK,0rowsaffected(0.00mysql>deletefromtt3whereid=QueryOK,1rowaffected(0mysql>select*from+ | |name | |3.00| |4.00+ 3rowsinset(000mysql>select*from+ | |name | |2.00| |3.00| |4.00 3rowsinset(0.00mysql>savepointQueryOK,0rowsaffectedmysql>deletefromtt3whereidQueryOK,1rowaffectedmysql>select*frommysql>select*from+ | |name+ | |name | |4.00| |2.00+ 3rowsinset(0.00| |3.00| |4.00 3rowsinset(0.00mysql>rollbacktosavepointQueryOK,0rowsaffectedmysql>select*frommysql>select*from | |name+ | |3.00| |name+ | |2.00| |400| |300+ 2rowsinset(0.00| |4.00+ 3rowsinset(0.00OK,0mysqlselect*frommysqlselect*from+ + | |name| |name+ + | |300| |300| |4.00| |4.00+ + 2rowsinset(0.002rowsinset(0.007章SQLSQL丁或者进行简单的安全配置进行自我保护,一般的也无法SQLInjectionSQLInjection结构化查询语言(SQL)是一种用来和数据库交互的文本语言。SQLInjection就是利$sql="SELECT*FROMuserWHEREusername='$username'AND$result=mysql_db_query($dbname,'or们提交的时候是把后面的代码注释掉,值得注意的是由于编码问题,在IEprepareStatement+Bind-Java,Jsp开发的应用,可以使用prepareStatement+Bind-variable来防止sql注入,另外从PHP5开始,也在扩展的mysqli中支持preparedstatements,所以在使用这类语言作数据库开发时,强烈建议使用prepareStatement+Bind-variable来实现,而尽量不要使用拼接的sql。MySQLCAPImysql_real_escape_stringAPIMySQL++escapequotePHPmysql_real_escape_string()函数(PHP4.3.0,之前的版支持preparedstatements。PerlDBI :使用placeholders或者quote()方法。RubyDBI :使用placeholders或者quote()方法。JavaJDBC :使用PreparedStatement和placeholders。8章SQLModeMysqlSQLMode不同的环境下、与其他数据库服务器一起更容易地使用MySQL。可以使用“--sql-SET[SESSION|GLOBAL]sql_mode='modes'语句,通过设置sql_modelinux下安装完mysqlsql-mode值是空,在这种情形下mysql执行的是一种不严格的检查,例如日期字段可以插入’0000-00-0000:00:00’这样的值,还有如果要插入mysql>createtablet5(c1char(3));mysql>insertintot5values('abcd');mysql>select*fromt5;+| | 1rowinset(0.00我们可以设置sql_mode为STRICT_TRANS_TABLES,如下:mysql>setsessionmysql>insertintot5ERROR1406(22001):Datatoolongforcolumn'c1'atrowSql_mode如果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表,1MakeMySQL的行为象“传统”SQL数据库系统。该模式的简单描述是方式不是你想要的,因为出现错误前进行的数据更改不会“滚动”,结果是更新“只进行了部分”。中插入或更新不正确的值时,mysqlinsert/update操作。在我们的是,如果数据库运行在严格模式下,并且你的引擎不支持事务,那么有数据不一致的风sql中有两个dml语句,如果后面的一个出现了问题,但是前面的已经操mysqlsql_mode需要应用人员权衡各种Sql_modePIPES_AS_CONCATANSI_QUOTESSql_modePIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSPIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSNOTABLEOPTIONSNOFIELD NOAUTOCREATEPIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSNO_TABLE_OPTIONSPIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSPIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_KEY_OPTIONSNOTABLEOPTIONSNOFIELDSQLMode·将||视为字符串连接操作符(+)CONCAT()),而不视为OR9SQL检索包含最大/最小值MIN([DISTINCT]expr),MAX([DISTINCT]exprMIN()MAX()些情况下,它们返回最小或最大字符串值。DISTINCT可以被用来查找expr的不同值的最小或最大值,然而,这产生的结果与省略DISTINCT的结果相同。若找不到匹配的行,MIN()MAXNULLmysql>SELECTstudent_name,MIN(test_score),- FROM- GROUPBY巧用rand()/rand(nmysql>SELECT*FROMtbl_nameORDERBYmysql>SELECT*FROMtable1,table2WHEREa=bANDc<dORDERBYRAND()LIMIT1000;利用groupbywithrollup intnotnull,countryvarchar(20)notnull,productvarchar(32)notprofitselectyear,sum(profit)fromsalesgroupbyselectyear,sum(profit)fromsalesgroupbyyearwithrollup;selectyear,country,product,sum(profit)fromgroupbyyear,country,selectyear,country,product,sum(profit)fromsalesgroupbyyear,country,productwithinsertintosalesvalues(2004,'china',' insertintosalesvalues(2004,'china',' insertintosalesvalues(2004,'china',' insertintosalesvalues(2005,'china',' insertintosalesvalues(2005,'china',' insertintosalesvalues(2005,'china',' insertintosalesvalues(2005,'china',' insertintosalesvalues(2005,'china',' insertintosalesvalues(2005,'china',' insertintosalesvalues(2006,'china',' insertintosalesvalues(2006,'china',' insertintosalesvalues(2006,'china',' selectyear,country,product,sum(profit)fromsalesgroupbyyear,country,selectyear,country,product,sum(profit)fromsalesgroupbyyear,country,productwithFROMsalesGROUPBYyear,country,productWITHROLLUPLIMIT5;和ORDERBYLIMITROLLUP用bitgroupfunctions统Groupby- FROM- GROUPBY在本小节,groupbybit_and,bit_or函数共同使用完成统计工作,先来了解一下bit_and和bit_or函数,举例如下:->`id`smallint(5)unsignedNOTNULLdefault->KEY`id`->)QueryOK,0rowsaffected(0.01QueryOK,8rowsaffected(0.00sec)Records:4Duplicates:0Warnings:0mysql>SELECTBIT_OR(id)from |BIT_OR(id) 7 1rowinset(0.00#####OR##mysql>SELECTBIT_AND(id)from |BIT_AND(id) 0 1rowinset(0.00 #AND..1111 熟悉了bit_and和bit_or后我们一起来学下bit_and,bit_or和groupby函针对上面的表tacust_typealtertableta addcolumn cust_typevarchar(100);updatetasetcust_type='2'whereid>3;updatetasetcust_type wherecust_typeismysql>SELECTcust_type,BIT_OR(id)from groupby |cust_type|BIT_OR(id) | 3| 4 2rowsinset(0.00mysql>SELECTcust_type,BIT_and(id)from groupby |cust_type|BIT_and(id) | 0| 4 2rowsinset(0.00 所有比特被设置为1)。若找不到匹配的行,则函数返回0。若找不到匹配的行,则函数返回0。10MySQL中,数据库对应数据中的。数据库中的每个表至少对应数据库中认文件系统类型(HFS+),对大小写不敏感。然而,MacOSX也支持UFS敏感,就像Unix一样。小写来给定的数据库或表。下面的查询不会工作,因为它同时了表my_tables和asmysql>SELECT*FROMmy_tableWHERE列、索引、子程序和触发器名在任何平台上对大小写不敏感,列的别名也不敏感。默认情况,表别名在Unix中对大小写敏感,但在Windows或MacOSX中对大小写不敏感。下查在Unix名a和A:mysql>SELECTcol_nameFROMtbl_nameAS->WHEREa.col_name=1ORA.col_name=如总是用小写创建并数据库名和表名。在大多数移植和使用中建议使用该转换。在MySQLlower_case_tables_name统变量确定,可以在启动mysqld时设置。lower_case_tables_name可以采用下面的任一值:值含0使用CREATETABLECREATEDATABASE库名。名称比较对大小写敏感。在Unix不敏感的文件系统上用lowercasetablenames00,并且使用不同的大小12表名和数据库名在硬盘上使用CREATETABLECREATEDATABASEMySQL注释:只在对大小写不敏感的文件系统上适用!InnoDB表名以小写保存,例如lowercasetablesname1MySQL,通常不需要更改lower_case_tables_name变量。lower_case_tables_name=1。使用该选项的不利之处是当使用SHOWTABLES或SHOWDATABASES时,看不出名字原来是用大写还是小写。Unix中使用lower_case_tables_name=0,在Windows中使用lower_case_tables_name=2。例外:如果你正使用InnoDB表,在任何平台上均应将lower_case_tables_name设置为1,请注意在Unix中将lower_case_tables_name设置为1之前,重启mysqld之前,必InnoDBREFERENCEStbl_name(col_name)子句定义列时可MySQL不执行表tbl_name中的动作,例如作为你正定义的表中的行的动作的响应而删除行;换句话说,该句法不会致使ONDELETEONUPDATE行为(如果你在REFERENCES子句中写入ONDELETEONUPDATE子句,将被忽略)。如果用该句法定义InnoDB表,将会导致错误。 idSMALLINTUNSIGNEDNOTNULLAUTO_INCREMENT,nameCHAR(60)NOTNULL,styleENUM('t-shirt','polo','dress')NOTcolorENUM('red','blue','orange','white','black')NOTownerSMALLINTUNSIGNEDNOTNULLREFERENCES PRIMARYKEY(id) SELECT@last:=(NULL,'polo','blue',(NULL,'dress','white',(NULL,'t-shirt','blue', SELECT@last:=(NULL,'dress','orange',(NULL,'polo','red',(NULL,'dress','blue',(NULL,'t-shirt','white',SELECT* |id| |1|Antonio |2|LillianaAngelovska SELECT*FROM |id| |color|owner |1| | 1|2| |white 1|3|t-shirt| 1|4| |orange 2|5| | 2|6| | 2|7|t-shirt|white 2 SELECTs.*FROM p,shirtsWHERELIKE'Lilliana%'ANDs.owner=p.idANDs.color<> |id|style|color|owner |4|dress|orange 2|5|polo| 2|6|dress| 2 SHOWCREATETABLE***************************1.row***************************Table:shirtCreateTable:CREATETABLE`shirt``id`smallint(5)unsignedNOTNULL`style`enum('t-shirt','polo','dress')NOT`color`enum('red','blue','orange','white','black')NOT`owner`smallint(5)unsignedNOTNULL,PRIMARYKEY(`id`))ENGINE=MyISAMDEFAULT第二篇优化11章SQL优化SQL的一般步showstatus和应用特点了解各种SQL的执行statusSHOWSTATUSsessionglobal以下几个参数对Myisam和Innodb引擎都计数执行执行Innodb_rows_readselect执行查询操作为主,以及各种类型的SQL大致的执行比例是多少。对于更新操作的计数,是mitCom_rollback以了解事务提交和回滚 Slow_queriesSQL可以通过慢查询日志定位那些执行效率较低的sql语句,用--log-slow-queries[=file_name]选项启动时,mysqld写一个包含所有执行时间超过慢查询日志并不能定位问题,可以使用showprocesslistMySQLEXPLAINSQL通过以上步骤查询到效率低的SQL后,我们可以通过explain或者desc获取更快的SELECT。mysql>explainselectsum(moneys)fromsales panysbwhere pany_id=b.idanda.year=2006; - | |table|type|possible_keys| | | - | | |index| | | 1 || | | | | |NULL 12 | - 2rowsinset(0.02 select possible_keys:表示查询时,可以使用的索引列. 表的year字段创建了索引,查询需要扫描的行数明显较少。mysql>explainselectsum(moneys)from panysb pany_idb.idanda.year= - | |table|type|possible_keys| | | - | | |index| | | 1 Using||SIMPLE |a |ref |year |year |4 3| - 2rowsinset(0.02索引问索引的分CREATE[UNIQUE|FULLTEXT|SPATIAL]INDEX[USINGONtbl_name col_name[(length)][ASC| createindexind_testonMySQL均匀分布在1和100之间,下列查询中使用索引就不是很好:SELECT*FROMtable_namewherekey_part1>1andkey_part1<值读的次数,很低的值表明增加索引得到的性能改善不高,因为索引并不经常使用。mysql>showstatuslike两个简单实用的优化方YZEYZE[LOCAL|NO_WRITE_TO_BINLOG]TABLEtbl_name[,tbl_name]定。这对于MyISAM,BDB和InnoDB表有作用。对于MyISAM表,本语句myisamchkCHECKCHECKTABLEtbl_name[,tbl_name]...[option]...option={QUICK|FAST|MEDIUM|EXTENDED|CHANGED}CHECKSUMCHECKSUMTABLEtbl_name[,tbl_name]...[QUICK|EXTENDEDoptimizeOPTIMIZEOPTIMIZE[LOCAL|NO_WRITE_TO_BINLOG]TABLEtbl_name[,tbl_name]以使用OPTIMIZETABLE来重新利用未使用的空间,并整理数据文件的碎片。OPTIMIZETABLEMyISAM,BDBInnoDB表起作用。常用SQL的优ALTERTABLEtblnameDISABLEloadingtheALTERTABLEtblnameENABLE这两个命令用来打开或者关闭Myisam个非空的Myisam数据到一个空的Myisam而对于Innodb类型的表,这种方式并不能提高导入数据的效率。对于Innodb类型在导入数据前执行SETUNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET如果应用使用自动提交的方式,建议在导入前执行SETMIT=0,关闭自动提交,导入结束后再执行SETMIT=1,打开自动提交,也可以提高导入的效率。insertInsertintotest如果你从不同客户插入很多行,能通过使用INSERTDELAYED语句得到更高的速度。Delayedinsert没有真正写入磁盘;这比每条语句分别插入要快的多;LOW_PRIORITY度,但是,这只能对myisam表使用;INSERT语句快20倍;groupby默认情况下,MySQLGROUPBYcol1,col2,中指定ORDERBY INSERTINTOSELECTa,COUNT(*)FROMbarGROUPBYaORDERBYorderby序。where条件和orderby使用相同orderby的顺序和索引顺序相同,并且orderby的字段都是升序或者都是降序。SELECT*FROMt1ORDERBYkey_part1,key_part2,...SELECT*FROMt1WHEREkey_part1=1ORDERBYkey_part1DESC,key_part2SELECT*FROMt1ORDERBYkey_part1DESC,key_part2SELECT*FROMt1ORDERBYkey_part1DESC,key_part2--orderby的字段混合ASCSELECT*FROMt1WHEREkey2=constantORDERBY--用于查询行的关键字与ORDERBY中所使用的不相SELECT*FROMt1ORDERBYkey1,--对不同的关键字使用ORDERjoinMysql4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的SELECT*FROMcustomerinfoWHERECustomerIDNOTin(SELECTCustomerIDFROMsalesinfo)SELECT*FROMLEFTJOINsalesinfoONcustomerinfo.CustomerID=salesinfo.CustomerIDWHEREsalesinfo.CustomerIDISNULLmysqlor对于or子句,如果要利用索引,则or之间的每个条件列都必须用到索引;如果查询优先还是更新(insert、update、delete)优先LOW_PRIORITY(低优先级)请求,那么系统就不会认为它的优就允许第二个者插到写入者之前。只有在没有其它的者的时候,才允许写入者开始SELECT查询的HIGH_PRIORITY(高优先级)关键字也类似。它允许SELECT插入正先级的SELECT在正常的SELECT语句之前执行,因为这些语句会被写入操作阻塞。如果你希望所有支持LOW_PRIORITY选项的语句都默认地按照低优先级来处理,那么请使用--low-priority-updatesINSERTHIGH_PRIORITY来把INSERT语句提高到正常的写入优先级,可以消除该选项对单个INSERT语句的影响。SQL当处理一个会让客户端耗费点时间才能处理的大结果集时,可以考虑使用USEUSEINDEXMySQ去参考的索引列表,就可以让MySQL不再考虑其他可用的索引。Eg:SELECT*FROMmytableUSEINDEX(mod_time,name)IGNORE为Hint。Eg:SELECT*FROMmytaleIGNOREINDEX(priority)FORCEMySQL使用一个特定的索引,可在查询中使用FORCEINDEX作为HintEg:SELECT*FROMmytableFORCEINDEX(mod_time)SELECT查询,以避免与锁定表有关的由于读、写MyISAM表,插入操作和查询操作可以并行进行,因为没有少MySQL需要做的语法分析从而提高插入速度。通过可以提高某些操作的性能。可以在服务器中分布客户的检索以均分负载。12章我们可以使用PROCEDUREYSE()对当前已有应用的表类型的判断,该函数可SELECT*FROMtbl_namePROCEDUREYSE();SELECT*FROMtbl_namePROCEDUREYSE(16,256);通过拆分,提高表的效中,这样可以有效的避免Myisam表的和更新导致的锁问题。逆规范使用冗余统计使用createtemporarytablesession内存里面,当session断掉后,表自然消除。对于大表的统计分析,如果统计的数据量不大,利用insert。。。select将数据13章获取锁等待情可以通过检查table_locks_waitedtable_locks_immediatemysql>showstatuslike | |Value | | |Table_locks_waited| 2rowsinset(0.00mysql>showstatuslike | |Value ||0|||||||| || 3|+++5rowsinset(0.00Monitors,然后通过Showinnodbstatus察看,设置的方式是:CREATETABLEinnodb_monitor(aINT)DROPTABLE设置监视器后,在showinnodbstatusUPDATEtbl_nameSETcolumn=valueWHEREDELETEFROMtbl_nameWHERESELECTINSERTUPDATEDELETEGROUPBYinsertselect型的,不论insert的表是什么类型的表,都会对select的表的进行锁定。orcleraleoaeneteemysqlselect究其主要原因,是因为mysql在实现的机制时和oracle是不同的,如果不进行select某些文档中提到可以通过设置innodb_locks_unsafe_for_binlog来避免这个现象,可能带来非常严重的隐患。如果使用这个binlog进行从数据库的恢复,或者进行主因此,我们并不推荐通过设置这个参数来避免insert...select.导致的锁,如果需要进行可能会扫描大量数据的inert...eectoe和loadatainile行锁定的。next-key在行级锁定中,InnoDBnext-keylockingInnoDBInnoDB对索引记录设置的锁定也映像索引记录之前的“间隙”。如果一个用户对一个索引上的记录RR一索录个的被来止的题”。行插入一个重复。因此,thenext-keySELECTFORUPDATE,SELECTLOCKINSHAREMODE,UPDATE和DELETEnext-key锁定,用next-key锁定或者间隙锁定锁住搜索的索引范围,并且其它用在持续读中,有一个与READCOMMITTED级别重要的差别:在这个级别,在同一事务内发出数个无格式SELECTSELECTREADCOMMITTED级别是一个有些象Oracle的级别。所有SELECT...FORUPDATESELECTLOCKINSHAREMOD在范围类型UPDATE和DELETE语句,InnoDB必须对范围覆盖的间隙设置next-复起作用,“行”必须被掉如果应用是从基于ORACLE的应用迁移到MYSQL数据库的,那么建议使用该级别提供数据库服务,因为该级别是最接近ORACLE的默认级别的,迁移可能如何减少锁根据应用的情况,尝试横向拆分成多个表或者改成Myisam分区对减少锁也会有索引,那么即便你只是要更新其中的一行,也是全表锁定的。要确保sql是使用索引来的,必要的时候,请使用explainsql执行计划,判里和Oracle有比较大的不同。SHOWINNODBSTATUS事务的详细信息,包括执行的SQL语句的内容,每个线程已经获得了什么锁,在等如果你正使用锁定读,(SELECTFORUPDATELOCKINSHARE试着用更低的级别,比如READCOMMITTED14Mysql查看Mysqlserver当前参mysqld--verbose--s>mysqladminvariablesmysql>SHOWs>mysqladminextended-mysql>SHOW影响Mysql性能的重要参key_buffer_size据需要分配。此参数只适用于myisam引擎。和mysql>CACHEINDEXt1,t2,t3IN的键高速缓冲的大小来创建键高速缓冲。例如:SETGLOBALmysql>SETGLOBAL括配置键高速缓冲的变量设定值,和一个init-file选项用来命名包含待执行的CACHEINDEX语句的一个文件。例如:key_buffer_size=4Ghot_cache.key_buffer_size=2Gcold_cache.key_buffer_size=每次服务器启动时执行mysqld_init.sql中的语句。该文件每行应包含一个SQL下面的例子分配几个表,分别对应hot_cache和cold_cache:CACHEINDEXa.t1,a.t2,b.t3INhot_cacheCACHEINDEXa.t4,b.t5,b.t6INcold_cache以预装表t1和t2索引的非叶节点(索引块):mysql>LOADINDEXINTOCACHEt1,t2IGNOREmysql>SETGLOBALcold_cache。table_cache说明:数据库中打开表的缓存数量。table_cache与max_connections有关。例如,对mysql>SHOWSTATUSLIKE |Variable_name|Value |Opened_tables|2741 innodb_buffer_pool_size缓存InnoDB数据和索引的内存缓冲区的大小。你把这个值设得越高,表中 mit1logbuffer写据库的时候损失一部分数据,那么设置成0或者2都会有所改善。设置成0,则在库的会那有入文的,丢失12到磁盘,但是已经写入日志文件以只要操作系统没有,那么并没有丢失数据,0建议将这个参数设置为1的。InnoDB据 1B用里越你在分多内如IoB池内的内存,InnoDB开始从操作系统分配内存,并且往MySQL错误日志写警告信息。大相定。InnoDBLOCKTABLES,直到所有其它线程已经释放他们所有对表的锁定,MySQLLOCKTABLEWRITE1,这意为LOCKTABLESInnoDB内部锁定一个表。在使用MIT=1应用里,InnoDB部表锁定会可以通过设置innodb_table_locks=0来消除这个问题。理。默认值是50秒,根据应用的需要进行调整。通过该参数设置是否支持分布式事务,默认值是ON1,表示支持分布式事次数并获得更好的InnoDB性能。默认地,InnoDB所有数据两次,第一次到doublewrite缓冲,然后存skip-innodb-doublewrite关闭这个设置。间。通常8-16MB就足够了。越小的系统它的值越小。15章I/O使用磁盘阵列或虚拟文件卷分布分条意味着你有许多磁盘,将第1个块放到第1个硬盘,第2个块放到第2个磁盘,并且第N(Nmodnumber_of_disks)磁盘上等等。这意味着如果正常数据大小小于为了高可靠性你可能想使用RAID0+1(条纹加镜像),但在这种情况下,需要2*N块磁盘来保持N个磁盘的数据。如果你肯为它花钱,这可能是最好的选项。然而,你可能还必RAID级别。例如,保存可以在RAID0硬盘上重新生成的不太重要的数据,但保存真正重要数据(例如主机信息和日志)到使用SymbolicLinks可以将表和数据库从数据库移动到其它的位置并且用指向新位置的符号进符号一个数据库的方法是,首先在一些有空闲空间的硬盘上创建一个,然后从MySQL数据中创建它的一个符号。s>mkdirs>ln-s/dr1/databases/test 如果mysqld没有运行,符号可以从服务器命令行使用ln-s手动完成。同样,通过使DATADIRECTORYINDEXDIRECTORY选项创建表,你可以指示运行的MySQL任何临时文件创建在数据文件或索引文件所处的中。数据库有写权限的原因。库中的符号被重新命名为一个新名字并且数据文件和索引文件也相应地重新 能够使用mysqld来删除或重新命名数据 ALTERTABLEDATADIRECTORYINDEXDIRECTORYBACKUPTABLE和RESTORETABLE不考虑符号16章对于数据库来说,建立连接的代价比较昂贵,因此,我们有必要建立"连接池"以 后 减少对Mysqlmysqlqueryshowvariableslike‘%query_cache%’;query_cache_size表明缓存区大小,单位为Mquery_cache_type的变量值从0到2,含义分别为或者off(缓存关闭变含变含没有被缓存的查询数目(不能被缓存的,或由于cacheCache(高速缓存)、Memory(内存)、Harddisk(硬盘)都是数据存取单元,但存取速PUCache数,不从存硬盘低个量速度存数。而Cache的是CPU(或程序)证Cache中率(HitRte)。因此,CPU内容肯定是只读的。需要你做的工作很少,程序中的SQL语句和直接DBMS时没有分别,返回的结果也看不出有什么差别。而数据库厂商往往会在DBServer的配置文件中提供与Cache相关的参数,通过修改它们,可针对我们的应用优化Cache的管理。负载均利用mysql分流查询操作mysql从5.0.3开始支持分布式事务,当前分布式事务只对 引擎支持现的时候,可以使用mysql的Cluster功能(NDB引擎)或者自己编写程序来实现全局事务第三篇管理17章mysql安装多个mysql装多个mysql需要单独客户es库库库sql-share/mysql基准程序和crashme试sql-benchrpms>rpm-ivhMySQL-server-VERSION.i386.rpms>rpm-ivhMySQL-client-二进制安装步s>groupadds>useradd-gmysqlmysqls>cd/home/mysqls>tar-xzvf/home/mysql/mysql-VERSION-OS.tar.gzs>ln-smysql-VERSION-OS.tar.gzmysqls>cds>scripts/mysql_install_db--user=mysqls>chown-Rroot:mysql.s>chown-Rmysql:mysqldatas>bin/mysqld_safe--user=mysql&s>groupadds>useradd-gmysqls>gunzip<mysql-VERSION.tar.gz|tar-xvf-s>cdmysql-VERSIONs>./configure--prefix=/usr/local/mysqls>makes>makes>cpsupport-f s>cd/usr/local/mysqls>bin/mysql_install_db--user=mysqls>chown-Rroot.s>chown-Rmysqlvars>chgrp-Rmysql.bin/mysql_install_db--s>./configure--s>./configure--without- 似于下列configure命令的一个: (通常是“/usr/local/var”)并且把它改为/usr/local/mysql/data。编译完MySQL后,可以通过选项文件更改这些选项修改sockets>./configure\--with-unix-socket-只选择要使用的字符集s>./configure--with-./configure--with-s>./configure--with-extra-charsets=LISTlist可以是下面任何一项:all–,以将所有字符集包括进二进制使用pgcc编译pgcc2.90.29CFLAGS="-O3-mpentiumpro-mstack-align-double"CXX=gccCXXFLAGS="-O3-mpentiumpro-mstack-align-double-felide-constructors-fno-exceptions-fno-s --with-client-ldflags=-allwith-mysqld-ldflags=-all-mysqls>mysqladmin-hhostname-Pport-uuser-ppasswdcreatedb_names>mysqldump--optdb_name|mysql-h hostname-Pport-uuser-ppasswd mysql数据库全部cpmysql在s里面执行mysql_fix_privilege_tables命令升级权限表 s>mkdirs>mysqldump--tab=DUMPDIR将DUMPDIR s>mysqladmincreatedb_name #createdatabases>catDUMPDIR/*.sql|mysqldb_name #createtablesindatabases>mysqlimportdb_nameDUMPDIR/*.txt #loaddataintotablesmysql数据库全部cpmysql在s里面执行mysql_fix_privilege_tables命令升级权限表 下的所有文件(.frm,.MYD,MYI)cp到新库下的相应 mysql数据库全部cpmysql在s里面执行mysql_fix_privilege_tables命令升级权限表mysql没有给定file_name值,mysqld使用错误日志名 并在数 中写s>mysqlbinloglog-PURGEMASTERLOGSTOmysql-bin.010';//删除mysql-bin.010之前所有日志PURGEMASTERLOGSBEFORE'2003-04-0222:46:26'2003-04-0222:46:26之前产生的所有日志告诉主服务器,如果当前的数据库(即USE选定的数据库)是db_name,应将更新记录到二进制日志中。其它所有没有明显指定的数据库被忽略 具有SUPER权限的客户端可以通过SETSQL_LOG_BIN=0语句将自己的语句查询日用--log[=file_name]或-l[file_name]选项启动它。如果没有给定file_name的值,用--log-slow-ueries[file_nae]选项启动它。如果没有给出file_name。使用mysqldumpslow命令获得日志中显示的查询来处理慢查询日志,例如[zzx@bj37data]$mysqldumpslowbj37-理语句,例如OPTIMIZETABLE、YZETABLE和ALTERTABLE写入慢查询日19冷备份 mysqldump–uroot–p***pointcard–F>mysql–uroot–p***pointcard<使用mysqlbinlogmysqldumpbinlog。mysqlbinlog$HOME/data/mysql-bin.123456|mysqlurootp***单个表的备份mysql>select*intooutfile‘/tmp/order_tab’fields-terminated-frommysqldump–uroot–p***–T/tmppointcardorder_tab--fields-mysql>loaddata[local]infile order_tabfields-terminated-by=’,’;mysqlimport–uroot–p*** pointcatdorder_tab.txt--terminated-by,windowsline-terminated-by=’\r\n’,linux上设置为使用备份工具ibbackup是innodb公司( )的一个热备份工具,专门对innodb引擎进行物理热备份,此工具是的,不能免费使用。现在innodb公司已经被oracle datadir=innodb_data_home_dir=/home/heikki/datainnodb_data_file_path=ibdata1:10M:autoextendinnodb_log_group_home_dir=/home/heikki/dataset-variable=innodb_log_files_in_group=2set-variable=innodb_log_file_size=20M datadir=/home/heikki/backupinnodb_data_home_dir=/home/heikki/backupinnodb_data_file_path=ibdata1:10M:autoextendinnodb_log_group_home_dir=/home/heikki/backupset-variable=innodb_log_files_in_group=2set-variable= ibbackup--apply- ./bin/mysqld_saft-- f mysqlbinlog--stop-date="2005-04-20/var/log/mysql/bin.123456|mysql-urootmysqlbinlog--start-date="2005-04-20/var/log/mysql/bin.123456|mysql-uroot-pmypwdmysqlbinlog--start-date="2005-04-209:55:00"--stop-date="2005-04-2010:05:00"/var/log/mysql/bin.123456>/tmp/mysql_restore.sql 如前后位置号分别是368312和368315。恢复了以前的备份文件后,你应从命令行mysqlbinlog--stop-position="368312"/var/log/mysql/bin.123456|mysql-uroot-mysqlbinlog--start-position="368315"/var/log/mysql/bin.123456|mysql-uroot-pmypwdmysqlbinlog的输出包括每个SQL之前的SETTIMESTAMPMySQLMyISAM修复“tbl_name.frm”被锁定不能更改不能找到文件“tbl_name.MYI”(Errcode:nnn)myisamchk-rmyisamchk-oCHECKTABLEtbl_name[,tbl_name]...[option]option={QUICK|FAST|MEDIUM|EXTENDED|REPAIR[LOCAL|NO_WRITE_TO_BINLOG]tbl_name[,tbl_name]...[QUICK][EXT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 古代汉语的词类活用
- 信息技术(第2版)(拓展模块)教案1-模块3 3.1 认知大数据
- 高中物理第一章电场第一节认识静电课件粤教版选修3-
- 小学生心理健康教育教案12
- 初中健康教育教案
- 课时4 七年级 Unit 4 2025年中考英语(仁爱版)一轮复习基础练(含答案)
- 【中考考点基础练】阶段检测二 力学综合素养提升 2025年物理中考总复习(福建)(含答案)
- 2024至2030年中国晶闸管交流电力控制柜数据监测研究报告
- 2010-2012年中国工程塑料行业市场研究及投资分析报告
- 2024至2030年中国工艺霓虹灯数据监测研究报告
- 校园充电桩可行性方案
- 《就业形势分析》课件
- 先进核电技术研发项目实施方案
- 医院感染预防与控制中的职业暴露预防
- 银行安防知识教育
- 公路工程质量检验评定标准 第二册机电工程 JTG 2182-2020
- 八年级英语阅读竞赛试卷及答案
- 运动障碍疾病护理查房
- 分红合同附加协议
- 矿通风系统检测报告2
- 建设工程项目管理培训课件
评论
0/150
提交评论