Elton's Blog

Tag: mysql

ubuntu 11.04下,使用google-perftools的tcmalloc加速MySQL

by on 七.15, 2011, under Linux

1.在 /usr/local/src 下准备好以下文件
libunwind-0.99.tar.gz (64位操作系统需要)
google-perftools-1.7.tar.gz

2.安装libunwind(32位操作系统忽略此步骤)

1
2
3
4
5
6
cd /usr/local/src
tar zxvf libunwind-0.99.tar.gz
cd libunwind-0.99
CFLAGS=-fPIC ./configure --enable-shared
make CFLAGS=-fPIC
make CFLAGS=-fPIC install

3.安装google-perftools (最小化安装)

1
2
3
4
5
6
cd /usr/local/src
tar zvxf google-perftools-1.7.tar.gz
cd google-perftools-1.7
mkdir /tmp/tc
./configure --prefix=/tmp/tc --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --disable-debugalloc --enable-minimal
 make && make install

4.复制tcmalloc动态库到系统库目录,并建立软连接

1
2
3
4
5
6
ls -alt /tmp/tc/lib/*
cp /tmp/tc/lib/libtcmalloc_minimal.so.0.1.0 /usr/local/lib
ln -s /usr/local/lib/libtcmalloc_minimal.so.0.1.0 /usr/local/lib/libtcmalloc.so
ln -s /usr/local/lib/libtcmalloc_minimal.so.0.1.0 /usr/local/lib/libtcmalloc.so.0
ln -s /usr/local/lib/libtcmalloc_minimal.so.0.1.0 /usr/local/lib/libtcmalloc.so.0.1.0
ln -s /usr/local/lib/libtcmalloc_minimal.so.0.1.0 /usr/local/lib/libtcmalloc_minimal.so.0

5.删除临时目录

1
rm -rf /tmp/tc

6.设置Mysql运行时加载tcmalloc (根据mysql安装位置而定)

1
vim /usr/local/mysql/bin/mysqld_safe

在# executing mysqld_safe的下一行,加入以下内容

1
export LD_PRELOAD="/usr/local/lib/libtcmalloc.so"

7. 重启MySQL

1
/etc/init.d/mysql start

8.使用lsof命令查看tcmalloc是否起效

1
sudo lsof -n |grep tcmalloc

应该看到下面的内容

1
mysqld    12484      mysql  mem       REG        8,7       860657    5382577 /usr/local/lib/libtcmalloc_minimal.so.0.1.0

说明MySQL已经使用上了tcmalloc进行加速了。

1 Comment :, , more...

MySQL Query Cache

by on 七.05, 2010, under Database

顾名思义,MySQL Query Cache 就是用来缓存和 Query 相关的数据的。具体来说,Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集。大概来讲,就是将 SELECT 语句和语句的结果做了一个 HASH 映射关系然后保存在一定的内存区域中。

在大部分的 MySQL 分发版本中,Query Cache 功能默认都是打开的,我们可以通过调整 MySQL Server 的参数选项打开该功能。主要由以下5个参数构成:

query_cache_limit:允许 Cache 的单条 Query 结果集的最大容量,默认是1MB,超过此参数设置的 Query 结果集将不会被 Cache
query_cache_min_res_unit:设置 Query Cache 中每次分配内存的最小空间大小,也就是每个 Query 的 Cache 最小占用的内存空间大小
query_cache_size:设置 Query Cache 所使用的内存大小,默认值为0,大小必须是1024的整数倍,如果不是整数倍,MySQL 会自动调整降低最小量以达到1024的倍数
query_cache_type:控制 Query Cache 功能的开关,可以设置为0(OFF),1(ON)和2(DEMAND)三种,意义分别如下:
0(OFF):关闭 Query Cache 功能,任何情况下都不会使用 Query Cache
1(ON):开启 Query Cache 功能,但是当 SELECT 语句中使用的 SQL_NO_CACHE 提示后,将不使用Query Cache
2(DEMAND):开启 Query Cache 功能,但是只有当 SELECT 语句中使用了 SQL_CACHE 提示后,才使用 Query Cache
query_cache_wlock_invalidate:控制当有写锁定发生在表上的时刻是否先失效该表相关的 Query Cache,如果设置为 1(TRUE),则在写锁定的同时将失效该表相关的所有 Query Cache,如果设置为0(FALSE)则在锁定时刻仍然允许读取该表相关的 Query Cache。
Query Cache 如何处理子查询的?
这是我遇到的最为常见的一个问题。其实 Query Cache 是以客户端请求提交的 Query 为对象来处理的,只要客户端请求的是一个 Query,无论这个 Query 是一个简单的单表查询还是多表 Join,亦或者是带有子查询的复杂 SQL,都被当作成一个 Query,不会被分拆成多个 Query 来进行 Cache。所以,存在子查询的复杂 Query 也只会产生一个Cache对象,子查询不会产生单独的Cache内容。UNION[ALL] 类型的语句也同样如此。

Query Cache 是以 block 的方式存储的数据块吗?
不是,Query Cache 中缓存的内容仅仅只包含该 Query 所需要的结果数据,是结果集。当然,并不仅仅只是结果数据,还包含与该结果相关的其他信息,比如产生该 Cache 的客户端连接的字符集,数据的字符集,客户端连接的 Default Database等。

Query Cache 为什么效率会非常高,即使所有数据都可以 Cache 进内存的情况下,有些时候也不如使用 Query Cache 的效率高?
Query Cache 的查找,是在 MySQL 接受到客户端请求后在对 Query 进行权限验证之后,SQL 解析之前。也就是说,当 MySQL 接受到客户端的SQL后,仅仅只需要对其进行相应的权限验证后就会通过 Query Cache 来查找结果,甚至都不需要经过 Optimizer 模块进行执行计划的分析优化,更不许要发生任何存储引擎的交互,减少了大量的磁盘 IO 和 CPU 运算,所以效率非常高。

客户端提交的 SQL 语句大小写对 Query Cache 有影响吗?
有,由于 Query Cache 在内存中是以 HASH 结构来进行映射,HASH 算法基础就是组成 SQL 语句的字符,所以必须要整个 SQL 语句在字符级别完全一致,才能在 Query Cache 中命中,即使多一个空格也不行。

一个 SQL 语句在 Query Cache 中的内容,在什么情况下会失效?
为了保证 Query Cache 中的内容与是实际数据绝对一致,当表中的数据有任何变化,包括新增,修改,删除等,都会使所有引用到该表的 SQL 的 Query Cache 失效。

为什么我的系统在开启了 Query Cache 之后整体性能反而下降了?
当开启了 Query Cache 之后,尤其是当我们的 query_cache_type 参数设置为 1 以后,MySQL 会对每个 SELECT 语句都进行 Query Cache 查找,查找操作虽然比较简单,但仍然也是要消耗一些 CPU 运算资源的。而由于 Query Cache 的失效机制的特性,可能由于表上的数据变化比较频繁,大量的 Query Cache 频繁的被失效,所以 Query Cache 的命中率就可能比较低下。所以有些场景下,Query Cache 不仅不能提高效率,反而可能造成负面影响。

如何确认一个系统的 Query Cache 的运行是否健康,命中率如何,设置量是否足够?
MySQL 提供了一系列的 Global Status 来记录 Query Cache 的当前状态,具体如下:

Qcache_free_blocks:目前还处于空闲状态的 Query Cache 中内存 Block 数目
Qcache_free_memory:目前还处于空闲状态的 Query Cache 内存总量
Qcache_hits:Query Cache 命中次数
Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次数,也就是没有命中的次数
Qcache_lowmem_prunes:当 Query Cache 内存容量不够,需要从中删除老的 Query Cache 以给新的 Cache 对象使用的次数
Qcache_not_cached:没有被 Cache 的 SQL 数,包括无法被 Cache 的 SQL 以及由于 query_cache_type 设置的不会被 Cache 的 SQL
Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 数量
Qcache_total_blocks:Query Cache 中总的 Block 数量
可以根据这几个状态计算出 Cache 命中率,计算出 Query Cache 大小设置是否足够,总的来说,我个人不建议将 Query Cache 的大小设置超过256MB,这也是业界比较常用的做法。

MySQL Cluster 是否可以使用 Query Cache?
其实在我们的生产环境中也没有使用 MySQL Cluster,所以我也没有在 MySQL Cluster 环境中使用 Query Cache 的实际经验,只是 MySQL 文档中说明确实可以在 MySQL Cluster 中使用 Query Cache。从 MySQL Cluster 的原理来分析,也觉得应该可以使用,毕竟 SQL 节点和数据节点比较独立,各司其职,只是 Cache 的失效机制会要稍微复杂一点。

引自:http://www.javaeye.com/news/16744-mysql-query-cache-summary

2 Comments :, , more...

Snow Leopard下,为Rails升级

by on 十二.06, 2009, under Rails

Snow Leopard是Apple最新的操作系统,拥有更快的速度并减少了对磁盘的占用。 Snow Leopard自带了ruby 1.8.7,已经可以很好的兼容Rails2.*。 对于Rails的开发者应该注意,如果你是从Leopard升级而来,Snow Leopard默认所有的解释型语言都是64位的(包括Ruby)。所以,如果之前你用的是32位的组建,需要做一些更新。

安装Snow Leopard 开发工具

在安装光盘上选择 “Optional Installs”, 安装 “Xcode.mpkg”. 使用默认的设置

安装Passenger

1
2
$ sudo gem install -r passenger
$ sudo passenger-install-apache2-module
1
$ cd /etc/apache2

编辑httpd.conf加入一下代码:

1
2
3
LoadModule passenger_module /Library/Ruby/Gems/1.8/gems/passenger-2.2.4/ext/apache2/mod_passenger.so
PassengerRoot /Library/Ruby/Gems/1.8/gems/passenger-2.2.4
PassengerRuby /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby

安装MySQL

为了避免不必要的麻烦,强烈推荐你安装64位版本的MySQL。停止之前版本的MySQL。

这里安装适合Mac OS X 10.5 (x86_64)的MySQL

下载完成后,打开磁盘镜像,首先安装 “mysql-5.1.37-osx10.5-x86_64.pkg”. 使用默认项即可。

然后安装 “MySQLStartupItem.pkg”. 作为Mac的启动项.

最后安装 “MySQL.prefPane”.

如果之前你安装过32位的MySQL gem,那么你需要重新安装一份适合64位的版本。

1
$ sudo env ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config

注意,你不需要使用ARCHFLAGS来重新编译其他gem

原文地址:http://weblog.rubyonrails.org/2009/8/30/upgrading-to-snow-leopard

3 Comments :, , , , , more...

Snow Leopard安装PHP+MySQL+Apache

by on 九.30, 2009, under Mac, PHP

其实Snow Leopard已经内置了apache 2.2.11和php 5.3.0,只是默认都没有打开。

感谢网友Jerry的提醒,如果没有安装过XCode的朋友,在执行下面这些步骤之前,请先安装XCode,XCode在Snow Leopard的光盘里面自带了,你也可以去Apple官方网站,注册一个帐号去下载最新版本的。

1. 启用Apache
进入系统偏好->共享,勾选web共享后即可开启Apache

2. 配置PHP

1
sudo vim /etc/apache2/httpd.conf

1
#LoadModule php5_module        libexec/apache2/libphp5.so

把前面的#去掉。

1
sudo cp /etc/php.ini.default /etc/php.ini

3. 安装MySQL
MySQL网站下载最新的MySQL的dmg,按照普通程序安装即可。

1
sudo vim /etc/php.ini

将mysql.default_socket的值改为:“/tmp/mysql.sock”
将mysql.default_port的值改为:3306

重启Apache

1
sudo apachectl restart

4.测试
在/Library/WebServer/Documents下面建立一个test.php,里面写入:

1
2
3
<?php
phpinfo();
?>

然后访问http://localhost/test.php,可以看到mysql都已经配置好了。

5.增加mcrypt扩展支持
先下载,libmcrypt,然后在终端定位到目录里面

再在终端输入:

1
2
3
./configure --disable-posix-threads --enable-static
make
sudo make install

下载php的源码包,然后解包,在终端用cd定位到里面的ext/mcrypt目录

终端输入:

1
2
3
4
5
phpize
./configure
make
cd modules
sudo cp mcrypt.so /usr/lib/php/extensions/no-debug-non-zts-20090626/mcrypt.so

然后在终端输入:

1
sudo pico /etc/php.ini

在extensions那里加上:

extension=mcrypt.so

当然,别忘记把extension_dir=后面的改为:

“/usr/lib/php/extensions/no-debug-non-zts-20090626/”

然后,重启apache

1
sudo apachectl restart

至此,就在Snow Leopard下成功安装了PHP,MySQL和Apache了。

15 Comments :, , , more...

Leopard下手工安装ruby,rails和mysql

by on 八.23, 2009, under Mac, Rails

1. 安装readline
ftp://ftp.gnu.org/gnu/readline/

1
2
3
4
cd readline-6.0
./configure --prefix=/usr/local
make
sudo make install

2. 安装ruby

1
2
3
4
5
6
tar xvjf ruby-1.8.7-p174.tar.bz2
cd ruby-1.8.7-p174
./configure --prefix=/usr/local/ruby --enable-pthread --with-readline-dir=/usr/local --enable-shared
make
sudo make install
sudo make install-doc

使用ruby -v来确认版本安装正确

3. 安装mysql

1
2
3
4
5
6
/configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-shared --with-plugins=max-no-ndb
make
sudo make install
cd /usr/local/mysql
sudo ./bin/mysql_install_db --user=mysql
sudo chown -R mysql ./var/

mac os x 是靠 launchd 守护进程运行的, 配置文件用的是 PropertyList (XML 格式), 通过观察发现每10秒检查一次, 发现进程不在就启动.

方法是新建 /Library/LaunchDaemons/com.mysql.mysqld.plist 写入如下内容.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>KeepAlive</key>
<true />
	<key>Label</key>
	<string>com.mysql.mysqld</string>
	<key>Program</key>
	<string>/usr/local/mysql/bin/mysqld_safe</string>
	<key>RunAtLoad</key>
<true />
	<key>UserName</key>
	<string>mysql</string>
	<key>WorkingDirectory</key>
	<string>/usr/local/mysql</string>
	</dict>
</plist>

加入守护清单
sudo launchctl load -w /Library/LaunchDaemons/com.mysql.mysqld.plist

查看清单
launchctl list

解除守护
sudo launchctl unload -w /Library/LaunchDaemons/com.mysql.mysqld.plist

4. 安装mysql的c驱动

http://rubyforge.org/fsr/download.php/51087/mysql-ruby-2.8.1.tar.gz

1
2
3
4
5
tar xzvf mysql-ruby-2.8.1.tar.gz
cd mysql-ruby-2.8.1
ruby extconf.rb --with-mysql-dir=/usr/local/mysql
make
sudo make instal

如果出现类似以下的错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lmygcc... yes
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

就换用

1
sudo ruby extconf.rb --with-mysql-config
7 Comments :, , , more...

MySQL 编译参数优化

by on 六.23, 2009, under Linux

适当的调整MySQL的编译参数,可以极大的提升MySQL的性能,官方文档说可以提升10-30%的性能。

1. -static 13%
–with-client-ldflags=-all-static
–with-mysqld-ldflags=-all-static
静态链接提高13%性能

2. -pgcc 1%
CFLAGS=”-O3 -mnocona -mstack-align-double” CXX=gcc
CXXFLAGS=”-O3 -mnocona -mstack-align-double
-felide-constructors -fno-exceptions -fno-rtti”
如果是Inter处理器,使用pgcc提高1%性能, 其中-m参数指定你cpu的类型,如果你是Intel Pentium4 支持64位的CPU就试用nocona这个参数,如果你是Intel Core2则使用core2这个参数。详细的cpu支持参数列表在这里

3. Unix Socket 7.5%
–with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock
使用unix套接字链接提高7.5%性能,所以在windows下mysql性能肯定不如unix下面

4. –enable-assembler
允许使用汇编模式(优化性能)

1
2
3
4
5
6
7
8
9
10
CFLAGS="-O3 mnocona" CXX=gcc CXXFLAGS="-O3 mnocona -felide-constructors 
         -fno-exceptions -fno-rtti -fomit-frame-pointer -ffixed-ebp"
        ./configure 
           --prefix=/usr/local/mysql --enable-assembler 
           --with-mysqld-ldflags=-all-static
           --with-client-ldflags=-all-static
           --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock
           --with-charset=utf8
           --with-collation=utf8_general_ci
           --with-extra-charsets=all
27 Comments :, , more...

MySQL 5.1.35 安装Innodb报unknown variable innodb_data_home_dir错误

by on 六.18, 2009, under Linux

今天在一台服务器上安装最新的Mysql 5.1.35,通过源代码安装。

编译安装都很顺利,到执行

1
bin/mysql_install_db --user=mysql

就报了usr/local/mysql/libexec/mysqld: unknown variable ‘innodb_data_home_dir=/usr/local/mysql/var/’错误。
之前从来没有过,百思不得其解,Google了一下,发现原来是最新的MySQL默认不带innodb引擎。 于是重新编译,在configrue的时候,加上–with-plugins=innobase这个参数

之后可以进入数据库,执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql>show plugin;
 
+————+——–+—————-+————–+———+
| Name       | Status | Type           | Library      | License |
+————+——–+—————-+————–+———+
| binlog     | ACTIVE | STORAGE ENGINE | NULL         | GPL     |
| CSV        | ACTIVE | STORAGE ENGINE | NULL         | GPL     |
| MEMORY     | ACTIVE | STORAGE ENGINE | NULL         | GPL     |
| MyISAM     | ACTIVE | STORAGE ENGINE | NULL         | GPL     |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL         | GPL     |
| SPHINX     | ACTIVE | STORAGE ENGINE | NULL         | GPL     |
| PBXT       | ACTIVE | STORAGE ENGINE | libpbxt.so   | GPL     |
| InnoDB     | ACTIVE | STORAGE ENGINE | ha_innodb.so | GPL     |
+————+——–+—————-+————–+———+

如果还没有,就执行一下

1
mysql>install plugin innodb soname 'ha_innodb.so';
29 Comments :, more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit my friends!

A few highly recommended friends...