Skip navigation.

极湖

无不用其“极”

Posts tagged with "MySQL"

让 Zend_Db 支持 MySQL 的 SQL_CALC_FOUND_ROWS

, ,

修改 Zend/Db/Select.php, 增加以下代码

const FOUND_ROWS     = 'foundrows'; 
const SQL_FOUND_ROWS = 'SQL_CALC_FOUND_ROWS'; 

protected static $_partsInit = array(
    self::FOUND_ROWS   => false,  
    ... ...
);

/**
 * Makes the query SELECT SQL_CALC_FOUND_ROWS.  
 *
 * @param bool $flag Whether or not add SQL_CALC_FOUND_ROWS to SELECT.
 * @return Zend_Db_Select This Zend_Db_Select object.
 */
public function foundRows($flag = true)
{
    $this->_parts[self::FOUND_ROWS] = (bool) $flag;
    return $this;
}

/**
 * Render FOUND_ROWS clause  
 *
 * @param string   $sql SQL query
 * @return string
 */
protected function _renderFoundRows($sql)
{
    if ($this->_parts[self::FOUND_ROWS]) {
        $sql .= ' ' . self::SQL_FOUND_ROWS;
    }

    return $sql;
}


以上代码的具体位置不再详述。

调用方法如下:

$select = $db->select()->foundRows()->from(
  ... ...
)->where(
  ... ...
);

$data = $db->fetchAll($select);

$stmt = $db->query("SELECT FOUND_ROWS() as cnt");
list($rec) = $stmt->fetchAll();
$count = $rec['cnt'];

MySQL下复制表格的方法

两步走:
CREATE TABLE new_table LIKE original_table;
INSERT INTO new_table SELECT * FROM original_table;

这样做的好处是同时复制表格的主键等。

如果只是复制数据:
CREATE TABLE new_table AS SELECT * FROM original_table;

即可。

关于优化MySQL应对高访问网站的讨论

, , ,

原文: http://www-css.fnal.gov/dsg/external/freeware/mysqlTuning.html
翻译: 小白(又名 风子)

MySQL优化
关于优化MySQL应对高访问网站的讨论

Tim,
首席技术长官,DCS

MySQL设置,高并发连接
本人有一网站每天需要负责大约3000用户,每天长达5到7小时的在线工作。所以在繁忙时段,我们要为2000多并发用户提供服务。在PHP和MySQL的设置比较合理的前提下,即使是入门级的Intel平台的服务器,MySQL一样可以应对的很好。

首先是硬件需求
1. 最好可以将Apache/PHP和MySQL分开跑在两台独立的服务器上,Linux版本及分发不限
2. 尽量减少服务器的其他负载,将最多的资源留给Apache/PHP和MySQL服务

我正在使用的服务器配置如下:
1. Apache/PHP: 奔腾III, 600MHz, 512M内存
2. MySQL: 双奔腾III, 750MHz, 2G内存

如此有偏向的配置主要是因为数据库的负荷非常重。我们的网站为会员制的在线教学系统,只有登录以后才能使用其中的功能,而且内容高度自订化。学生可以在系统中访问属于本人的一整套服务,譬如课程,成绩卡,时间表等等。教师可在网站上在线创建课程,包括课文,语音材料(包括文本生成的音频材料)等等。

1) PHP 程序编写: 一定要使用持续连接!
从Apache/PHP到MySQL的通讯中,建立和关闭连接是一个非常大的开销。通过使用持续连接,大型的数据访问网站可以共享连接来交换数据,避免了载入每页时都要重复的连接请求。有鉴于用户每次点击都可能会产生一次连接,持续连接的左右是相当重要的。
确定使用mysql_pconnect来取代mysql_connect,同时在php.ini或者程序文件中的ini_set行应当做出相应的调整。

2) Apache设置(httpd.conf)。我们的网站进行了很多针对性的优化,经过多次试验对比,我们最终确定了一组参数。最终的结果使我们在top可以得到最大的CPU空闲百分比。
MinSpareServers 10
MaxSpareServers 20
StartServers 70
MaxClients 255

3) Mysql设置(my.cnf)。在MySQL的配置文件重,我们在[mysqld]模块中加入了如下内容
set-variable = max_connections = 300
(这个数字必须大于Apache的MaxClients,否则Apache将无法充分利用连接)
set-variable = max_user_connections = 300
set-variable = table_cacle = 1200
(在数据库查询中可能发生的最多join表数量乘以max_user_connections)
在如上的参数重,max_connections和max_user_connections为我们提供稳定的服务提供了巨大的帮助。当Apache/PHP连接MySQL服务器时会被作为单用户来对待,MySQL默认并发连接数为1(译者注,鉴于原文撰写时间较早,当时的数据库默认配置较为保守。译者特地检查MySQL 5.0.32的默认位置文件,发现默认并发连接数已经提高到100,对于中小型网站来说已经游刃有余。不过网管对于这个参数的作用还是应当了然于胸的)。通过修改max_connections,使得Apache/PHP可以产生大量的持续连接。当Apache启动时,大量的并发连接已经就绪,之后的访问都可以利用这条通路来交换数据,从而大大的节约了建立连接时的系统开销。

一些MySQL的其他技巧
set-variable = max_allowed_packet = 1M (数据健壮性检查,防止失控查询)
set-variable = max_connect_errors = 999999 (防止mysqld因为过多的连接错误而重启)

译者注: 本文原创于2003年,当时的网络条件和硬件条件和如今已经有了比较大的区别,软件配置也有了相当的变化,譬如set-variable在MySQL 4.0.2以后已经可以省略。所以本文仅供参考,为有志于深入了解Apache MySQL的管理员新手们提供一点辅助的参考资料,切莫生搬硬套。

几条常用的Mysql命令

,

建库
create database `mydb` default character set utf8 collate utf8_general_ci;
grant all privileges on mydb.* to mydb_user@'localhost' identified by "mydb_pass";
grant all privileges on mydb.* to mydb_user@'%' identified by "mydb_pass";

设置密码
set password for 'root'@'localhost' = old_password('root_pass');
set password for 'mydb_user'@'localhost' = old_password('mydb_pass');
set password for 'mydb_user'@'%' = old_password('mydb_pass');

备份
# mysqldump --default-character-set=utf8 -uroot --all-databses > alldb_dump.sql
# mysqldump -u mydb_user -p mydb_pass --compact --default-character-set=utf8 mydb > mydb_dump.sql

恢复
# mysql -u root -p --default-character-set=utf8 < alldb_dump.sql
# mysql -u mydb_user -p --default-character-set=utf8 mydb < mydb_dump.sql

MySQL和PostgreSQL性能调优参考

, ,

MySQL数据库的分析报告工具

,

在一个叫 Hack MySQL 的网站上,发现了一个 mysqlreport的Perl脚本,在MySQL服务器上运行该脚本,就能给你制作一份漂亮的MySQL运行情况报告,对于MySQL的性能分析以及调优很有帮助。

运行该脚本之前,可能需要修改的地方:

# Default values if nothing else
$mycnf{'host'} ||= 'localhost';
$mycnf{'port'} ||= 3306;
$mycnf{'socket'} ||= '/var/run/mysqld/mysqld.sock'; # Debian default
$mycnf{'user'} ||= $ENV{'USER'};

我只修改了其中关于socket文件的一句:

$mycnf{'socket'} ||= '/tmp/mysql.sock'; # Debian default

执行结果就出来了:

MySQL 4.1.16-log uptime 12 13:20:50 Thu Feb 8 11:10:26 2007

__ Key _________________________________________________________________
Buffer used 372.00k of 16.00M %Used: 2.27
Current 1.86M %Usage: 11.62
Write ratio 0.000
Read ratio 0.012

__ Questions ___________________________________________________________
Total 2.40M 2.2/s
Slow 0 0/s %Total: 0.00 %DMS: 0.00
DMS 540 0.0/s 0.02

__ Table Locks _________________________________________________________
Waited 0 0/s %Total: 0.00
Immediate 540 0.0/s

__ Tables ______________________________________________________________
Open 7 of 64 %Cache: 10.94
Opened 7 0.0/s

__ Connections _________________________________________________________
Max used 3 of 100 %Max: 3.00
Total 18.08k 0.0/s

__ Created Temp ________________________________________________________
Disk table 0 0/s
Table 0 0/s
File 0 0/s


MySql 数据库的修复和优化

1. 修复并优化所有数据库:
本地:
# mysqlcheck -A -r -o -p

远程:
# mysqlcheck -A -r -o -p -h服务器地址

2. 修复并优化指定的数据库:
本地:
# mysqlcheck -u用户名 -p密码 -r -o 库名

远程:
# mysqlcheck --u用户名 -p密码 -h服务器地址 -r -o 库名

MySQL 与 Web 2.0

,

偶然打开MySQL的主页,首页上的图片,吸引了我的眼球。在这张图片上,有一群熟悉的图标:



Delicious,Flickr,Digg,Wikipedia,trulia,Zimbra,Craigslist,Technorati,Feedburner,如果你每天上网,对这些网站应该不会陌生。对于Web技术人员,看到这些,如果不知道是些什么,那就说不过去了。

不熟悉这些网站,也不要紧,看看这篇文章——《CNN评出25个典型的下一代互联网公司》,对比一下MySQL的列表,就知道MySQL的这个成绩是多么的骄人了。

这些图标背后的网站,称得上Web 2.0的代表作,可谓杰作。目前,这些网站已经有众多的使用者,且有越来越流行的趋势。这些网站基本上都采用了LAMP的结构。MySQL的说法是:“The Most Demanding Web 2.0 Sites in the World Run MySQL(世界上,接受请求数量最多的Web 2.0网站,在跑MySQL)”。MySQL有这么多重量级的应用,确实值得自豪。假如我是MySQL的开发人员,我想我会有非同一般的成就感。

也许你会问,这些网站,为什么就没有一个采用Oracle,而是采用MySQL? 原因不必细说,一个天价,一个免费,你会用哪个?实际上,这些充满“新概念”的网站,开始往往都是由个人开发,个人做网站,基本上都不会考虑用昂贵的商业产品,利用开源的东西是顺理成章的事情。而MySQL如此受宠,却也多少出乎人的意料。我一直认为,开源数据库里面,PostgreSQL强于MySQL,尤其在技术层面上。实际应用中,却是MySQL的应用占了绝对的上风。这其中,也有值得人们思考的东西,或许,技术并不是决定性的东西吧。

Oracle、DB2、Sybase等数据库厂商的头头,如果看到MySQL首页上的这些图标,不知道会作何感想?

几条有用的MySQL命令

建库时指定编码:
CREATE DATABASE dbname DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

赋予用户权限:
GRANT ALL PRIVILEGES ON dbname.* TO dbuser@localhost IDENTIFIED BY "dbpass";

错误“ERROR 1251: Client does not support authentication protocol requested by server; consider upgrading MySQL client.”的对策:
SET PASSWORD FOR dbuser@"localhost"=OLD_PASSWORD('yourPassword');

日文环境下MySQL的编码设置

,

假如有以下需求:

数据库服务器方默认编码为utf8,
客户端默认编码为Shift_JIS,
导出数据编码和服务器默认编码相同

只需在my.cnf 中作如下设置:
[mysql]
default-character-set = sjis

[mysqld]
default-character-set = utf8
init_connect="SET NAMES sjis"

[mysqldump]
default-character-set = binary

补充:
如果需要对应EUC_JP编码,只需设置成ujis 。
November 2009
S M T W T F S
October 2009December 2009
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30