一、前言
最近在刚完成了pw版本的升级程序,拿了个拥有3万多用户的小站跑了下,结果一次503的time out错误,最后修修补补跑完之后发现用了将近1个小时。于是将运行最慢的几个模块分析了下SQL语句。记录下。
二、环境描述
数据库:mysql,原数据和目标数据同一个服务。
操作系统:本地的ubuntu12.10
描述:原PW87:用户数据量3.4W,2.1W帖子数据,7.9W回复数据,3.1W原私信数据,数据库使用的引擎是myisam,
新pw9的数据库采用innodb引擎
二、sql记录分析
监听到一条用户数据查询如下:
select * from pw_members order by uid limit 10000, 1000;
用explain分析得到如下:
myiasm引擎:
mysql> explain select * from pw_members order by uid limit 10000, 1000;
+----+-------------+------------+------+---------------+------+---------+------+-------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+-------+----------------+
| 1 | SIMPLE | pw_members | ALL | NULL | NULL | NULL | NULL | 34730 | Using filesort |
+----+-------------+------------+------+---------------+------+---------+------+-------+----------------+
1 row in set (0.00 sec)
innodb引擎:
mysql> explain select * from nw_user order by uid limit 10000, 1000;
+----+-------------+---------+-------+---------------+---------+---------+------+-------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+---------+---------+------+-------+-------+
| 1 | SIMPLE | nw_user | index | NULL | PRIMARY | 4 | NULL | 11000 | |
+----+-------------+---------+-------+---------------+---------+---------+------+-------+-------+
1 row in set (0.01 sec)
两表使用都对uid建立唯一索引,
换种写法:
SELECT uid FROM pw_members WHERE uid > 10000 ORDER BY uid LIMIT 1000;
myisam引擎:
mysql> explain SELECT uid FROM pw_members WHERE uid > 10000 ORDER BY uid LIMIT 1000;+----+-------------+------------+-------+---------------+---------+---------+------+-------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+-------+---------------+---------+---------+------+-------+--------------------------+
| 1 | SIMPLE | pw_members | range | PRIMARY | PRIMARY | 4 | NULL | 26074 | Using where; Using index |
+----+-------------+------------+-------+---------------+---------+---------+------+-------+--------------------------+
innodb引擎:
mysql> explain select * from nw_user where uid > 10000 order by uid limit 10000, 1000;
+----+-------------+---------+-------+---------------+---------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+---------+---------+------+-------+-------------+
| 1 | SIMPLE | nw_user | range | PRIMARY | PRIMARY | 4 | NULL | 17461 | Using where |
+----+-------------+---------+-------+---------------+---------+---------+------+-------+-------------+
我的结论:
横向相比,对于第一种写法,innodb处理的方式会比myisam优雅点,而第二种写法则差不多。
纵向相比,则第二种写法处理起来无论在innodb或是myisam都比第一种写法优雅。
注:这次的数据量确实不大,所以得出这个结论也许有些站不住脚,等我遇到更大数据量的时候再来回头看看这个结论如何。
于是我将从myisam有主键的处理查询都改为第二种形式,从innodb处理的则根据情况处理。
三、
第一次处理这种数据转移,没有什么经验,也正在摸索阶段,希望各位大大么多多留言哈
本文链接
阅读原文:http://www.yzswyl.cn/blread-1601.html
今天群里有个朋友在问“private function __construct() {}”这样能防止直接new对象吗?于是呢我也去网上找了篇详细的资料来分析下,感觉讲的还是蛮不错的,推荐给大家:
单例模式要解决的问题就是“如何让这个类只有一个实例”。
我们的web应用中,大量使用了数据库连接,如果反复建立与数据库的连接必然消耗更多的系统资源。
我们如何解决这个问题,建立唯一的数据库连接是必要的方式。
我们又如何知道与这个数据库的连接是否已经建立? 还是需要现在建立?
单例模式可以解决这个问题。
先假设我们需要一个类完成在内存中只有一份的功能,我们该如何做呢?
我们一步一步的使用前面学过的知识来写一个单例的例子。
前面学过,每次用 new 类名 的方式,就可以创建一个对象。我们必须禁止外部程序用 new 类名的方式来创建多个实例。
解决办法是:我们将构造函数设置成 private ,让构造函数只能在内部被调用,而外部不能调用。这样,这个类就不能被外部用 new 的方式建立多个实例了。
以下是不能被外部用new实例化的类。
程序运行结果为:
我们已经禁止外部用new实例化这个类,我们改如何让用户访问这个类呢?前门堵了,我们需要给用户留个后门。
解决办法是:static 修饰的方法,可以不经实例化一个类就可以直接访问这个方法。
程序运行结果为:
我们已经通过static方法返回了A的实例。但还有问题。我们如何保证我们多次操作获得的是同一个实例的呢?
解决办法:static的属性在内部也只有一个。static 属性能有效的被静态方法调用。将这个属性也设置成private,以防止外部调用。先将这个属性设置成 null。每次返回对象前,先判断这个属性是否为 null 。如果为 null 就创建这个类的新实例,并赋值给这个 static 属性。如果不为空,就返回这个指向实例的 static 属性。
今天老大让在xp下搭建一个FTP服务器,一波三折,最后终于在老大的帮助下搞定了。。。
其中通过ip访问的时候 提示 Forbidden You don't have permission to access / on this server.
找到一个解决方法,特此记录
php的配置文件httpd.conf。
在原有的位置文件中找到配置节
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Satisfy all
</Directory>
修改成
Options FollowSymLinks
AllowOverride None
Order deny,allow
# Deny from all
Allow from all
#允许所有访问
Satisfy all
</Directory>
还有
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride all
#
# Controls who can get stuff from this server.
#
# onlineoffline tag - don't remove
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Directory>
修改成
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride all
#
# Controls who can get stuff from this server.
#
# onlineoffline tag - don't remove
Order Deny,Allow
# Deny from all
# Allow from 127.0.0.1
Allow from all
</Directory>
然后保存,重启服务,在访问就解决了这个问题。
本文链接