仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 895|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL教程之实例解说MYSQL数据库的查询优化手艺

[复制链接]
冷月葬花魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:44:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
DBaaS并不意味着解决方案提供者要让自己失业。与其他系统一样,在实施DBaaS解决方案时,客户可能需要部署、迁移、支持、异地备份、系统集成和灾难恢复等方面的帮助。mysql|数据|数据库|优化数据库体系是办理信息体系的中心,基于数据库的联机事件处置(OLTP)和联机剖析处置(OLAP)是银行、企业、当局等部门最为主要的盘算机使用之一。从年夜多半体系的使用实例来看,查询操纵在各类数据库操纵中所占有的比重最年夜,而查询操纵所基于的SELECT语句在SQL语句中又是价值最年夜的语句。举例来讲,假如数据的量堆集到必定的水平,好比一个银行的账户数据库表信息堆集到上百万乃至上万万笔记录,全表扫描一次常常必要数非常钟,乃至数小时。假如接纳比全表扫描更好的查询战略,常常可使查询工夫降为几分钟,因而可知查询优化手艺的主要性。

笔者在使用项目标实行中发明,很多程序员在使用一些前端数据库开辟工具(如PowerBuilder、Delphi等)开辟数据库使用程序时,只注意用户界面的华美,其实不器重查询语句的效力成绩,招致所开辟出来的使用体系效力低下,资本华侈严峻。因而,怎样计划高效公道的查询语句就显得十分主要。本文以使用实例为基本,分离数据库实际,先容查询优化手艺在实际体系中的使用。

剖析成绩

很多程序员以为查询优化是DBMS(数据库办理体系)的义务,与程序员所编写的SQL语句干系不年夜,这是毛病的。一个好的查询企图常常可使程序功能进步数十倍。查询企图是用户所提交的SQL语句的汇合,查询计划是经由优化处置以后所发生的语句汇合。DBMS处置查询企图的历程是如许的:在做完查询语句的词法、语法反省以后,将语句提交给DBMS的查询优化器,优化器做完代数优化和存取路径的优化以后,由预编译模块对语句举行处置并天生查询计划,然后在符合的工夫提交给体系处置实行,最初将实行了局前往给用户。在实践的数据库产物(如Oracle、Sybase等)的高版本中都是接纳基于价值的优化办法,这类优化能依据从体系字典表所失掉的信息来估量分歧的查询计划的价值,然后选择一个较优的计划。固然如今的数据库产物在查询优化方面已做得愈来愈好,但由用户提交的SQL语句是体系优化的基本,很难假想一个底本糟的查询企图经由体系的优化以后会变得高效,因而用户所写语句的好坏相当主要。体系所做查询优化我们暂不会商,上面重点申明改良用户查询企图的办理计划。

办理成绩

上面以干系数据库体系Informix为例,先容改良用户查询企图的办法。

1.公道利用索引

索引是数据库中主要的数据布局,它的基本目标就是为了进步查询效力。如今年夜多半的数据库产物都接纳IBM开始提出的ISAM索引布局。索引的利用要恰如其分,其利用准绳以下:

●在常常举行毗连,可是没有指定为外键的列上创建索引,而不常常毗连的字段则由优化器主动天生索引。

●在频仍举行排序或分组(即举行groupby或orderby操纵)的列上创建索引。

●在前提表达式中常常用到的分歧值较多的列上创建检索,在分歧值少的列上不要创建索引。好比在雇员表的“性别”列上只要“男”与“女”两个分歧值,因而就无需要创建索引。假如创建索引不仅不会进步查询效力,反而会严峻下降更新速率。

●假如待排序的列有多个,能够在这些列上创建复合索引(compoundindex)。

●利用体系工具。如Informix数据库有一个tbcheck工具,能够在可疑的索引长进行反省。在一些数据库服务器上,索引大概生效大概由于频仍操纵而使得读取效力下降,假如一个利用索引的查询不明不白地慢上去,能够试着用tbcheck工具反省索引的完全性,需要时举行修复。别的,当数据库表更新大批数据后,删除偏重建索引能够进步查询速率。

2.制止或简化排序

应该简化或制止对年夜型表举行反复的排序。当可以使用索引主动以得当的序次发生输入时,优化器就制止了排序的步骤。以下是一些影响要素:

●索引中不包含一个或几个待排序的列;

●groupby或orderby子句中列的序次与索引的序次纷歧样;

●排序的列来自分歧的表。

为了不不用要的排序,就要准确地增建索引,公道地兼并数据库表(只管偶然大概影响表的标准化,但相对效力的进步是值得的)。假如排序不成制止,那末应该试图简化它,如减少排序的列的局限等。

3.打消对年夜型表行数据的按次存取

在嵌套查询中,对表的按次存取对查询效力大概发生致命的影响。好比接纳按次存取战略,一个嵌套3层的查询,假如每层都查询1000行,那末这个查询就要查询10亿行数据。制止这类情形的次要办法就是对毗连的列举行索引。比方,两个表:先生表(学号、姓名、岁数……)和选课表(学号、课程号、成就)。假如两个表要做毗连,就要在“学号”这个毗连字段上创建索引。

还可使用并集来制止按次存取。只管在一切的反省列上都有索引,但某些情势的where子句强制优化器利用按次存取。上面的查询将强制对orders表实行按次操纵:

SELECT*FROMordersWHERE(customer_num=104ANDorder_num>1001)ORorder_num=1008

固然在customer_num和order_num上建有索引,可是在下面的语句中优化器仍是利用按次存取路径扫描全部表。由于这个语句要检索的是分别的行的汇合,以是应当改成以下语句:

SELECT*FROMordersWHEREcustomer_num=104ANDorder_num>1001

UNION

SELECT*FROMordersWHEREorder_num=1008

如许就可以使用索带路径处置查询。

4.制止相干子查询

一个列的标签同时在主查询和where子句中的查询中呈现,那末极可能当主查询中的列值改动以后,子查询必需从头查询一次。查询嵌套条理越多,效力越低,因而应该只管制止子查询。假如子查询不成制止,那末要在子查询中过滤失落尽量多的行。

5.制止坚苦的正轨表达式

MATCHES和LIKE关头字撑持通配符婚配,手艺上叫正轨表达式。但这类婚配出格泯灭工夫。比方:SELECT*FROMcustomerWHEREzipcodeLIKE“98___”

即便在zipcode字段上创建了索引,在这类情形下也仍是接纳按次扫描的体例。假如把语句改成SELECT*FROMcustomerWHEREzipcode>“98000”,在实行查询时就会使用索引来查询,明显会年夜年夜进步速率。

别的,还要制止非入手下手的子串。比方语句:SELECT*FROMcustomerWHEREzipcode[2,3]>“80”,在where子句中接纳了非入手下手子串,因此这个语句也不会利用索引。

6.利用一时表减速查询

把表的一个子集举行排序并创立一时表,偶然能减速查询。它有助于制止多重排序操纵,并且在其他方面还能简化优化器的事情。比方:

SELECTcust.name,rcvbles.balance,……othercolumns

FROMcust,rcvbles

WHEREcust.customer_id=rcvlbes.customer_id

ANDrcvblls.balance>0

ANDcust.postcode>“98000”

ORDERBYcust.name

假如这个查询要被实行屡次而不止一次,能够把一切未付款的客户找出来放在一个一时文件中,并按客户的名字举行排序:

SELECTcust.name,rcvbles.balance,……othercolumns

FROMcust,rcvbles

WHEREcust.customer_id=rcvlbes.customer_id

ANDrcvblls.balance>0

ORDERBYcust.name

INTOTEMPcust_with_balance

然后以上面的体例在一时表中查询:

SELECT*FROMcust_with_balance

WHEREpostcode>“98000”

一时表中的行要比主表中的行少,并且物理按次就是所请求的按次,削减了磁盘I/O,以是查询事情量能够失掉年夜幅削减。

注重:一时表创立后不会反应主表的修正。在主表中数据频仍修正的情形下,注重不要丧失数据。

7.用排序来代替非按次存取

非按次磁盘存取是最慢的操纵,体现在磁盘存取臂的往返挪动。SQL语句埋没了这一情形,使得我们在写使用程序时很简单写出请求存取大批非按次页的查询。

有些时分,用数据库的排序才能来替换非按次的存取能改善查询。


[1][2]下一页

DBaaS解决方案既可以解决这些问题,又能为客户节约资金。相反作为解决方案提供商,采用DBaaS模式似乎就并不那么有吸引力了,因为与企业内部署软件的解决方案相比,DBaaS意味着更低的利润。
活着的死人 该用户已被删除
沙发
发表于 2015-1-19 22:13:48 | 只看该作者
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
乐观 该用户已被删除
板凳
发表于 2015-1-28 13:52:39 | 只看该作者
连做梦都在想页面结构是怎么样的,绝非虚言
谁可相欹 该用户已被删除
地板
发表于 2015-2-5 21:42:22 | 只看该作者
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
灵魂腐蚀 该用户已被删除
5#
发表于 2015-2-13 17:40:55 | 只看该作者
现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.
金色的骷髅 该用户已被删除
6#
发表于 2015-3-4 00:56:49 | 只看该作者
分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。
因胸联盟 该用户已被删除
7#
发表于 2015-3-11 15:03:34 | 只看该作者
SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)
不帅 该用户已被删除
8#
发表于 2015-3-19 00:42:45 | 只看该作者
SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。
分手快乐 该用户已被删除
9#
发表于 2015-3-26 23:51:44 | 只看该作者
如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-3 20:02

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表