仓酷云

标题: 发布完整优化mysql数据库功能的八个办法 [打印本页]

作者: 蒙在股里    时间: 2015-1-16 20:14
标题: 发布完整优化mysql数据库功能的八个办法
WindowsAzureSQLDatabase并不支持数据压缩和表分区之类的功能,而且SQLDatabase支持的Transact-SQL语言只是完整版的一部分。另外,因为解决方案提供商不能控制物理资源,所以他们不能将数据文件和索引分配给特定的硬件。1、拔取最合用的字段属性
  MySQL能够很好的撑持年夜数据量的存取,可是一样平常说来,数据库中的表越小,在它下面实行的查询也就会越快。因而,在创立表的时分,为了取得更好的功能,我们能够将表中字段的宽度设得尽量小。比方,在界说邮政编码这个字段时,假如将其设置为CHAR(255),明显给数据库增添了不用要的空间,乃至利用VARCHAR这类范例也是过剩的,由于CHAR(6)就能够很好的完成义务了。一样的,假如能够的话,我们应当利用MEDIUMINT而不是BIGIN来界说整型字段。
  别的一个进步效力的办法是在大概的情形下,应当只管把字段设置为NOTNULL,如许在未来实行查询的时分,数据库不必往对照NULL值。
  关于某些文本字段,比方“省分”大概“性别”,我们能够将它们界说为ENUM范例。由于在MySQL中,ENUM范例被看成数值型数据来处置,而数值型数据被处置起来的速率要比文本范例快很多。如许,我们又能够进步数据库的功能。
2、利用毗连(JOIN)来取代子查询(Sub-Queries)
  MySQL从4.1入手下手撑持SQL的子查询。这个手艺可使用SELECT语句来创立一个单列的查询了局,然后把这个了局作为过滤前提用在另外一个查询中。比方,我们要将客户基础信息表中没有任何定单的客户删撤除,就能够使用子查询先从发卖信息表中将一切收回定单的客户ID掏出来,然后将了局传送给主查询,以下所示:
DELETEFROMcustomerinfo
WHERECustomerIDNOTin(SELECTCustomerIDFROMsalesinfo)
  利用子查询能够一次性的完成良多逻辑上必要多个步骤才干完成的SQL操纵,同时也能够制止事件大概表锁逝世,而且写起来也很简单。可是,有些情形下,子查询能够被更无效率的毗连(JOIN)..替换。比方,假定我们要将一切没有定单纪录的用户掏出来,能够用上面这个查询完成:
SELECT*FROMcustomerinfo
WHERECustomerIDNOTin(SELECTCustomerIDFROMsalesinfo)
  假如利用毗连(JOIN)..来完成这个查询事情,速率将会快良多。特别是当salesinfo表中对CustomerID建有索引的话,功能将会更好,查询以下:
SELECT*FROMcustomerinfo
LEFTJOINsalesinfoONcustomerinfo.CustomerID=salesinfo.
CustomerID
WHEREsalesinfo.CustomerIDISNULL
  毗连(JOIN)..之以是更无效率一些,是由于MySQL不必要在内存中创立一时表来完成这个逻辑上的必要两个步骤的查询事情。
3、利用团结(UNION)来取代手动创立的一时表
  MySQL从4.0的版本入手下手撑持UNION查询,它能够把必要利用一时表的两条或更多的SELECT查询兼并的一个查询中。在客户真个查询会话停止的时分,一时表会被主动删除,从而包管数据库划一、高效。利用UNION来创立查询的时分,我们只必要用UNION作为关头字把多个SELECT语句毗连起来就能够了,要注重的是一切SELECT语句中的字段数量要想同。上面的例子就演示了一个利用UNION的查询。
SELECTName,PhoneFROMclient
UNION
SELECTName,BirthDateFROMauthor
UNION
SELECTName,SupplierFROMPRoduct
4、事件
  只管我们可使用子查询(Sub-Queries)、毗连(JOIN)和团结(UNION)来创立林林总总的查询,但不是一切的数据库操纵都能够只用一条或多数几条SQL语句就能够完成的。更多的时分是必要用到一系列的语句来完成某种事情。可是在这类情形下,当这个语句块中的某一条语句运转堕落的时分,全部语句块的操纵就会变得不断定起来。假想一下,要把某个数据同时拔出两个相干联的表中,大概会呈现如许的情形:第一个表中乐成更新后,数据库俄然呈现不测情况,形成第二个表中的操纵没有完成,如许,就会形成数据的不完全,乃至会损坏数据库中的数据。要制止这类情形,就应当利用事件,它的感化是:要末语句块中每条语句都操纵乐成,要末都失利。换句话说,就是能够坚持数据库中数据的分歧性和完全性。事物以BEGIN关头字入手下手,COMMIT关头字停止。在这之间的一条SQL操纵失利,那末,ROLLBACK命令就能够把数据库恢复到BEGIN入手下手之前的形态。
BEGIN;
INSERTINTOsalesinfoSETCustomerID=14;
UPDATEinventorySETQuantity=11
WHEREitem=book;
COMMIT;
  事件的另外一个主要感化是当多个用户同时利用不异的数据源时,它能够使用锁定命据库的办法来为用户供应一种平安的会见体例,如许能够包管用户的操纵不被别的的用户所搅扰。
5、锁定表
  只管事件是保护数据库完全性的一个十分好的办法,但却由于它的独有性,偶然会影响数据库的功能,特别是在很年夜的使用体系中。因为在事件实行的过程当中,数据库将会被锁定,因而别的的用户哀求只能临时守候直到该事件停止。假如一个数据库体系只要多数几个用户来利用,事件酿成的影响不会成为一个太年夜的成绩;但假定有不计其数的用户同时会见一个数据库体系,比方会见一个电子商务网站,就会发生对照严峻的呼应提早。
  实在,有些情形下我们能够经由过程锁定表的办法来取得更好的功能。上面的例子就用锁定表的办法来完成后面一个例子中事件的功效。
LOCKTABLEinventoryWRITE
SELECTQuantityFROMinventory
WHEREItem=book;
...
UPDATEinventorySETQuantity=11
WHEREItem=book;
UNLOCKTABLES
  这里,我们用一个SELECT语句掏出初始数据,经由过程一些盘算,用UPDATE语句将新值更新到表中。包括有WRITE关头字的LOCKTABLE语句能够包管在UNLOCKTABLES命令被实行之前,不会有别的的会见来对inventory举行拔出、更新大概删除的操纵。
6、利用外键
  锁定表的办法能够保护数据的完全性,可是它却不克不及包管数据的联系关系性。这个时分我们就能够利用外键。比方,外键能够包管每条发卖纪录都指向某一个存在的客户。在这里,外键能够把customerinfo表中的CustomerID映照到salesinfo表中CustomerID,任何一条没有正当CustomerID的纪录都不会被更新或拔出到salesinfo中。
CREATETABLEcustomerinfo
(
CustomerIDINTNOTNULL,
PRIMARYKEY(CustomerID)
)TYPE=INNODB;
CREATETABLEsalesinfo
(
SalesIDINTNOTNULL,
CustomerIDINTNOTNULL,
PRIMARYKEY(CustomerID,SalesID),
FOREIGNKEY(CustomerID)REFERENCEScustomerinfo
(CustomerID)ONDELETECASCADE
)TYPE=INNODB;
  注重例子中的参数“ONDELETECASCADE”。该参数包管当customerinfo表中的一条客户纪录被删除的时分,salesinfo表中一切与该客户相干的纪录也会被主动删除。假如要在MySQL中利用外键,必定要记着在创立表的时分将表的范例界说为事件平安表InnoDB范例。该范例不是MySQL表的默许范例。界说的办法是在CREATETABLE语句中加上TYPE=INNODB。如例中所示。
7、利用索引
  索引是进步数据库功能的经常使用办法,它能够令数据库服务器以比没有索引快很多的速率检索特定的行,特别是在查询语句傍边包括有MAX(),MIN()和ORDERBY这些命令的时分,功能进步更加分明。那该对哪些字段创建索引呢?一样平常说来,索引应创建在那些将用于JOIN,WHERE判别和ORDERBY排序的字段上。只管不要对数据库中某个含有大批反复的值的字段创建索引。关于一个ENUM范例的字段来讲,呈现大批反复值是很有大概的情形,比方customerinfo中的“province”..字段,在如许的字段上创建索引将不会有甚么匡助;相反,另有大概下降数据库的功能。我们在创立表的时分能够同时创立符合的索引,也能够利用ALTERTABLE或CREATEINDEX在今后创立索引。别的,MySQL从版本3.23.23入手下手撑持全文索引和搜刮。全文索引在MySQL中是一个FULLTEXT范例索引,但仅能用于MyISAM范例的表。关于一个年夜的数据库,将数据装载到一个没有FULLTEXT索引的表中,然后再利用ALTERTABLE或CREATEINDEX创立索引,将长短常快的。但假如将数据装载到一个已有FULLTEXT索引的表中,实行历程将会十分慢。
8、优化的查询语句
  尽年夜多半情形下,利用索引能够进步查询的速率,但假如SQL语句利用不得当的话,索引将没法发扬它应有的感化。上面是应当注重的几个方面。起首,最好是在不异范例的字段间举行对照的操纵。在MySQL3.23版之前,这乃至是一个必需的前提。比方不克不及将一个建有索引的INT字段和BIGINT字段举行对照;可是作为特别的情形,在CHAR范例的字段和VARCHAR范例字段的字段巨细不异的时分,能够将它们举行对照。其次,在建有索引的字段上只管不要利用函数举行操纵。
  比方,在一个DATE范例的字段上利用YEAE()函数时,将会使索引不克不及发扬应有的感化。以是,上面的两个查询固然前往的了局一样,但后者要比前者快很多。
SELECT*FROMorderWHEREYEAR(OrderDate)<2001;
SELECT*FROMorderWHEREOrderDate<"2001-01-01";
  一样的情况也会产生在对数值型字段举行盘算的时分:
SELECT*FROMinventoryWHEREAmount/7<24;
SELECT*FROMinventoryWHEREAmount<24*7;
  下面的两个查询也是前往不异的了局,但前面的查询将比后面的一个快良多。第三,在搜刮字符型字段时,我们偶然会利用LIKE关头字和通配符,这类做法固然复杂,但却也是以就义体系功能为价值的。比方上面的查询将会对照表中的每笔记录。
SELECT*FROMbooks
WHEREnamelike"MySQL%"
  可是假如换用上面的查询,前往的了局一样,但速率就要快上良多:
SELECT*FROMbooks
WHEREname>="MySQL"andname<"MySQM"
  最初,应当注重制止在查询中让MySQL举行主动范例转换,由于转换历程也会使索引变得不起感化。
MySQL的双许可模式意味着,那些希望对数据库具有额外控制的人可以直接从数据库厂商那儿得到帮助。MySQLAB公司提供了支持和维护服务,诸如代码更新和补丁修补服务等,每年订阅费为大约3000美元。
作者: 小魔女    时间: 2015-1-18 18:55
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
作者: 海妖    时间: 2015-1-24 12:39
Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。
作者: 分手快乐    时间: 2015-2-1 13:48
数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
作者: 小女巫    时间: 2015-2-7 06:57
作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!
作者: 谁可相欹    时间: 2015-2-20 23:59
你可以简单地认为适合的就是好,不适合就是不好。
作者: 因胸联盟    时间: 2015-3-6 19:31
不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
作者: 飘飘悠悠    时间: 2015-3-13 07:06
很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
作者: 爱飞    时间: 2015-3-20 15:40
SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2