海妖 发表于 2015-1-16 22:14:16

MYSQL网页编程之从四个细节动身做好MySQL查询优化

“对于MySQL数据库,无论是在开发方面,还是支持方面,现在有大量强大的MySQL学习教程可以选择。每一个新手开发者可以轻松地使用MySQL数据库进行开发。  尽人皆知,在任何一个数据库中,查询优化都是不成制止的一个话题。关于数据库工程师来讲,优化事情是最有应战性的事情。MySQL开源数据库也不破例。实在笔者以为,数据库优化并没有人人所设想的那末灾难。一般情形下,人人能够从以下四个细节动身来做好MySQL数据库的查询优化事情。
  1、使用EXPLAIN关头字来评价查询语句中的缺点
  以下图所示,如今笔者在数据库中实行了一条复杂的Select查询语句,从一个表格中查询一切信息。如今数据库办理员想晓得,数据库在实行这条语句时,做了哪些事情?大概说想晓得,这条查询语句有无进一步优化的大概。假如要懂得这个信息的话,就能够在查询语句中到场一个Explain关头字。
  

  经由过程Select查询语句能够从数据库中查询某个表中的数据。可是这条语句实行的效力怎样?是不是另有优化的余地?这些内容是没法从下面这个复杂的查询语句中取得的。为了懂得加倍具体的信息,必要到场Explain关头字。以下图所示:
  

  到场Explain关头字以后,体系并没有查询出表格中的数据,而只是显现了查询过程当中的一些信息。这些信息关于我们后续举行数据库查询优化十分有匡助。从下面这个信息中我们能够看出,用户只是举行来一个复杂的查询。在这个查询中,没有效就任何索引、关头字等外容,也没有效到Where前提语句。为此这个查询语句并非很公道。固然其能够找到最初准确的了局,不外其查询效力大概并非很分明。为此数据库专家能够依据下面显现的信息来举行优化。假如我们如今在查询语句中到场一条Where语句,那末又会有甚么样的了局呢?以下图所示。
  

  此时在最初一个Extra字段中,体系就会显现已利用了Where语句。在举行数据库优化中,我们必要捉住了局中的NULL字段大概空缺内容的字段。这些中央常常是我们举行优化的重点。如上图所示,我们能够给这条Select语句举行以下的优化:在表中设置关头字大概索引,来进步查询的效力。
  2、数据对照时接纳不异范例的列以进步查询效力
  在数据查询时,偶然候会在前提语句中到场判别的前提。如如今有两张表:用户基础信息表和用户权限表,二者经由过程用户编号作为联系关系。如今必要查询出每一个用户对应甚么样的权限,此时就要经由过程用户编号作为查询前提来举行查询。如今假定用户基础信息表中的用户编号字段为CHAR范例的;而用户权限表中的用户编号是VARCHAR范例的。这两个数据范例固然都是字符型,可是不是统一品种型。如今对这连个表实行联系关系查询,其查询的效力怎样呢?起首必要断定的一点是,固然他们两个是分歧范例的字符型数据,不外是互相兼容的。最初仍旧能够失掉准确的了局。明白了这一点以后,我们再来思索,可否对这个查询语句举行优化呢?
  我们再假定一下。如今这两个表的用户编号的数据范例都是CHAR。如今再对这两个表举行联系关系查询,失掉的了局是不是不异呢?我们测试的了局是,查询的了局是不异的,可是其所消费的工夫是分歧的。并且跟着数据量的增添,两个查询所相差的工夫会愈来愈长。从这里能够晓得,固然这两个查询语句是等价的,可是其查询的效力分歧。
  在MySQL数据库中,固然互相兼容的数据范例能够举行互相对照。可是其查询的效力会有所影响。从进步数据库查询效力的角度动身,笔者倡议在查询前提语句中最比如较具有不异范例的列。在一律前提下,不异的列范例比分歧范例的列可以供应更好的功能。出格是在数据量对照多的数据库中,这特别主要。
  不外这个优化必要触及到数据表的列范例。为此在数据表举行计划时,就必要思索这一点。如针对下面这个案例,我们能够在两个表中专门设置一个用户ID列。可使用整数范例的序列,让体系举行主动编号。然后在查询时经由过程这个用户ID列来举行对照,而不是经由过程本来的用户编号列举行对照。绝对来讲,这么操纵查询的效力会更高。
  3、在Like关头字的肇端处通配符要审慎利用
  在实践事情中,笔者发明很多数据库办理员有一个欠好的习气。他们在利用Like等关头字时,通配符会乱花。如如今用户必要查找一切以“LOOK”为前缀的产物信息。用户在查询时,会习气性的利用上面的语句举行查询:like“%LOOK%”。这个前提语句会查询出一切品名中有LOOK这个单词的记录,而不是查询出以LOOK为前缀的产物信息。
  固然终极的了局多是不异的。可是二者的查询效力分歧。实在这很年夜一部分缘故原由是客户端使用程序计划不妥所酿成的。如在客户端使用程序计划时,体系会默许显现一个%标记。以下图所示。
  

  这么计划的本意是好的,让体系可以撑持含混查询。可是用户在实践操纵起来,就能够有成绩。如用户在查询时,不会在%号后面输出LOOK这个单词,而是在%前面输出LOOK这个单词。由于在查询时,光标会主动定位到%号前面。一般情形下,用户在输出时不会再往调剂光标的地位。此时就呈现了下面所说的这类情形。
  为此笔者倡议,在Like等关头字前面假如必要用到通配符的话,要十分的审慎。出格是从大批数据中查找记录时,这个通配符的地位必定要用对中央。在肇端处可以分歧通配符的话,只管不要利用通配符。
  4、只管利用别的情势来取代Like关头字
  下面提到在利用Like关头字时必要注重通配符的地位。实在从查询效力来看,我们不但必要注重通配符的地位,并且可以不必Like关头字最好就不必。实在在SQL语句中,能够使用其他体例来取代Like关头字。如如今有一个产物表,其编号为6位。如今必要查询以9开首的产物编号。这该怎样操纵呢?
  一是能够经由过程利用Like关头字,如LIKE“9%”。注重这个通配符的地位。这个前提语句能够查到所必要的了局。可是从功能优化的角度看,这条语句不是很好的处置体例。我们还能够经由过程一些折衷的体例来完成。
  二是经由过程对照标记来完成。如可使用Value>=900000andValue<=999999这类体例来完成。固然二者的查询的了局是不异的。可是查询的工夫这条语句要比下面这个接纳Like标记的语句要短的多。
<Pstyle="TEXT-INDENT:2em">
”由于MySQL已经是一个运行了众多知名Web2.0网站的数据,包括Craigslist、Digg、Wikipedia和Google等,或许我们可以说每一个Web2.0公司实质上是一个使用MySQL数据库的公司。

蒙在股里 发表于 2015-1-19 05:52:49

having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。

第二个灵魂 发表于 2015-1-25 10:57:42

外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。

简单生活 发表于 2015-2-2 21:53:31

至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。

冷月葬花魂 发表于 2015-2-8 07:56:32

多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。

小魔女 发表于 2015-2-25 02:04:57

对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。

仓酷云 发表于 2015-3-7 15:50:01

这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。

海妖 发表于 2015-3-15 09:27:53

代替了原来VB式的错误判断。比Oracle高级不少。

山那边是海 发表于 2015-3-21 23:35:12

比如日志传送、比如集群。。。
页: [1]
查看完整版本: MYSQL网页编程之从四个细节动身做好MySQL查询优化