mysql limit查询优化

MYSQL的优化是非常重要的。其他最常用也最需要优化的就是limit。mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。 

同样是取10条数据

select * from yanxue8_visit limit 10000,10 和
select * from yanxue8_visit limit 0,10
就不是一个数量级别的。

网上也很多关于limit的五条优化准则,都是翻译自mysql手册,虽然正确但不实用。今天发现一篇文章写了些关于limit优化的,很不错。

文中不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据。根据他的数据,明显要好于直接使用limit。这里我具体使用数据分两种情况进行测试。(测试环境win2033+p4双核 (3GHZ) +4G内存 mysql 5.0.19)

1、offset比较小的时候。

select * from yanxue8_visit limit 10,10

多次运行,时间保持在0.0004-0.0005之间
Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10,1
) limit 10

多次运行,时间保持在0.0005-0.0006之间,主要是0.0006
结论:偏移offset较小的时候,直接使用limit较优。这个显然是子查询的原因。

2、offset大的时候。
select * from yanxue8_visit limit 10000,10

多次运行,时间保持在0.0187左右
Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10000,1
) limit 10

多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。

以后要注意改正自己的limit语句,优化一下mysql了.

注意这里的条件是没有where条件的情况下,对于有where条件的情况下请参考另一篇文章:http://blog.haohtml.com/archives/3747

dreamweaver在onLoad运行RecordsetFind.htm时出错的解决办法

今天单位的Dreamweaver出错了,折腾了半天,重新装了8.02,出现下面的错误:
在onLoad运行RecordsetFind.htm时,发生了以下JavaScript错误:
在文件””RecordsetFind””:
ReferenceError:findRs is not defined

卸载掉了,删除安装目录下的文件夹,清除注册表相应的项目,重装,问题依旧,郁闷!
再次卸载,装老版的DW 2004, 也出现部分菜单打不开,点击就不停的抱错,汗!再次装8.02,还是不成,网上也搜不到任何解决方法。无意中删除C:Documents and SettingsAdministratorApplication DataMacromedia把Dreamweaver 8 这个文件夹,另外清寒要删除”Common”这个文件夹,重新打开dw ,居然ok了,呵呵,果真是天无绝人之路!

用YSlow分析我们页面

YSlow是yahoo美国开发的一个页面评分插件,非常的棒,从中我们可以看出我们页面上的很多不足,并且可以知道我们改怎么却改进和优化。

仔细研究了下YSlow跌评分规则。

主要有12条:

1. Make fewer HTTP requests 尽可能少的http请求。。我们有141个请求(其中15个JS请求,3个CSS请求,47个CSS background images请求),多的可怕。思考了下,为什么把这个三种请求过多列为对页面加载的重要不利因素呢,而过多的IMG请求并没有列为不利因素呢?

发现原来这些请求都是可以避免的。

15个JS和3个CSS完全可以通过特殊的办法进行合并(这个技术部已经帮我们解决了,实在是太感谢了,嘿嘿。),这样合并以后,一般情况下页面上只会出现一个JS和一个CSS(对JS的封装得有一定的要求)。

但是47个CSS background images请求改怎么解决呢?为什么页面上的纯IMG请求时合理的,而CSS background images请求过多就是不利因素了呢。这个我想了很久,总算明白,原来是这样的:

一般页面上的ICON,栏目背景啊, 图片按钮啊,我们都会用图片CSS背景来实现,而一般这个图片CSS背景用到的图片都是比较小的,所以完全可以把这些图片合并成一个相对比较大的图片,这 样页面上只会出现一个CSS background images请求,最多也就2-3个。后来仔细看了下雅虎美国的页面,他们的确也是这样做的,虽然这样做需要花一定的时间来有规则的合并这些ICON,栏 目背景,图片按钮,以方便CSS调用,但是这样做绝对是合算的,而且是有必要的,YSlow也是极力推荐的。

2.Use a CDN 这 项我们的评分是F级,最低。说实在的,我刚开始什么是CDN都不知道。后来查了GOODLE才知道。CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络”边缘”,使用户可 以就近取得所需的内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均 等原因所造成的用户访问网站响应速度慢的问题。

看来上述的解释后,基本上明白了 CDN是怎么回事,后来咨询了下中文站点SA,得知我们网站目前的确还没有做CDN的优化,但是据说我们有更加先进的技术来解决类似的问题(具体什么技术 那就保密了),但是毕竟CDN也是个相当不错的技术,所以在我们先进技术的基础上在做CDN优化,肯定比现在更好,嘿嘿。据说SA明年会做几个点的 CND。

3. Add an Expires header置过期的HTTP Header.设置Expires Header可以将脚本, 样式表, 图片, Flash等缓存在浏览器的Cache中.

其实我们网站也做了这个优化,至少图 片在这个上做过优化,但是没有做完全。我们的CSS和JS都还没有做过优化,倒是外部引入的一个广告JS做了,呵呵。其实设置过期的HTTP Header 更应该做在脚本, 样式表, Flash上.不过据说这个SA也是没有做的,但是有一定的风险,因为JS和CSS是有一定的逻辑,如果服务器端和客户端都存在缓存的话,万一出了什么问 题,对我们以后查找问题的所在和增加难度,不过我想两者中是可以权衡和并存的。

4. Gzip components 对 我们的页面内容进行Gzip格式的压缩,Gzip格式是一种很普遍的压缩技术,几乎所有的浏览器都有解压Gzip格式的能力,而且它可以压缩的比例非常 大,一般压缩率为85%,就是说服务器端100K的页面可以压缩到25K左右的Gzip格式的数据发给客户端,客户端收到Gzip格式的数据后自动解压缩 后显示页面。

这点我们网站基本上是100%做到了,但是我们这项的评分并没有达到想象中的A级,原因是出在我们的外部链接,比如我们首页,有外部的广告投放JS,这个JS说拥有的网站是没有做过GZIP优化,连累了我们网站,所以我们也只有B,或者C级。

5. Put CSS at the top 把CSS外部链接放到页面的顶部。

其实这个原则我们一般都遵守的,如果 把CSS外部链接作为逻辑的一部分出现在页面头部以下,我个人觉得这个本身就是个错误。还好,我们的页面基本上都做到了,可是有些页面比如LIST页面, 还是出现了和逻辑挂钩的CSS链接,原因是为了解决一些本来就不合理的产品逻辑。所以,我们WEB前端工程师有义务杜绝这些不合理的产品逻辑破坏我们的页 面结果及页面加载速度,不能为了实现而实现。 Continue reading

apache ab压力测试

以前安装好APACHE总是不知道该如何测试APACHE的性能,现在总算找到一个测试工具了。就是APACHE自带的测试工具AB(apache benchmark).在APACHE的bin目录下。
格式:

./ab [options] [http://]hostname[:port]/path

参数:
-n requests     Number of requests to perform
//在测试会话中所执行的请求个数。默认时,仅执行一个请求
-c concurrency Number of multiple requests to make
//一次产生的请求个数。默认是一次一个(测试次数=n/c,所以此值要小于上面参数n的值)。
-t timelimit    Seconds to max. wait for responses
//测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
-p postfile     File containing data to POST
//包含了需要POST的数据的文件.
-T content-type Content-type header for POSTing
//POST数据所使用的Content-type头信息。
-v verbosity    How much troubleshooting info to print
//设置显示信息的详细程度 – 4或更大值会显示头信息, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。 -V 显示版本号并退出。
-w              Print out results in HTML tables
//以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。
-i              Use HEAD instead of GET
// 执行HEAD请求,而不是GET。
-x attributes   String to insert as table attributes
//
-y attributes   String to insert as tr attributes
//
-z attributes   String to insert as td or th attributes
//
-C attribute    Add cookie, eg. ‘Apache=1234. (repeatable)
//-C cookie-name=value 对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。此参数可以重复。
-H attribute    Add Arbitrary header line, eg. ‘Accept-Encoding: gzip’
Inserted after all normal header lines. (repeatable)
-A attribute    Add Basic WWW Authentication, the attributes
are a colon separated username and password.
-P attribute    Add Basic Proxy Authentication, the attributes
are a colon separated username and password.
//-P proxy-auth-username:password 对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。
-X proxy:port   Proxyserver and port number to use
-V              Print version number and exit
-k              Use HTTP KeepAlive feature
-d              Do not show percentiles served table.
-S              Do not show confidence estimators and warnings.
-g filename     Output collected data to gnuplot format file.
-e filename     Output CSV file with percentages served
-h              Display usage information (this message)
//-attributes 设置 属性的字符串. 缺陷程序中有各种静态声明的固定长度的缓冲区。另外,对命令行参数、服务器的响应头和其他外部输入的解析也很简单,这可能会有不良后果。它没有完整地实现HTTP/1.x; 仅接受某些’预想’的响应格式。 strstr(3)的频繁使用可能会带来性能问题,即, 你可能是在测试ab而不是服务器的性能。

参数很多,一般我们用 -c 和 -n 参数就可以了.(实例请见这里) 例如:

./ab -c 1000 -n 1000 http://127.0.0.1/index.php

这个表示同时处理1000个请求并运行1000次index.php文件.
#/usr/local/xiaobai/apache2054/bin/ab -c 1000 -n 1000 http://127.0.0.1/index.html.zh-cn.gb2312
This is ApacheBench, Version 2.0.41-dev <$Revision: 1.121.2.12 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests
Server Software:        Apache/2.0.54
//平台apache 版本2.0.54
Server Hostname:        127.0.0.1
//服务器主机名
Server Port:            80
//服务器端口

Document Path:          /index.html.zh-cn.gb2312
//测试的页面文档
Document Length:        1018 bytes
//文档大小

Concurrency Level:      1000
//并发数
Time taken for tests:   8.188731 seconds
//整个测试持续的时间
Complete requests:      1000
//完成的请求数量
Failed requests:        0
//失败的请求数量
Write errors:           0

Total transferred:      1361581 bytes
//整个场景中的网络传输量
HTML transferred:       1055666 bytes
//整个场景中的HTML内容传输量
Requests per second:    122.12 [#/sec] (mean)
//大家最关心的指标之一,相当于 LR 中的 每秒事务数 ,后面括号中的 mean 表示这是一个平均值
Time per request:       8188.731 [ms] (mean)
//大家最关心的指标之二,相当于 LR 中的 平均事务响应时间 ,后面括号中的 mean 表示这是一个平均值
Time per request:       8.189 [ms] (mean, across all concurrent requests)
//每个请求实际运行时间的平均值
Transfer rate:          162.30 [Kbytes/sec] received
//平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题

Connection Times (ms)
min mean[+/-sd] median   max
Connect:        4 646 1078.7     89    3291
Processing:   165 992 493.1    938    4712
Waiting:      118 934 480.6    882    4554
Total:        813 1638 1338.9   1093    7785
//网络上消耗的时间的分解,各项数据的具体算法还不是很清楚

Percentage of the requests served within a certain time (ms)
50%   1093
66%   1247
75%   1373
80%   1493
90%   4061
95%   4398
98%   5608
99%   7368
100%   7785 (longest request)
//整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中50%的用户响应时间小于1093 毫秒,60% 的用户响应时间小于1247 毫秒,最大的响应时间小于7785 毫秒

由于对于并发请求,cpu实际上并不是同时处理的,而是按照每个请求获得的时间片逐个轮转处理的,所以基本上第一个Time per request时间约等于第二个Time per request时间乘以并发请求数

Apache实现图片防盗链

Apache实现图片防盗链以及,显示一张“禁止盗链”的图片,我们可以用mod_rewrite 来实现。

假设充许连结图片的主机域名为:tech.ddvip.com

修改httpd.conf

SetEnvIfNoCase Referer “^” local_ref=1

<FilesMatch “.(gif|jpg)”>

Order Allow,Deny

Allow from env=local_ref

</FilesMatch>

这个简单的应用不光可以解决图片盗链的问题,稍加修改还可以防止任意文件盗链下载的问题。

使用以上的方法当从非指定的主机连结图片时,图片将无法显示。 Continue reading

Apache的目录安全措施

Apache Server 允许使用 .htaccess 做目录安全保护,欲读取这保护的目录需要先键入正确用户帐号与密码。 

可做为系统管理者的专用管理网页存放的目录或做为专区,例如教师专区或行政专区使用。 

方法为:在你要保护的目录放置一个档案,档名为.htaccss
内容为: 

AuthName “行政专区”
AuthType “Basic”
AuthUserFile “/var/tmp/xxx.pw” (把密码档放在网站外)
(一定要大写)
require valid-user 

到apache/bin目录,开始建密码档 

% ./htpasswd -c /var/tmp/xxx.pw username1
(输入两次密码,第一次建档要用参数-c 

% ./htpasswd /var/tmp/xxx.pw username2
(输入两次密码) 

如此一来,当要连结置於此保护目录内的网页时,就非得要是合法用户不可了.此法简单,保护能力极强,是Apache内附的模组,应善加使用。
如果你们想修改密码,可以如下 

htpasswd -m .htpasswd webadmin 

第5步: 

ok,重启apache服务,然后访问 http://你的网站地址/test 如果顺利的话,应该能看到一个用户验证的弹出窗口,只要填入第4步创建的用户名和密码就行 

后话,为了服务器的性能,一般不推荐使用AllowOverride AuthConfig或者AllowOverride ALL,因为这会使服务器会不断的去寻找.htaccess,从而影响服务器的效能,一般我们把一些后台管理界面或者其他特殊目录可能需要加验证这个需求。

如果要对AuthUserFile中的用户再进行筛选,比如有两个用户 webadmin
Paul,则要在.htaccess加上
AuthGroupFile /usr/local/apache/htdocs/phpmyadmin/.htgroup
Require group admin
其中.htgroup为用户组的文件名,文件内容格式为
admin:webadmin
Require group admin的意思是当用户属于admin组的时候才允许访问
(http://www.fanqiang.com)

安装awstats来分析apache的访问日志

AWStats: Advanced Web Statistics

AWStats是在Sourceforge上发展很快的一个基于Perl的WEB日志分析工具。相对于另外一个非常优秀的开放源代码的日志分析工具Webalizer,AWStats的优势在于:

  1. 界面友好:可以根据浏览器直接调用相应语言界面(有简体中文版)
  2. 基于Perl:并且很好的解决了跨平台问题,系统本身可以运行在GNU/Linux上或Windows上(安装了ActivePerl后);分析的日志直接支持Apache格式 (combined)和IIS格式(需要修改)。Webalizer虽然也有Windows平台版,但目前已经缺乏维护; Continue reading

Apache配置文件里各种权限的含义

/etc/apache/httpd.conf :

ServerRoot “/usr”
#因为安装到/usr下,所以ServerRoot是/usr。在以下配置中,以相对路径写的就是对于相对/usr
PidFile /var/run/httpd.pid
#httpd启动时的pid存放位置,用于start/stop apache
Timeout 300
#连接超时时间
KeepAlive On
#允许持续连接,一个连接多个请求.
MaxKeepAliveRequests 200
#持续连接中最大连接数,推荐大一些获得最佳性能
KeepAliveTimeout 15
#Client 在15秒内没有下次请求则断线
MinSpareServers      5
MaxSpareServers      10
httpd服务进程的数量,ps aux 可以看到
MaxClients         150
最大连接人数
Listen 80
#监听端口
#ExtendedStatus On
#使用/server-status查询服务器状态时给予完全信息(ON)或基本信息(OFF) 默认为OFF
User apache
Group apache
#httpd进程的user,group
ServerAdmin BlueSilence.xin@gmail.com
#admin的E-mail
ServerName 127.0.0.1
#服务器名称,需要是合法的DNS NAME 或者设置成IP

DocumentRoot “/srv/www/htdocs”
#主页存放目录
UserDir public_html
#每个用户的主页目录 (例如:/home/blue/public_html)
DirectoryIndex index.php index.html index.html.var
#当输入http://localhost 就会在主页根目录下搜索以上几个文件名做为首页显示
HostnameLookups Off
#记录log时,Client以主机名(On)或以IP(Off)记录,以IP记录更快些.
ErrorLog /var/log/apache/error_log
#错误日志位置
LogLevel warn
#日志记录等级,由信息多->少记录等级:debug, info, notice, warn, error, crit,alert,emerg
CustomLog /var/log/apache/access_log common
#访问日志位置
ServerTokens Prod
#当client访问到不存在的网页时提供信息的多少。少点好些 🙂
#由多–>少 :Full | OS | Minor | Minimal | Major | Prod
LanguagePriority zh-CN en ca cs da de ……….
#语言优先级
ErrorDocument 404 /missing.html
#错误网页处理,当出现404(找不到该页)则会显示/missing.html

目录设定:
设定根目录属性:

    Options FollowSymLinks
    AllowOverride None

Options 属性:
Indexes         当该目录下没有index.*时则以ftp-style列出该目录下所有文件
Includes        Allow server-wide includes
FollowSymLinks 当该目录下软连接的文件/目录链接到外部目录时,仍然可以正常显示。
MultiViews     由一个*.var管理同一网页的多种语言版本,如apache默认主页多种语言的index.html
ExecCGI         允许执行CGI程序
ALL             开启除MultiViews之外的属性
None            禁止所有属性

AllowOverride 是否允许使用.htaccess覆盖某些设定(All None FileInfo AuthConfig Limit)

设定/srv/www/htdocs/ 目录(根目录)属性:

Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
    Allow from all

Order allow,deny : 控制访问权限
Order deny,allow
deny from test.org 拒绝test.org访问
deny from 192.168.0.100 拒绝192.168.0.100访问
allow from 192.168.0.1 允许192.168.0.1 访问

Alias /icons/ “/srv/www/icons/”  
语法: Alias fakename realname
设置目录的别名,这样当输入http://localhost/icons/ 就可以访问到/srv/www/icons/
注意icons结尾的”/” 应在fakename realname 成对出现,要么全有,要么全没有.
有”/”时需要输入http://localhost/icons/ 才可以正常访问

ScriptAlias /cgi-bin/ “/srv/www/cgi-bin/”
设置可执行程序别名,与Alias类似。
当Client请求Alias realname时,server直接以document形式传送Client
而ScroptAlias则是server执行realname的script程序后将结果传送给Client

服务器的状态,信息:
通过http://localhost/server-status 访问

    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1

通过http://localhost/server-info 访问

    SetHandler server-info
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1

.cgi .pl程序可执行的三种方法:
1:使用ScriptAlias,httpd.conf中加入:
ScriptAlias /my-cgi/ “/srv/www/cgi”
这样就可以以http://localhost/my-cgi/xxx.cgi xxx.pl执行/srv/www/cgi/下的.cgi,.pl程序了。

2: 使用sethandler cgi-scripts,httpd.conf中加入:
Alias /my-cgi/ “/srv/www/cgi”

   Options ExecCGI
   Sethandler cgi-script

3:使用Options的ExecCGI属性 :
将httpd.conf中的AddHandler cgi-script .cgi .pl 注释拿掉,加上.pl
给予/srv/www/cgi/ 执行CGI权限:
Alias /my-cgi/ “/srv/www/cgi”

   Options ExecCGI
   Allowoverride none
   Order allow,deny
   allow from all

认证网页:

   Options FollowSymlinks Indexes ExecCGI
   AllowOverride None
   Order Allow,Deny
   Allow From all
   AuthName “private directory ”
   AuthType Basic
   AuthUserFile /etc/apace/apache.passwd
   Require valid-user

AuthNmae :      认证窗口上的标题
AuthType :      认证类型,apache有几种认证方式,Basic为最基本的。
AuthUserFIle : 认证密码存放位置
Require : 认证档案中允许使用的用户
valid-user :   认证档案中所有的用户都可以使用通过认证进入该目录
如只想允许某个用户则使用 Require user username1 username2

建立认证密码文件:
#cd /etc/apache/
#htpasswd -c apache.passwd blue
New password:
Re-type new password:
Adding password for user blue
#
-c : 如果没有apache.passwd则创建它
增加认证用户:
#htpasswd apache.passwd silence
….
#apachectl restart
#firefox http://localhost/my-cgi/
要求密码才可以进入喽 🙂

.htaccess 和 allowoverride :

.htaccess : 取代httpd.conf中对.htaccess所在目录的设定。
AllowOverride :允许覆盖设定的类型(All None FileInfo AuthConfig Limit)

设定每个用户都可以建立自己的认证网页:

1.确定httpd.conf中AccessFileName .htaccess 没有被注释掉
2.编辑httpd.conf加入AllowOverride AuthConfig,允许每个用户通过.htaccess建立自己的认证网页

   AllowOverride AuthConfig
    Order Allow,Deny
     Allow from all

3.用户建立认证目录,编写.htaccess :
mkdir private
cd private/
echo ” private page ” >test.html
vi .htaccess
AuthName “private”
AuthType basic
AuthUserFIle /home/blue/blue.passwd
Require valid-user
建立密码文件:
htpasswd -c blue.passwd blue
……
firefox http://localhost/~blue/private/test.html

配置apache服务器支持shtml

服务器采用shtml速度会比html慢,比php快。

shtml的特点就是能够进行页面包含,能够局部更新页面包含部分。广泛采用可以很容易解决网页中的广告问题,不需要更新全面静态页面。而只需更新一个包含页面即可。

apache下配置服务器支持shtml

打开文件:httpd.conf

去掉前面的 #LoadModule include_module modules/mod_include.so

<Directory “D:/PC_webserver/phproot”>
Options Indexes FollowSymLinks Includes
AllowOverride Options FileInfo
Order allow,deny
Allow from all

</Directory>

找到下面两句,去掉前面的#

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

重启apache即可。

建立页面:

测试 <!–#include file=”data/save/1.html”–>

file为相对于当前文档的路径。

<!–#include virtual=”/phpcms5/data/save/1.html”–>

virtual为相对于虚拟目录的路径。
如果需要让所有的html文件支持shtml.只需要修改上面一句。

AddOutputFilter INCLUDES .html