Posts Tagged ‘mysql’

什么叫千万级记录数据库?

// September 18th, 2009 // No Comments » // DB2, 电脑网络, 编程开发

很长一段时间以来,总能听到或者看到“千万级”数据(库)这种叫法,无论是网上论坛帖子还是招聘要求里。这对我来说是个怪异的概念,猜不出是什么意思。看了网上多篇文章,似乎概念上大家约定俗成就是指数据量比较大的情况下,如何提高以保证返回结果的时间在用户可接受的范围内。恩,终于明了了,就是性能评测(benchmarking)中的响应时间(response time)嘛。套了个马甲。

第一份工作的时候在银行业,有些表每天的新增数据就有2.3亿条记录(拜大集中所赐),这还只是半个中国的数据。因此从一开始,对大规模数据的处理就是我工作的基本要求。前辈们总结处很多编程与操作的规定,以满足性能上的需要。这里的性能,更多的指在规定要求的时间内完成规定的事情。在这段时间,没有人会提“千万级数据”,因为它太少了。

后来进了DB2的老家IBM, 做起了DB2的技术支持,那些DB2的开发设计大牛来讲DB2的架构,各部分的实现原则与部分细节,终于从更深层次了解了数据库是如何操作数据的,如何计算,如何join, 优化器如何改写SQL并决定访问路径(Access Path - 话说这中文翻译还真是别扭).这背后其实是cost-based estimator, 一切皆以statistics统计数据作为输入,进过DB2优化器的数学模型,得到对结果集大小、CPU时间、I/O时间等等的预测,最后得到一个时间估计,选取估计值最小的方案。

每个人都希望自己的查询(query)有快又好,但这是要跟多种因素相关联的。除了优化器选择access path以外,跟DB系统参数,Bufferpool大小,Sortpool大小,CPU,IO性能都有关系。

当然,大部分个人用户不会考率为了数据库的性能而更换或者扩展CPU数量,换用高性能的企业级存储这样的要钱的方式,因此就省下压榨database系统了。因此在互联网建站和小型企业数据库上,才更多的提到“千万级”的概念 --世上本没这个词,提的人多了也就成了个概念吧。

网上一个不算新但是很详细和典型的帖子:http://www.xiaohui.com/dev/server/20070701-discuz-mysql-cpu-100-optimize.htm

一个典型的场景就是系统突然出现了一个状况(CPU high或者响应慢到不能忍受),于是要分步排除问题,首先系统IO方面时候遇到瓶颈--打开文件数量到上限了?cache出了问题?这个部分没问题了,再看看DB系统的配置参数如何?是不是bufferpool或者sortpool大小不合适所以导致了过多的page-in,page-out?

如果上两点都没有问题,初步可以排除环境方面的因素,接下来就可以关注在具体SQL query的性能了。

那么关注哪些SQL呢?常用的关系型数据库系统(DB2, Oracle也包括MySQL等等),都有工具或者命令抓到耗时最长的SQL query. 例如MySQL下你可以用show processlist;

找到了最慢的sql,有两个方向可以选择:A 从SQL Query涉及的object(table,view)出发分析结构上的欠缺如缺少必要的index等等;另一个方向是用explain得到slow SQL的access path, 看看是不是table scan了,发生在什么环节然后去做修改。

上面是最最通用的数据库调优(Performance tuning)的策略,基本宗旨还是我们创造条件去帮助优化器(DB optimizer)以得到最优解。相信大部分DBA都熟悉。接下来说一下一个极端情况,就是无论你怎么做,优化器认为的最优解在你的特例中实际上却是最糟糕的。我们不能神话优化器,没有一种算法是能够在所有情况下都是最好的,因此极少数的SQL在特定的data特性下,我们需要去“误导”甚至是“欺骗”优化器来的到我们想要的最优解--即便这个方案在优化器看来是很糟糕的。这就是access path hint, 名字可能略有差异但是DB2,Oracle等主流数据库系统都是支持的。我们可以用自己的大脑代替优化器来决定少数特殊query的access path.

啰嗦了这么多,其实是想说,被常常使用的“千万级数据(库)”的概念,其实跟技术没多大关系,只是一个模糊的对DB甚至是整个IT系统的性能要求,有时候可以理解为性能调优技术的要求。以后见到这个概念,知道背后是怎么一回事就行了--尤其是对HR和猎头这类技术盲来说。

P.S. 数据库还有另一个scaling方面的技术来提高性能,这个是架构方向,互联网企业用的比较多。以后有空再写一写。其实网上这样的文章很不少了。

x86 架构下Ruby/Rails开发环境比较及安装方法

// April 11th, 2008 // No Comments » // Blog, Ruby, 电脑网络, 编程开发

x86 架构下Ruby/Rails开发环境比较及安装方法
[Ruby/Rails Development Environment comparison and setup instructions on x86 platform]

Original posted on www.tzhang.com/blog/
Apr 11, 2008
Version 1.0

方案选择:
1. OSX + Textmate
2. Linux + Netbeans
3. Windows + e texteditor + cgywin

优缺点比较:

1. 缺点:
a) OSX在非Mac机器上安装对显卡的要求很高,兼容性并不好。多系统启动支持也不好,需要用户有较高的操作系统知识和排错技能以及很出众的耐心和时间:(
b) OSX安装在非Apple机器上理论上说是非法的;textmate也是收费软件且价格不菲

优点:想使用最优秀的ruby/rails 编辑器textmate的话,只能这么办哦

2. 缺点:
a) NetBeans IDE比不上textmate;只能将就着用

优点:
a) Linux下全部软件都是开源免费的,包括NetBeans
b) Linux下可以方便的安装使用众多Rails相关的开源软件及库

3. 缺点:
a) Windows环境在ruby/rails的世界里绝对算是少数派
b) e texteditor也是收费软件

优点:
a) Windows简单易用,方便没有Linux/UNIX经验的人使用,setup过程简单
b) e texteditor 使用起来十分接近textmate

安装方法:
——————————————————————————————————–
方案一
OSX
N/A yet
——————————————————————————————————-
方案二
Linux + NetBeans + ruby 1.8.6 + rubygem 1.0.1 + rails 2.0.2 + mysql 5
a) 安装Ubuntu Linux
b) 安装Ruby (初学者在Ubuntu下推荐用apt-get安装1.8.5版本)
sudo apt-get install ruby
c) 安装RubyGem
Download RubyGem code
url: http://rubyforge.org/frs/?group_id=126
Untar
tar –xzvf rubygems-1.1.0.tgz
Setup
Sudo ruby setup.rb
验证安装
gem –v
which gem
d) 安装rails
安装
sudo gem update –system
sudo gem install rails –y
验证安装
rails -v
e) 安装Netbeans
下载安装文件:
url: http://dlc.sun.com.edgesuite.net/netbeans/6.0/final/
安装
把下载的Bin文件拖入终端即可
运行
/$installDir/bin/netbeans
f) 安装MySQL
sudo apt-get install mysql-common mysql-clients
g) 安装完成,记得在NetBeans里面更改默认的Ruby解释器
———————————————————————————————-
方案三
Windows + e texteditor + cgywin + console2
a) 安装e texteditor
url: http://www.e-texteditor.com/download/e_beta_setup.exe
安装
注意安装途中可能报错,那是个别文件不符合windows命名规则的原因,不用管,ignore掉然后继续就好了,影响不大。
b) 安装cgywin
初次运行e texteditor就会提示安装cgywin,直接选automatic install就好了,e texteditor会自动下载cgywin
c) 安装console2
下载console2
url: http://sourceforge.net/projects/console/
解压即可
配置console和cgywin
选add tab, 在shell里面输入:
c:\cygwin\bin\bash –login –i
将该tab移到最上方,以后每次启动console2都会自动启动该shell
d) 安装RubyGem
Download RubyGem code
url: http://rubyforge.org/frs/?group_id=126
Untar
tar –xzvf rubygems-1.1.0.tgz
Setup
Sudo ruby setup.rb
验证安装
gem –v
which gem
如果出现错误,使用:
unset RUBYOPT

e) 安装rails
安装
sudo gem update –system
sudo gem install rails –include-dependencies
验证安装
rails -v

f) 测试安装
rails blog
cd blog
e .
你将会看到e texteditor 自动启动并将当前目录的项目打开。

====================================================================
updated 2008-04-16

Install sqlite3 and mongrel:

#before install Mongrel,
apt-get install build-essential #we need it to compile mongrel and Sqlite3

#intall Mongrel
gem install mongrel –include-dependencies

#install Sqlite3
apt-get install sqlite3 swig libsqlite3-ruby libsqlite3-dev
gem install sqlite3-ruby #compile this need libsqlite.h

#install Lighttpd
apt-get install lighttpd

===============================================
UPDATED 2008-05-27:
在Linux下有更好的IDE选择了,Gedit可以加几个插件和主题,就可以比较完美的模仿textmate了,具体请看这个帖子
http://www.tzhang.com/blog/2008/04/17/textmate-like-gedit