注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小葫芦君(汉斯的博客)

博客迁移到新博客:https://blog.ssxingshou.com

 
 
 

日志

 
 
关于我

小小葫芦商城,为您提供高品质的商品,一流的产品,一流的包装服务,一流的物流服务,放心购买

网易考拉推荐

数据库访问优化  

2011-11-22 14:05:39|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1、获取数据个数
SELECT count(*) FROM verycd 进行统计记录数的查询
这个操作每次都要花不少时间,这是因为每次数据库都要锁住然后遍历一遍主键统计个数的缘故,数据量越大耗时就越大,耗时为O(N),N为数据库大小;实际 上解决这个问题非常容易,只要随便在哪存一个当前数据的个数,只有在增删数据的时候改动就行了,这样时间就是O(1)的了。

2、获取最新更新的20个数据列表

SELECT
verycdid,title,brief,updtime FROM verycd     ORDER BY updtime DESC LIMIT 20;
因为在updtime上面做了索引,所以其实真正查询时间也就是搜索索引的时间而已。然则为什么这个操作会慢呢?因为我的数据是按照publish time插入的,按update time进行显示的话就肯定需要在至少20个不同的地方做I/O,这么一来就慢了。解决的方法就是让它在一个地方做I/O。也就是,除非数据库加入新数据 /改变原有数据,否则把这条语句的返回结果缓存起来。这么一来又快了20倍:)

3、接下来的是20条小case:取得发布人和点击数信息
SELECT
owner FROM LOCK WHERE id=XXXX;
SELECT
hits FROM stat WHERE id=XXXX;

这里为什么没用sql的join语句来省点事呢?因为架构原因这些数据放在不同的数据库里,stat是点击率一类的数据库,因为需要频繁的插入所以 用mysql存储;而lock和verycd是需要大量select操作的数据库,因为mysql悲剧的索引使用情况和分页效率而存放在了sqlite3 数据库,所以无法join -.-

总之这也不是问题,跟刚才的解决方法一样,统统缓存

所以纵观我这个例子,优化网页性能可以一言以蔽之,缓存数据库查询,即可。我相信大部分网页应用都是这样:)

Memcached终于出场

客户端的重要性:Memcached是用C写的一个服务端,客户端没有规定,反正是Socket传输,只要语言 支持Socket通信,通过Command的简单协议就可以通信。但是客户端设计的合理十分重要,同时也给使用者提供了很大的空间去扩展和设计客户端来满 足各种场景的需要,包括容错、权重、效率、特殊的功能性需求和嵌入框架等等。

几个应用点:小对象的缓存(用户的Token、权限信息、资源信息);小的静态资源缓存;SQL结果的缓存(这部分如果用的好,性能提高会相当大,同时由于Memcached自身提供向上扩容,那么对于数据库向上扩容的老大难问题无疑是一剂好药);ESB消息缓存。

终于轮到memcached了,既然打算缓存,用文件做缓存的话还是有磁盘I/O,不如直接缓存到内存里面,内存I/O可就快多了。于是memcached顾名思义就是这么个东东。

memcached是很强大的工具,因为它可以支持分布式的共享内存缓存,大站都用它,对小站点来说,只要出得起内存,这也是好东西;首页所需要的内存缓冲区大小估计不会超过10K,更何况我现在也是内存土豪了,还在乎这个?

安装:ubuntu下还是方便啊

apt-get install memcached apt-get install python-memcached

配置运行:因为是单机没啥好配的,改改内存和端口就行了

vi /etc/memcached.conf /etc/init.d/memcached restart

在python的网页应用中使用之

import memcache mc = memcache.Client(['127.0.0.1:11211'], debug=0)

memcache其实就是一个map结构,最常使用的就是两个函数了:

  • 第一个就是set(key,value,timeout),这个很简单就是把key映射到value,timeout指的是什么时候这个映射失效
  • 第二个就是get(key)函数,返回key所指向的value

于是对一个正常的sql查询可以这么干

sql = 'select count(*) from verycd' c = sqlite3.connect('verycd.db').cursor()   #原来的处理方式 c.execute(sql) count = c.fetchone()[0]   #现在的处理方式 from hashlib import md5 key=md5(sql) count = mc.get(key) if not count:     c.execute(sql)     count = c.fetchone()[0]     mc.set(key,count,60*5) #存5分钟

其中md5是为了让key分布更均匀,其他代码很直观我就不解释了。

优化结果和结论

优化过语句1和语句2后,首页的平均生成时间已经降低到0.02秒,和discuz一个量级了;再经过语句3的优化,最终结果是首页生成时间降低到了0.006秒左右,经过memcached寥寥几行代码的优化,性能提高了3300%。终于可以挺直腰板来看Discuz了:)

说memcached是妖孽,并不是因为memcached应用了之后性能狂升——这本是意料之中的事情,不这样反而才奇怪——而是因为我基本上没 花多少时间就实现了这么妖孽的效果,至少我花的时间并不比写这篇blog的时间多。那么方便的使用方法和那么显著的性能提升状况真是让人咋舌。

题外话

话说最近的一些优化测试比较中,我被php的性能吓了一跳,完全和python是一个级别的,以前因为浮点性能鄙视过php是我不对,太片面了。

不过想想这样才是合理啊呵呵,随便什么应用IO才是瓶颈,语言的性能真的太不重要了而且太容易改进了;特别是解释性脚本语言,解释器的版本进步就会 对性能带来很大提升,单纯的比较性能没有多大意义。比如随着java解释器的发展java已经快到让人瞠目结舌了,比如pypy就比CPython在科学 计算中快5-10倍(实测)。

如果真要比的话,易用性和资源占用才是值得比较的对象,因为易用意味着更高的开发效率,而更少内存意味着更多并发的可能。关于易用性我就不说了,从 内存来说,通过简单的测试来看php比python多消耗50%-100%的内存,但这很大程度上是因为php某些时候过于傻瓜化的设定,并不能真的说明 php这门语言的内存控制烂。不多说了,都是一些我觉得挺有趣的小发现吧。

虽说我这么说好像是拼命想证明python比php优越的样子,但是其实刚好相反,用过不少php下面很方便的工具后,我越来越觉得php不错了, 至少用的人多网页方面的模块很多,有时候真的会省很多事。也许我应该找时间专门写一篇比较php和python在实际应用中的文——而不是网上充斥的一些 无意义的浮点数计算性能比较,就像我之前做过的那样——如果有人想看的话:)

我们猜你喜欢:

  1. Memcached的LRU算法 [2011-10-26 13:00:11]
  2. 分布式缓存系统 Memcached 入门 [2010-11-25 11:32:30]
  3. Cacti 添加 Memcached 监控 [2010-05-25 17:43:49]
  4. Memcached and MySQL [2010-03-01 10:17:47]
  5. Memcached数据被踢(evictions>0)现象分析 [2009-09-07 22:17:36]
  6. Memcached的管理 [2009-10-26 16:00:01]
  7. 详细步骤:在64位Linux上安装Memcached [2009-08-20 19:59:00]
  8. 启用memcached压缩注意事项 [2009-05-14 07:56:05]
  9. 谁说使用Python你就写不出混乱的代码? [2011-09-12 00:56:16]
  10. 每个程序员都应该学习使用Python或Ruby [2011-07-25 00:36:33]
  11. 如何成为Python高手 [2011-06-23 00:59:37]
  12. 我的PHP,Python和Ruby之路 [2011-03-21 12:12:46]
  13. [python]定制JSON中的浮点数格式 [2011-05-31 10:44:26]
  14. python装饰器的一个妙用 [2011-04-01 02:00:49]
  15. C,C++代码中调用python脚本 [2010-11-19 00:12:59]
  16. 使用python爬虫抓站的一些技巧总结:进阶篇 [2010-11-23 19:51:56]
  17. 几个连接数据库用的python模块 [2010-11-28 12:18:55]
  18. Quora - Python 驱动 [2011-01-15 23:08:39]
  19. 几个连接数据库用的python模块 [2010-12-31 11:07:12]
  20. 在python中获取当前位置所在的行号和函数名 [2010-12-17 01:23:46]
  21. python中对时间处理的几个函数 [2010-10-27 18:26:18]
  22. 配置Nginx+uwsgi更方便地部署python应用 [2010-10-11 07:33:43]
  23. python编程细节──遍历dict的两种方法比较 [2010-09-17 21:44:49]
  24. 关于python和C++中子类继承父类数据的问题 [2010-09-26 20:49:42]
  25. 【总结】美化bash,python的soap client,python获取系统编码函数 [2010-09-13 21:36:26]
  26. 设置python的stdout为无缓存模式 [2010-08-29 21:52:01]
  27. 最近总结的一些技巧(vim,python,svn,fiddler等) [2010-08-13 16:40:48]
  28. python实现自动登录discuz论坛 [2010-08-05 22:10:05]
  29. 关于使用python开发web应用的几个库总结 [2010-07-02 17:03:30]
  30. 查找当前目录的重复文件 [2010-06-11 15:43:29]
  31. python中的socket代理 [2010-05-20 19:21:31]
  32. 为什么python里要 if __name__ == ‘__main__’: [2010-05-31 18:52:14]
  33. lighttpd, web.py, spawning fcgi failed [2010-05-19 22:27:52]
  34. 编写python的C语言扩展 [2010-05-11 23:30:39]
  35. 自动化测试中Python与C/C++的混合使用 [2010-03-23 11:30:21]
  36. 编程语言介绍之Python [2010-02-03 22:47:50]
  37. Python处理MP3的歌词和图片 [2010-01-21 22:51:31]
  38. 用 python/reportlab 生成 PDF [2009-11-23 08:50:35]
  39. 记上海Python社区聚会,谈Python和Ruby [2009-08-10 18:49:38]
  40. node.js调研与服务性能测试 [2010-12-21 12:28:13]
  41. SEO对网站性能的解决方法以及影响 [2010-10-07 23:17:34]
  42. Array的push与unshift方法性能分析 [2010-09-14 16:54:23]
  43. Velocity:TCP与低带宽网络的性能【译】 [2010-07-23 17:24:03]
  44. 长连接(KeepAlive)在 http 连接中的性能影响 [2010-06-30 13:36:48]
  45. JavaScript性能陷阱 [2010-07-01 08:49:52]
  46. Xvfb+YSlow+ShowSlow搭建前端性能测试框架 [2010-07-07 11:34:09]
  47. [调优] Squid 不同版本的性能对比 [2010-07-08 15:19:13]
  48. WEB性能测试工具推荐 [2010-07-12 19:23:18]
  49. Oracle数据库性能模型 [2010-06-16 22:50:04]
  50. 过滤字符的性能调优? [2010-05-29 05:54:05]
  51. SQL vs NoSQL:数据库并发写入性能比拼 [2010-03-18 20:47:18]
  52. 服务器性能测试工具推荐 [2010-04-17 03:27:59]
  53. 分析进程内存分配情况,解决程序性能问题 [2010-04-17 03:07:35]
  54. the ways to kill mysql application performance [2009-12-15 15:09:00]
  55. sysbench的安装和做性能测试 [2009-12-26 22:26:23]
  56. MySQL InnoDB性能调整的一点实践 [2009-09-03 13:36:34]
  57. innodb_flush_method带来的性能影响 [2009-07-22 11:30:11]
  58. 一次神奇的MySQL优化 [2011-09-03 17:43:42]
  59. MySQL数据库优化实践 [2011-07-05 17:59:34]
  60. 每天MySQL自动优化 [2011-03-09 16:19:32]
  61. 淘宝2011彩票首页开发实践 [2011-05-13 18:42:20]
  62. 梦幻西游服务器的优化 [2011-01-06 17:35:45]
  63. Web性能优化中的CPP方法 [2010-12-27 11:39:37]
  64. PHP最佳实践 [2010-12-27 00:55:42]
  65. 基于SSD的数据库性能优化 [2010-10-28 22:45:12]
  66. WEB系统需要关注的一些点 [2010-10-31 00:07:00]
  67. 一个cache的改造过程 [2010-10-18 18:38:26]
  68. 网络图像优化总结 [2010-09-21 11:04:32]
  69. 前端性能优化的方向 [2010-09-25 23:43:27]
  70. 前端优化总结 [2010-03-12 18:25:43]
  71. HTML优化 [2010-03-05 18:44:04]
  72. 前端第三方服务优化策略 [2010-06-21 19:55:00]
  73. mysql sql 百万级数据库优化方案 [2010-05-13 03:50:00]
  74. MySql优化指南 [2010-05-12 23:13:00]
  75. Linux系统初始化优化推荐策略 [2010-04-17 03:47:57]
  76. mysql query & index tuning [2009-12-14 20:05:00]
  77. the ways to kill mysql application performance [2009-12-15 15:09:00]
  78. 快些,在快些,perl的小优化 [2009-12-20 22:57:55]
  79. 从140秒到2秒的优化 [2009-11-12 18:50:58]
  80. jQuery性能优化指南 [2009-05-03 13:32:16]
  81. Sql语句优化注意 [2009-10-27 22:33:02]
  82. 一次简单C程序的性能优化 [2009-10-27 16:53:17]
  83. mysql数据库查询优化 [2009-06-14 21:53:00]
  84. PHP 性能优化技巧-google [2009-06-30 23:52:14]
  85. Linux 64位, MySQL, Swap & Memory 优化 [2008-05-25 01:56:19]
  86. MySQL介绍和性能优化 (PPT/PDF) [2009-07-28 15:15:00]
  87. 根据status信息对MySQL服务器进行优化(二) [2009-03-25 15:06:56]
  88. 根据status信息对MySQL服务器进行优化(一) [2009-03-24 14:01:21]
  89. 无需过分关注Created_tmp_disk_tables [2009-07-01 09:28:18]
  90. MySQL优化 之 Discuz论坛优化 [2009-06-21 22:17:01]
  91. Mysql的一些记录 [2009-03-07 21:22:08]
  92. Mysql 查询的一些优化技巧 [2009-04-27 10:13:57]
  93. Mysql中的排序优化 [2008-12-08 13:57:56]
  94. 说oracle优化之一 [2008-12-01 13:58:42]
  评论这张
 
阅读(662)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017