阅读更多

6顶
0踩

数据库
SELECT语句的性能调优有时是一个非常耗时的任务,在我看来它遵循帕累托原则。20%的努力很可能会给你带来80%的性能提升,而为了获得另外20%的性能提升你可能需要花费80%的时间。除非你在金星工作,那里的每一天都等于地球上的243天,否则交付期限很有可能使你没有足够的时间来调优SQL查询。

根据我多年编写和运行SQL语句的经验,我开始开发一个检查列表,当我试图提高查询性能时供我参考。在进行查询计划和阅读我使用的数据库文档之前,我会参考其中的内容,数据库文档有时会很复杂。我的检查列表绝对说不上全面或科学,它更像是一个保守计算,但我可以说,遵循这些简单的步骤大部分时间我确实能得到性能提升。检查列表如下。

检查索引

在SQL语句的WHERE和JOIN部分中用到的所有字段上,都应该加上索引。进行这个3分钟SQL性能测试。不管你的成绩如何,一定要阅读那些带有信息的结果。

限制工作数据集的大小

检查那些SELECT语句中用到的表,看看你是否可以应用WHERE子句进行过滤。一个典型的例子是,当表中只有几千行记录时,一个查询能够很好地执行。但随着应用程序的成长,查询慢了下来。解决方案或许非常简单,限制查询来查看当前月的数据即可。

当你的查询语句带有子查询时,注意在子查询的内部语句上使用过滤,而不是在外部语句上。
只选择你需要的字段

额外的字段通常会增加返回数据的纹理,从而导致更多的数据被返回到SQL客户端。另外:
  • 使用带有报告和分析功能的应用程序时,有时报告性能低是因为报告工具必须对收到的、带有详细形式的数据做聚合操作。
  • 偶尔查询也可能运行地足够快,但你的问题可能是一个网络相关的问题,因为大量的详细数据通过网络发送到报告服务器。
  • 当使用一个面向列的DBMS时,只有你选择的列会从磁盘读取。在你的查询中包含的列越少,IO开销就越小。

移除不必要的表

移除不必要的表的原因,和移除查询语句中不需要的字段的原因一致。

编写SQL语句是一个过程,通常需要大量编写和测试SQL语句的迭代过程。在开发过程中,你可能将表添加到查询中,而这对于SQL代码返回的数据可能不会有任何影响。一旦SQL运行正确,我发现许多人不会回顾他们的脚本,不会删除那些对最终的返回数据没有任何影响和作用的表。通过移除与那些不必要表的JOINS操作,你减少了大量数据库必须执行的流程。有时,就像移除列一样,你会发现你减少的数据又通过数据库返回来了。

移除外部连接查询

这说起来容易做起来难,它取决于改变表的内容有多大的影响。一个解决办法是通过在两个表的行中放置占位符来删除OUTER JOINS操作。假设你有以下的表,它们通过定义OUTER JOINS来确保返回所有的数据:






解决办法是在customer表的行中增加一个占位符,并更新sales表中的所有NULL值到占位符。






你不只是删除了对OUTER JOIN操作的依赖,同时标准化了没有客户的销售人员如何表示。其他开发人员不必编写额外语句,例如ISNULL(customer_id, “No customer yet”)。

删除JOIN和WHERE子句中的计算字段

这是另外一个有时可能说起来容易做起来难的技巧,它取决于你更改表模式的权限大小。可以将连接语句中用到的计算字段作为一个新字段在表中创建。给出以下SQL语句:
FROM sales a 
JOIN budget b ON    ((YEAR(a.sale_date)* 100) + MONTH(a.sale_date)) = b.budget_year_month

在sales表中利用年和月增加一列,可以提高性能。更新后的SQL语句将如下:
SELECT * FROM PRODUCTSFROM sales a 
JOIN budget b ON    a.sale_year_month = b.budget_year_month

总结

上边的建议可以归结为以下几点:
  • 检查索引
  • 在所需要的最小数据集上操作
  • 移除不必要的字段和表
  • 移除你JOIN和WHERE子句中的计算操作

如果所有的这些建议都没能提高你的SQL查询性能,最后一个建议是搬去金星吧。你需要的就是一天能调优你的SQL语句。

来自:伯乐在线
  • 大小: 5.9 KB
  • 大小: 7.1 KB
  • 大小: 7.5 KB
  • 大小: 7 KB
来自: 伯乐在线
6
0
评论 共 6 条 请登录后发表评论
6 楼 MrLee23 2015-05-04 09:45
houyujiangjun 写道
robbin 范凯 曾今写过一篇博客,详细分析了如何设计数据和sql语句,让单机可以支撑亿级数据.

mysql 单表5E没压力,只要你把索引做好,读写分离做好,数据结构尽量简单化基本没问题了。
5 楼 hyl198611 2015-04-30 15:36
houyujiangjun 写道
robbin 范凯 曾今写过一篇博客,详细分析了如何设计数据和sql语句,让单机可以支撑亿级数据.
求个地址。

4 楼 lvwenwen 2015-04-30 15:22
在哪里,求地址
3 楼 lui0101 2015-04-30 14:01
houyujiangjun 写道
robbin 范凯 曾今写过一篇博客,详细分析了如何设计数据和sql语句,让单机可以支撑亿级数据.

大神,求地址
2 楼 string2020 2015-04-30 12:11
houyujiangjun 写道
robbin 范凯 曾今写过一篇博客,详细分析了如何设计数据和sql语句,让单机可以支撑亿级数据.


在哪里,求地址
1 楼 houyujiangjun 2015-04-30 12:09
robbin 范凯 曾今写过一篇博客,详细分析了如何设计数据和sql语句,让单机可以支撑亿级数据.

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • asp:Content 模式下通过Js 调用 服务端控件后台事件

    一般html下,如果存在asp 的服务端控件,可以像通过Js 调用 服务端控件后台事件 介绍那样在JavaScript中访问这些控件 但如果页面存在母版页面(Master),而且采用了asp:ContentPlaceHolder 这种的子页面调用方式,这时就需要调整JavaScript的调用方式,直接以控件名称访问服务端控件将失效。因为服务端控件名称被转义。 在不同的版本(Framework2...

  • 用JavaScript解决ASP.NET服务器控件造成的刷新问题

    用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新带来的不便。 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(st

  • ASP.NET服务器端与javascript交互的一种方法

    昨天在项目中遇到了一个问题,要前台脚本调用调用后台的事件。经过查阅网上的资料,这个方法还不错。第一步:前台写一个脚本,我需要在前台判断用户输入的是否是回车键,然后执行后台函数。 script type="text/javascript">    function keyClick(cmd)    ...{        //判断是否是回车键        if(event.keyC

  • 老话重提--PHP中汉字截取

    似乎这种问题永远都有人在论坛上面问 以前人们用的函数都差不多 今天看见了PHP专栏版主唠叨的方法 简洁的很首先我们看看以前应用的两种方法---------------------------------------------------------------    function  msubstr($str,$start,$len)  {           $strlen=$start+$

  • [收藏]PHP给图片增加水印得类

    CODE:/*+--------------------------------------------------------------------------| 生成加水印的图片类 (支持水印为图片或者文字)| ============================| by JackMing (感谢Dash和其他不知道姓名的朋友支持,本类在这些朋友作品的基础上创建)+-----------

  • Flex真强大

    今天看了同学给我发的mm公司官方演示 Flex做的应用太强大了真可惜好久以前就接触过但是没放在心上……决定研究研究了,正好毕设做crm,如果能用flex+hibernate+spring构建,那就完美了

  • PHP+MYSQL防范SQL注入

    好久没动PHP了,最近却要给朋友写个电子商务 我就比较关心安全问题 于是到网上查了查 这篇安全天使的文章十分不错 对于初级注入已经可以防范了http://www.4ngel.net/article/36.htm  

Global site tag (gtag.js) - Google Analytics