MySQL: 解决局域网内连接速度慢问题

>>场景描述:

在 MySQL 的 user 权限表增加了 局域网内另外一台服务器的访问账号,如: Host为 192.168.0.128,User为 jacky 的访问用户。但,在另外一台服务器上 连接数据库服务器时访问速度超慢;奇怪的是,在数据库服务器上通过 localhost 访问速度很快。虽然说,localhost是通过 Unix Socket连接,192.168.0.128 是通过TCP/IP连接,但也不至于相差那么悬殊。

>>解决方案:

问题的产生的原因归咎于MySQL的DNS反向解析功能。默认情况下DNS反向解析功能是开启的,用于将客户端的请求解析为 user 表对应的Host主机名,但如果是以IP地址请求,则经过一系列的DNS解析操作 或操作超时后返回,所以导致了访问速度急剧下降。

通过在 my.cnf 配置文件的 [mysqld] 节里面添加   skip-name-resolve 选项,保存并重启MySQL 即可解决上述问题。但由于禁用了DNS反向解析功能,所以不能在 user 表里面使用 主机名 而只能使用IP地址。

【参考】http://dev.mysql.com/doc/refman/5.1/en/dns.html

MySQL: 主机账号 localhost 和 localhost.localdomain 区别?

仔细查看MySQL用户授权表的同学可能留意到,user表里面不单存在 localhost 本地主机账号,而且存在 localhost.localdomain 账号。 那他们的区别到底是什么?我打算以下面的例子来引出他们的区别所在。

1. 使用 localhost 主机账号登录


[root@localhost /]# mysql -h localhost -uroot -p
...
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.1.45, for pc-linux-gnu (i686) using  EditLine wrapper

Connection id:        47
Current database:
Current user:        root@localhost
SSL:            Not in use
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server version:        5.1.45-log Source distribution
Protocol version:    10
Connection:        Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /opt/mysql/tmp/mysql.sock
Uptime:            6 hours 33 min 57 sec

Threads: 1  Questions: 975  Slow queries: 17  Opens: 77  Flush tables: 5  Open tables: 42  Queries per second avg: 0.41
--------------

2. 使用 localhost.localdomain 登录

[root@localhost /]# mysql -h localhost.localdomain -uroot -p
...
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.1.45, for pc-linux-gnu (i686) using  EditLine wrapper

Connection id:        48
Current database:
Current user:        root@localhost
SSL:            Not in use
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server version:        5.1.45-log Source distribution
Protocol version:    10
Connection:        localhost.localdomain via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:        3306
Uptime:            6 hours 36 min 49 sec

Threads: 1  Questions: 979  Slow queries: 17  Opens: 77  Flush tables: 5  Open tables: 42  Queries per second avg: 0.41
--------------

到这里,有发现两种不同登录方式的区别了吗?答案就在 Connection 属性里面;localhost主机账号登录使用Unix Socket连接,而 localhost.localdomain 则使用 TCP/IP 连接。使用 Unix Socket连接比TCP/IP更高性能,但并不是每种客户端都能使用Unix Socket 进行连接。

性能分析:找出MySQL的慢查询语句

分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”。

>>记录慢查询的方法:

1. 执行下面语句查看/设置“慢查询”的时间定义


mysql> show variables like "long%";
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 0.000100 |
+-----------------+----------+
1 row in set (0.00 sec)

如上述语句输出,“慢查询”的时间定义为0.0001秒(方便测试,一般设置为1-10秒)。使用下面语句定义“慢查询”时间


mysql> set long_query_time=0.0001;
Query OK, 0 rows affected (0.00 sec)

2. 开启“慢查询”记录功能


mysql> show variables like "slow%";
+---------------------+------------------------------------+
| Variable_name       | Value                              |
+---------------------+------------------------------------+
| slow_launch_time    | 2                                  |
| slow_query_log      | OFF                                |
| slow_query_log_file | /opt/mysql/data/localhost-slow.log |
+---------------------+------------------------------------+
3 rows in set (0.00 sec)

上述语句查看“慢查询”的配置信息,你可以自定义日志文件的存放,但必须将 slow_query_log 全局变量设置为“ON”状态,执行以下语句:


mysql> set global slow_query_log=ON;
Query OK, 0 rows affected (0.01 sec)

结果:

mysql> show variables like "slow%";
+---------------------+------------------------------------+
| Variable_name       | Value                              |
+---------------------+------------------------------------+
| slow_launch_time    | 2                                  |
| slow_query_log      | ON                                 |
| slow_query_log_file | /opt/mysql/data/localhost-slow.log |
+---------------------+------------------------------------+
3 rows in set (0.00 sec)

>>查看日志:

[root@localhost /]# cat /opt/mysql/data/localhost-slow.log
# Time: 100704 10:44:46
# User@Host: root[root] @ localhost []
# Query_time: 0.050452  Lock_time: 0.000250 Rows_sent: 31  Rows_examined: 31
SET timestamp=1278211486;
select * from ecs_goods;

目录算法应用

场景:

保存商品信息的表结构里面存在一个字段用于记录商品的缩略图信息。假如,当前系统的缩略图大小为:160 * 120像素,现有的字段能满足当前需求,但考虑以下情况:

1. 为满足新版面的显示需要,要求为每款商品增加220 * 180 像素的缩略图。你现在是打算增加一个新的字段用于存储新缩略图的信息?

2. 考虑以后的扩展,当新增若干缩略图时怎样提高性能?

解决方案:

不断的将不同规格大小的缩略图信息都放在数据表上并不是好的解决方案。应以减轻数据库的访问压力为原则,通过程序计算出缩略图的存放目录,这样可以合理的将压力分布到WEB前端服务器,并且不会影响原有的架构。

1. 存放目录的计算方法

关键点是一一对应的关系,一款商品对应一个两级目录:主目录名/次目录名

同一款商品的所有规格图片全部存放在如此结构的目录下面。

目录算法应该保证每款商品有一个唯一的两级目录,并且尽量缩短目录名称的长度。

function calculate($goods_sn)
{
 $dirs = 100;
 for ($i = 0; $i < strlen($goods_sn); $i++) {
   $d1 += ord($goods_sn{$i})) * $i;
   $d2 += ord($goods_sn{$i})) * ($i * 2 + 1);
 }
   $dir1 = $d1 % $dirs;
   $dir2 = $d2 % $dirs;
   return $dir1 . '/' . $dir2 ;
}

PHP输出CSV中文乱码解决方案

问题场景:

PHP输出CSV格式文本(UTF-8编码)时如果存在中文字符,用EXCEL打开会出现乱码。

解决办法:

在CSV文本的中文字段前面加上“xEFxBBxBF” 字符用于兼容MS EXCE。

输出Excel/CSV的头:

header(“Content-type: Application/vnd.ms-excel”);
header(“Content-Disposition:filename=output.csv”);

Crontab定时任务

crontab 命令通常用于处理定时任务。


分析以下应用需求:

1. 怎样自动将 SVN Server的最新数据 导入到  Web服务器 的执行目录?

2. 怎样自动定时执行一些备份操作和请求(通过PHP来处理)?

上述问题都可以使用crontab命令来解决,

Read the rest of this entry »

Subversion Server 安装与配置

1. 下载最新 SVN Server

    http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=260&expandFolder=74

    subversion-1.6.11.tar.gz     
    解压两个文件自动合并到一个目录。

2. 安装

    ./configure –prefix=/opt/svn –without-berkeley-db
   
    make && make install

3. 创建test库

     svnadmin create –fs-type fsfs /svn/test

4. 修改库配置

     vim /svn/test/conf/svnserve.conf
     1) 取消 auth-access 注释,并设置为write
     2) 取消 anon-access 注释,并设置为none
     3) 取消 password-db 注释
     4) 取消 authz-db 注释
     
     修改完毕后,保存退出。

      vim /svn/test/conf/passwd
      增加一个用户并设置密码,如:
      jacky = helloworld

     vim /svn/test/conf/authz
     增加认证信息,如:
      [/]
      jacky = rw
——————————————————————
    
    

Nginx+PHP+MySQL+Memcached for CentOS 安装配置

安装MySQL:

* 使用rpm -ql mysql 命令查询当前系统是否已经安装了mysql,如果已经安装,则需要先卸载。

(yum remove mysql)

1. 下载最新MySQL源码包(如:http://linux.newhua.com/soft/3608.htm

2. adduser mysql  (添加用户)

3. tar zxvf mysql… 解压到/home/app/mysql目录
4. cd /home/app/mysql 进入源码目录
5 ./configure –prefix=/usr/local/mysql –localstatedir=/usr/local/mysql/data –with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock –with-extra-charsets=all –with-charset=utf8 –with-client-ldflags=-all-static –with-mysqld-ldflags=-all-static –with-plugins=all –with-pthread –enable-thread-safe-client

6. make && make install

注意:mysql-test过程比较漫长,需要耐心等待。

7. cp /usr/local/mysql/share/mysql/my-medium.cnf  /etc/my.cnf  (选择合适的预配置文件)

8. /usr/local/mysql/bin/mysql_install_db –user=mysql (安装系统授权数据库)

9. /usr/local/mysql/share/mysql/mysql.server start (启动服务)

10. /usr/local/mysql/bin/mysqladmin -u root password 密码  (设置root帐号密码)

11. /usr/local/mysql/bin/mysql -u root -p (登录)

Read the rest of this entry »