不一样的世界
百度空间 | 百度首页 
 
广而告之
 
 
     
 
文章列表
 
2009年11月09日 星期一 12:27

“开网店,做电子商务”这成为了今年的流行语。据公布的调查结果显示截止2009年6月份,国内使用第三方电子商务平台的中小企业用户规模已突破1000万,网购用户规模突破1亿人。做电子商务必定离不开网店的建设,随着企业的电子商务热的兴起,用于搭建网店的软件也是猛增,据不完全统计,目前国内网店系统软件就有百余种之多,而提供网店软件技术与服务的正规公司也有数十家。面对如此多的提供商,企业难以抉择。通过技术水准、价格、资源整合、客户服务、市场占有率等方面对这几十家提供商进行的全面比对和深入分析后,目前国内做得最好的也就ecshop、Hishop、shopex、这三款网店系统。在此,笔者将着重介绍这三款,以便企业更好的进行选择。

一、Hishop网店系统

网站:http://www.92hi.com

简介:Hishop始于2002年,属长沙海商网络技术有限公司旗下产品,行业内的老品牌;网店系统基于asp.net平台开发,系统在安全性、稳定性、易用性方面极具良好的声誉,专注于网店系统软件产品及相关增值服务提供已近七年服务过12万余用户。是国内最早开创货源分销及渠道代理加盟的网店业务模式,也是国内最早专注于为货源网商,提供相关货源分销网店系统软件及相关增值服务产品的网店服务提供商。

亮点:后台操作简单、界面简洁。独创的货源代理分销模式,一键开通代理网店、代理网店商品的数据与订单能与主站同步更新;货源代销,网店批发,渠道连锁加盟三种分销业务模块可根据情况灵活运用;系统拥有强大的网店促销模块,包含了商品团购、捆 绑销售、积分换购销等众多促销功能,通过合理的组合使用,能帮助商家更好的提高消费者的忠诚度,有效发展新用户,从而带来订单数量的提升。嵌入seo功能,可以帮助网店被收索引擎收录;可根据客户的需求对功能与模板做定制。

价位:目前系统提供免费下载使用,无时间与功能上的限制,未授权;网店货源代理分销系统套餐1999元—6999元,网店零售直销系统套餐1588—128000元,商业授权300元/年、去版权300元/年,价位适中。

不足:免费模板的更新频率还有提高余地,虽然比起以前现在的免费模板更新快多了,不过还需努力。

二、Shopex网店系统

网站:http://www.shopex.cn

简介:shopex始于2002年,国内最早的网店软件提供商之一;属上海商派网络科技有限公司旗下产品。产品种类较多,除网店系统外,还拥有网罗天下、网店小信使等产品服务。系统采用php语言开发。是国内研发时间最早的PHP网店系统软件提供商,具有7年的网店系统开发经验、系统运行安全、稳定。

亮点:系统在SEO方面做得很不错,业内领先的SEO经验均会在系统中得到体现,能有效的帮助网店商品被搜索引擎收录。模板数量多,内置的模板编辑器自由编辑模板,随心所欲修改内置模板。可根据客户需要定制系统功能与模板。也推出了用于分销的产品—分销王。

价位:目前系统提供体验免费,商业授权200元/年、绿色保障2180元-110000元之间,价格较贵。

不足:从网商口碑和市场反馈来看,shopex在服务方面需要加强;近来常有客户因不满售后的服务态度而进行公开投诉的事件,作为服务性的公司,此类事件还是需要尽力杜绝的。

三、Ecshop网店系统

网站:http://www.ecshop.com/

简介:Ecshop是国内最早开源的网店系统产品,适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。曾经是shopex有力的竞争对手之一,2008年被商派网络收购。收购后无论是产品开发或者媒体宣传都归于平淡。

亮点:系统采用php开源,能够自定义商城特色,系统操作简单。站内商品搜索引擎功能完善,结合独有的商品属性可搜索功能,能让买家在店里轻松找到所需商品。通过优化代码与数据库结构,配合ecshop独家设计的缓存机制,在不考虑网速的情况下,网店动态页面与纯静态页面访问速度相当。支持两种 URL 重写方式,并且是同类软件中第一家支持 google / yahoo / microsoft 三家共同发布的 sitemaps 0.9 网站索引规范,能够为站点被搜索引擎收录做到最大限度的支持和帮助。

价格:完全免费

不足:因为是开源,因此系统在安全方面存在一定的隐患,这也是开源的一个致命的弱点。

 
2009年11月09日 星期一 11:58

网站,特别是做网站的时候要考虑到能给用户带来什么信息,你做网站的目的。


  如今互联网行业日益发展,想在茫茫网页中搜索到自己的网页可谓芸芸众生,但是,只要了解搜索引擎,怎么样使自己的和别人收的词语放在前面,流量自然而然的就上去了。我先说说怎么做:
    1.要编排网站的内容、目录和文件结构。一个结构清楚的网站在GOOGLE里收录效果很好。这里讲的是网站结构,良好的网站结构可以让搜索引擎对你的站点喜爱有加。整站优化,可以去看整站优化教程。

  2.每个文件都要有一个和内容相关的标题。就是内容,内容是最重要的,一定要深知内容是一个网站的灵魂,没有了内容,躯体在硬朗也只是别人玩弄手掌中。
  
 3.在做一个页面时考虑好用什么关键词。长尾关键词,一个页面就是一个网页,而不是仅仅的一篇文章,一篇文章有标题,我说的是网页,网页中必须把标题体现出来,让搜索引擎知道这篇网页是什么,网页的关键词一定要在页面出现。

  4.内链也重要,文章中的链接是用户寻找下篇文章的重要。一个网页中的链接一定要能带领蜘蛛逛完你整个网站。系统化。

  5.静态页面,这个都知道,路径一定要明确。

  6.多做宣传,可以多交换链接,增加外部的链接。(广泛+质量)
  7.网站要有实际的内容,真正做到用心做网,能让浏览的人感觉网站确实有用,这个搜索引擎也会知道你的网有用。必竟搜索引擎的技术发展是以人为本的。

  8.不要试图用作弊的手段欺骗搜索引擎,这样也许得不偿失。

  9.使用好在页头中的标签,这个挺有效果。也是最重要的。

 
2009年11月09日 星期一 11:54
Metabase.xml文件是IIS的设置文件,每个网站已经IIS的设置都在这个下面,所以在修改这个文件之前要把这个文件备份一下。这个文件在C:\WINDOWS\system32\inetsrv\Metabase.xml,前篇的启用IIS的静态压缩也可以在文件下设置,也可以在IIS的图形界面下设置。
      对IIS的性能优化要对症下药,对不同的网站有不同的优化方法,在分析你网站的特点的情况下,然后对Metabase.xml文件里面的参数进行调节,提高IIS的性能。
      AppAllowDebugging
      作用:指定在服务器上是否启用 Active Server Page (ASP) 调试。在启用此属性的情况下,IIS 应用程序线程是序列化的;对于每个应用程序,一次只允许执行一个线程。序列化线程会对 Web 服务器性能产生负面影响。建议您在所有产品服务器上将此属性设置为 false。
      注意:当允许进行服务器端调试时,将串行化 IIS 应用程序线程:对于每个应用程序,同一时间只允许运行一个线程。这会影响繁忙站点的服务器性能。
      AspBufferingOn
      作用:该属性指定 ASP 应用程序的输出是否需要缓冲。如果将该值设置为 true,在缓冲区刷新到客户端浏览器之前,应用程序的所有输出都集中到缓冲区里。启用了缓冲,ASP 应用程序就必须在客户端浏览器收到任何输出前处理完所有的 ASP 脚本。因此,启用了缓冲的应用程序比没有启用缓冲的似乎要慢一些,尽管启用缓冲的脚本所用的总时间更少。所以,如果启用了缓冲,那么请考虑使用 ASP 内置的 Response 对象的 Flush 方法在处理脚本的同时将内容一份份的传递给用户。
      注意如果将该属性设置为 false,那么 ASP 脚本的输出一旦可用就会输出到客户端浏览器。如果没有启用缓冲,那么所有修改现有的 HTTP 头或生成新头的方法必须在内容的主体传送到客户端浏览器之前执行。如果启用了缓冲,这个限制就没有必要了。建议您在所有产品服务器上将此属性设置为 true。
      AspQueueConnectionTestTime
      作用:IIS 将所有的 ASP 请求放置到队列中。如果请求在队列中等待的时间比 AspQueueConnectionTestTime 属性指定的时间(以秒为单位)长,则 ASP 将在执行请求前检查确定客户端是否仍是连接的。如果客户端已断开连接,则不处理该请求并且从队列中删除该请求。
      注意:多数情况下,用户不会等待处理 ASP 页面超过几秒的时间。虽然最长等待时间随用户不同而不同,但通常可接受的最长时间是大约 10 秒。可以使用 AspQueueConnectionTestTime 属性来确保 IIS 不浪费时间来处理已被用户放弃的请求。当处于 ASP 将要开始处理脚本的状态时,该属性对于使 ASP 进行有效处理非常有用。一旦脚本在运行,应用程序仍然应该继续使用 ASP 内置 Response 对象的 IsClientConnected 方法在合适的时候对客户端连接进行检查。
      AspRequestQueueMax
      作用:该属性指定了允许进入队列的并发 ASP 请求的最大数目。在队列占满时,任何试图请求 ASP 文件的客户端浏览器都将收到 HTTP 500"服务器太忙"的错误。
      注意:在 IIsWebService 级别上设置该属性可运用于所有级别上的所有进程内的和共用的进程外应用程序项。进程内的和共用的进程外应用程序忽略 IIsWebServer 级别及更低级别上的配置数据库设置。但是,如果该项是进程外的隔离应用程序,则使用 IIsWebServer 级别或更低级别的设置。
      AspScriptEngineCacheMax
      作用:该属性指定了 ASP 页面将在内存中保持缓存的脚本引擎的最大数目。根据应用程序中的内容的类型调整默认值。(默认值不包括当前正在运行的脚本引擎)如果有成千上万的不同页,您会体验到提高缓存大小的一些好处:大多数频繁请求的页都可以轻松地访问到。脚本引擎缓存的好处意味着您可以无需将模板重新编译为字节代码。
      AspScriptFileCacheSize
      作用:该属性指定了要缓存的预编译脚本文件数。如果设置为 0,则不缓存任何脚本文件。如果设置为 4294967295,则缓存所有脚本文件。该属性用于调整性能,依赖于可用内存数和脚本文件传输量。
      注意:配置数据库将无穷大表示为 DWORD 值 4294967295 (0xFFFFFFFF);VBScript 则将无穷大表示为十六进制值 &HFFFFFFFF。以前的 IIS 版本将无穷大表示为 -1。
      AspSessionMax
      作用:属性指定了 IIS 允许的最大并发会话数。当达到该限制时,如果客户端试图与 IIS 建立新连接,则客户端将接收到错误信息(HTTP 500"服务器太忙")。
      注意:配置数据库将无穷大表示为 DWORD 值 4294967295 (0xFFFFFFFF);VBScript 则将无穷大表示为十六进制值 &HFFFFFFFF。以前的 IIS 版本将无穷大表示为 -1。ASP 需要超过保留所有会话所需数量一定量的内存。虽然可以使用 AspSessionMax 来限制该内存超出,但是通常情况下使用AspSessionTimeout属性来管理 IIS 中会话对象的生存期会更合适,一旦达到限制将拒绝客户端浏览器。
      AspSessionTimeout
      作用:属性指定了完成最后的与 Session 对象相关的请求后,保留该对象的时间(以分钟为单位)。可以使用 ASP 内置 Session 对象的 Timeout 属性来在脚本中覆盖该属性。
      注意:可以使用 AspSessionTimeout 来很好的调整 ASP 应用程序。由于 Session 对象消耗内存资源,因此使用该属性来限制单个 Session 的生存期可以使应用程序具有更好的可缩放性。
      AspProcessorThreadMax
      作用:该属性指定 IIS 可创建的每个处理器的最大工作线程数。(IIS 所允许的每个 ASP 进程的工作线程的最大数量是 AspProcessorThreadMax 乘以服务器上处理器的数量。可以降低此值然后监视性能。如果性能降低,请恢复 AspProcessorThreadMax 原来的值。)
      注意:该设置通常会明显地影响 Web 应用程序的可扩展性和服务器的性能。因为该属性定义了可同时执行的 ASP 请求的最大数量,所以除非 ASP 应用程序扩展调用外部组件,该设置都将保持默认值。在这种情况下,可以增加 AspProcessorThreadMax 的值。这样做允许服务器创建更多的线程来处理更多的并发请求。如果更改了此属性的值,则必须停止然后重新启动 Web 服务器实例以使更改生效。该属性的万维网发布服务 (WWW 服务) 设置在所有级别上适用于所有的进程内的和共用的进程外应用程序节点。对于进程内的和共用的进程外应用程序,忽略 Web 服务器或更低级别上的配置数据库设置。但是,如果该节点是进程外的隔离应用程序,则使用 Web 服务器级别或更低级别的设置。
      AspTrackThreadingModel
      作用:该属性指定了 IIS 是否检查应用程序创建的任意组件的线程模块。
      注意:该配置数据库属性通常最好保留默认值 (false),以便 ASP 不使用系统资源来跟踪线程模块,ASP 应用程序提供最好的性能。如果将该属性设置成 false,并且允许所创建的组件访问应用程序的作用域,则这些组件必须聚合自由线程封送拆收器。如果不聚合自由线程封送拆收器,则当创建组件实例时 ASP 将生成错误。有关该主题的详细信息,请参阅 Platform SDK 中的"建造 ASP 组件"。将该属性设为默认值 (false) 的另一个原因是,任意在 ASP 应用程序中创建的没有 OnStartPage 或 OnEndPage 方法的对象都比其他的要发布的早并且会降低应用程序的可缩放性能。
      CacheISAPI
      作用:该属性指示在第一次使用 ISAPI 扩展后是否在内存中进行缓存。如果将该属性的值设置为 true,则 ISAPI 扩展一旦载入将一直驻留在缓存中,直到服务器停止工作。如果将该属性的值设置为 false,则若不再使用 ISAPI 扩展,就将其从内存中卸载。是否对 ISAPI 扩展进行缓存,取决于将其载入内存使用时该属性的值。因此,如果在扩展已载入并进行缓存后更改属性,则只有在重新启动 Web 服务器后,所做更改才会对扩展生效。
      注意:将该属性设置为 false 可能引起严重的性能问题。而且当属性设置为 false 时,某些扩展无法正常运行。
 
2009年11月09日 星期一 11:51
IIS5.1是Windows XP默认的IIS版本,IIS5.0是Windows 2000的默认版本,IIS6.0是Windows 2003的默认版本。你可以通过:"Internet信息服务→帮助→关于Internet信息服务(B)"查看当前IIS的版本。
      要实现IIS5.1下的无后缀URL重写,只要在xx网站的属性→主目录→应用程序设置→配置→添加一条默认的应用程序映射,取消"检查文件是否存在(C)"选项→确定,然后把你所需要显示成无后缀的网页的后缀全部删掉就可以了。
如:将aillo.aspx改成aillo。


.* 表示当被访问网页的扩展名与列表中其他的应用程序映射的扩展名不匹配时,采用本条应用程序映射。

 
2009年11月09日 星期一 11:35
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv="Content-Language" content="zh-CN">
<title>三组文字文字不间断滚动 ,可用作股票,汇率等诸多显示 </title>
<style type="text/css">
*{font-size:12px;}
#scrollBox2{width:150px; height:64px; line-height:22px; overflow:hidden; background-color:#eee;}
</style>
</head>

<body>

国家 汇率名称 今日汇率  
<div id="scrollBox2">
    美元USD ŀ.775%<br>
    港币HKD ŀ.75%<br>
    英镑GBP ŀ.50%<br>
    欧元EUR ŀ.25%<br>
    日元JPY ŀ.01%<br>
</div>
<script>
window.onload=function(){
new Marquee(
    "scrollBox2", //容器ID<br>
    0, //向上滚动(0向上 1向下 2向左 3向右)<br>
    2, //滚动的步长<br>
    200, //容器可视宽度<br>
    64, //容器可视高度<br>
    50, //定时器 数值越小,滚动的速度越快(1000=1秒,建议不小于20)<br>
    2000, //间歇停顿时间(0为不停顿,1000=1秒)<br>
    3000, //开始时的等待时间(0为不等待,1000=1秒)<br>
    22 //间歇滚动间距(可选)<br>
    );
};
function Marquee(){
this.ID=document.getElementById(arguments[0]);
this.Direction=arguments[1];
this.Step=arguments[2];
this.Width=arguments[3];
this.Height=arguments[4];
this.Timer=arguments[5];
this.WaitTime=arguments[6];
this.StopTime=arguments[7];
if(arguments[8]){this.ScrollStep=arguments[8];}else{this.ScrollStep=this.Direction>1?this.Width:this.Height;}
this.CTL=this.StartID=this.Stop=this.MouseOver=0;
this.ID.style.overflowX=this.ID.style.overflowY="hidden";
this.ID.noWrap=true;
this.ID.style.width=this.Width;
this.ID.style.height=this.Height;
this.ClientScroll=this.Direction>1?this.ID.scrollWidth:this.ID.scrollHeight;
this.ID.innerHTML+=this.ID.innerHTML;
this.Start(this,this.Timer,this.WaitTime,this.StopTime);
}
Marquee.prototype.Start=function(msobj,timer,waittime,stoptime){
msobj.StartID=function(){msobj.Scroll();}
msobj.Continue=function(){
    if(msobj.MouseOver==1){setTimeout(msobj.Continue,waittime);}
    else{clearInterval(msobj.TimerID); msobj.CTL=msobj.Stop=0; msobj.TimerID=setInterval(msobj.StartID,timer);}
    }
msobj.Pause=function(){msobj.Stop=1; clearInterval(msobj.TimerID); setTimeout(msobj.Continue,waittime);}
msobj.Begin=function(){
    msobj.TimerID=setInterval(msobj.StartID,timer);
    msobj.ID.onmouseover=function(){msobj.MouseOver=1; clearInterval(msobj.TimerID);}
    msobj.ID.onmouseout=function(){msobj.MouseOver=0; if(msobj.Stop==0){clearInterval(msobj.TimerID); msobj.TimerID=setInterval(msobj.StartID,timer);}}
    }
setTimeout(msobj.Begin,stoptime);
}
Marquee.prototype.Scroll=function(){
switch(this.Direction){
    case 0:
      this.CTL+=this.Step;
      if(this.CTL>=this.ScrollStep&&this.WaitTime>0){this.ID.scrollTop+=this.ScrollStep+this.Step-this.CTL; this.Pause(); return;}
      else{if(this.ID.scrollTop>=this.ClientScroll) this.ID.scrollTop-=this.ClientScroll; this.ID.scrollTop+=this.Step;}
      break;
    case 1:
      this.CTL+=this.Step;
      if(this.CTL>=this.ScrollStep&&this.WaitTime>0){this.ID.scrollTop-=this.ScrollStep+this.Step-this.CTL; this.Pause(); return;}
      else{if(this.ID.scrollTop<=0) this.ID.scrollTop+=this.ClientScroll; this.ID.scrollTop-=this.Step;}
      break;
    case 2:
      this.CTL+=this.Step;
      if(this.CTL>=this.ScrollStep&&this.WaitTime>0){this.ID.scrollLeft+=this.ScrollStep+this.Step-this.CTL; this.Pause(); return;}
      else{if(this.ID.scrollLeft>=this.ClientScroll) this.ID.scrollLeft-=this.ClientScroll; this.ID.scrollLeft+=this.Step;}
      break;
    case 3:
      this.CTL+=this.Step;
      if(this.CTL>=this.ScrollStep&&this.WaitTime>0){this.ID.scrollLeft-=this.ScrollStep+this.Step-this.CTL; this.Pause(); return;}
      else{if(this.ID.scrollLeft<=0) this.ID.scrollLeft+=this.ClientScroll; this.ID.scrollLeft-=this.Step;}
      break;
    }
}
</script>
</body>  
</html>

 
2009年11月06日 星期五 10:30

如何在网页下不带任何提示就可以关闭页面呢?本文采用javascript实现了这一效果!

<a href="javascript:window.opener=null;window.open('','_self');window.close();">关闭</a>


js实现网页在不带提示就可以关闭页面的代码

自定义提示关闭
<script language="javascript">
function custom_close(){
if (confirm("您确定要关闭本页吗?")){
window.opener=null;
window.open('','_self');
window.close();
}
else{}
}
</script>

// 这个脚本是 ie6和ie7 通用的脚本

<input id="btnClose" type="button" value="关闭本页" onClick="custom_close()" />

 
2009年11月06日 星期五 10:17

<!--IE下的默认关闭方法,IE会弹一个对话框让用户确认--> )m)H p Z g ]
<a href= "javascript:window.close() "> Default Close </a>
<!--IE6下可以用window.opener绕过这一个限制-->
<a href= "javascript:window.operner= "x ";window.close() "> Close IE6 </a> e ? q y W"I
<!--IE7下可以用这样的方法--> [ b9m1]!g/N \3t Y
<a href= "javascript:window.open( ' ', '_top '); window.top.close(); "> Close IE7 </a>


个人更改如下:
<a href="javascript:window.opener=null;window.open('','_self');window.close();" title="你确认关闭?">关闭窗口</a>

 
2009年11月05日 星期四 21:50
台湾南投发生5.9级地震
我市有震感
   本报讯(记者詹伟志 张君琳)据国家地震台网测定,北京时间11月5日17时32分55秒,在台湾南投县(北纬23.85度,东经120.72度)发生5.9级地震。
   17时36分,泉州网温陵社区就有网友发帖声称感觉到地震。网友"虾米都母鸡"表示:"我还以为头晕呢,看桌子在晃啊晃的。"17时38分,永春王先生拨打本报新闻热线22200000咨询是否发生地震。王先生说:"我家住在5楼,刚刚感觉好像有地震,阳台的花盆也在摇晃,客厅的吊灯也晃得厉害,大概持续了半分钟。"之后,陆续有来自泉州市区、惠安、晋江的十几位读者纷纷致电询问是否发生地震。
   随后,记者从市地震局获悉,因泉州与震中距离遥远,所以未受到明显影响。
 
2009年11月05日 星期四 21:26
大家沿用的“卫生”用餐方式

  碧海银沙网讯(图文/黄立鹏 编辑/叶创成 云 海)不知从何时起,大街小巷的小食摊都先给每个盘碗套上一个白色的塑料袋,然后把滚烫的粥类、汤类等食物倒入盘碗,再给顾客食用。摊主们这样做既迎合了顾客的“卫生”要求,又可免去清洗餐具之劳。但是,这样做是否就符合卫生呢?

将滚烫的食物倒入盆子

  笔者为此咨询了专业人士,专家对这种做法进行了否定:一是这样的塑料袋不是食品袋;二是这类塑料袋盛装高温食品时会溶解出各种对人体有害的毒物质;三是这类塑料袋多数是一些地下工厂利用废旧有毒塑料制成的,这类廉价塑料袋多数含有聚氯乙烯成分,遇上50度以上高温会释放致癌的毒物质。所以,摊主们这种做法既不符合卫生,又危及顾客的健康。

装上食物与待用的盆子

  在此,笔者忠告各位市民,为了你自己的健康,请勿再用这类塑料袋盛装食物。
 
2009年11月04日 星期三 16:43
CSS网页布局开始及网站常犯的几种错误,无论是策划、设计、开发,这些错误都要避免!

1、导航菜单使用图片、FLASH

  导航菜单使用图片、FLASH当然比纯文本来得好看一些,但是搜索引擎并不认识你的图片和FLASH。如果你非要使用漂亮的图片来做导航的话,可以使用背景替换的方法(我会在下次谈到这一个方法的);如果你要使用FLASH做导航,那我就没你办法了。建议做一个导航菜单链接的xml文提交到搜索引擎。

2、不恰当地使用图片

  为了网页美观,经常会到处贴满图片,这样做是不正确的,与内容无关的图片能少就少吧。我们可以把这些图片做成容器的背景。

3、内容里特殊字体的运用

  我承认楷体很漂亮,草书也不逊色于宋体。但是不是所有人的电脑都安装有这些字体。如果你使用这些特殊字体的话,在别人的电脑里看到的网页将会是不堪入目。

4、新窗口打开

  拜托!不要用任何窗口污染我的屏幕(尤其在当前操作系统低劣的窗口管理技术下)!如果我需要一个新窗口,我会自己打开的。设计者打开新窗口的本意是要让用户留在他的站点上。但是却忽略了控制用户的机器所带来的负面效应,这种策略恰恰弄巧成拙,因为当用户想通过“后退”按钮返回先前的站点时,已经做不到了。用户通常注意不到新窗口已经被打开,尤其当他们的显示器很小,而窗口又正好是最大化时。因此,当用户想要返回原来的站点时,面对的却只是一个不可用的灰色“后退”按钮。

5、无实际意义的特效

  避免使用炫耀的技巧。这些特效对你的网页没有任何实际意义。

6、内容滚动

  内容滚动可以在比较小的空间里展示比较多的内容。这是它的一个好处。但内容滚动却是弊大于利的。不是所有平台和浏览器都支持滚动的;在W3C看来,内容滚动会降低用户体验。

7、用户难以获取自己想要的内容

  如果一个用户访问你的网站跟走入迷宫一样,会有什么后果?听说过3次点击规则吗?对于小型网站,在你的主页上,没有任何一条信息,需要点击次数超过3次的。对于大型网站,使用导航和工具条来改善操作。

8、文件名命名不规范

  不要忽视这一点,例如新闻页面可以用:News.html,而不是类似2323123.html这样的无规范的命名方式。使用规范的命名方式不仅有利于搜索引擎,而且有利于网站日后的维护管理。

9、长篇文章未设置分页

  长篇文章不分页,会导致网页加载速度慢,用户阅读疲劳。所以建议长篇文章设置分页。

10、颜色搭配错误,网页难于阅读

  如无必要,你应当坚持使用白色的背景和黑色的文本,另外还应当坚持使用通用字体。

11、没有返回指向

  “返回指向”是网络用户的生命线,同时也是继超文本连接后最常使用的导航特征。用户可以随意尝试网页所指向的任何地方,而只需点击一两次“返回”按钮就可以回到先前的页面。

12、显眼的点击计数器

  不要轻易考虑在你的网站上放置一个醒目的点击记数器。你设计网站是为了给访问者提供服务,而不是推销你自己认为重要的东西。大多数浏览者认为计数器毫无意义,它们很容易被做假,浏览者也不想看广告。如果你显示你的网站是多么受欢迎,你最好提供一个链接,显示访问日志。

13、使用框架

  与记数器一样,框架在网页上越来越流行。在大多数网站上,在屏幕的左边有一个框架。但是设计者立刻就发现,在使用框架时产生了许多的问题。使用框架时如果没有17英寸的显示屏几乎不可能显示整个网站。框架也使得网站内个人主页不能够成为书签。也许更重要的是,搜索引擎常常被框架混淆,从而不能列出你的网站。

14、不恰当地使用声音

  声音的运用也应得到警惕。内联声音是网页设计者的另一个禁地。因为过多地使用声音会使下载速度很慢,同时并没有带给浏览者多少好处。首次听到鼠标发出声音可能会很有趣,但是多次以后肯定会很烦人。使用声音前,应该仔细考虑声音将会给你带来什么。

15、兼容性不佳

  你的网页在1024下看得顺眼么?那么换成1280看呢?不是所有人的显示器都用同一种分辨率的。无论是谁,都无法做出所有分辨率下完美的网页,但我们要做出能确保所有分辨率下不出错的网页。
还有两点就是:不要以为只有电脑才能看网页!不要以为世界上只有一种浏览器!

17、急于发布网站

  网站没有内容、网站程序BUG,这些问题解决后再发布吧。内容较为充实、程序BUG基本没有的网站才会让用户流连。

18、发布网站后未登录搜索引擎

  有客户跟我说,是不是我的网站已发布就可以在百度搜到了?我总会这样回答:百度不是我家开的,也不是你家开的,你发布网站时百度他是不知道的。所以,你发布网站后要到各大搜索引擎的登录口提交一下你的网站信息。

19、不留空白

  注意留空白。不要用图像、文本和不必要的动画GIFs来充斥网页,即使有足够的空间,在设计时也应该避免使用。

20、缺乏互动性

  让用户与网站能够互动,让用户与用户之间能够互动。所以最少要有一个留言本,这能激励访问者再次回到你的网站,还有助于扩充网站内容。这个是极其重要的,Web 2.0的核心思想。

 
2009年11月04日 星期三 16:42
<FORM name=search onsubmit="return findInPage(this.string.value);">
<INPUT onchange="n = 0;" size=15 name=string value="不一样的世界">
<INPUT type=submit value=页内搜索...></FORM>
<SCRIPT language=JavaScript>
var NS4 = (document.layers);
var IE4 = (document.all);
var win = window;
var n = 0;
function findInPage(str) {
var txt, i, found;
if (str == "")
return false;
if (NS4) {
if (!win.find(str))
while(win.find(str, false, true))
n++;
else
n++;
if (n == 0)
alert("Not found.");
}
if (IE4) {
txt = win.document.body.createTextRange();
for (i = 0; i <= n && (found = txt.findText(str)) != false; i++) {
txt.moveStart("character", 1);
txt.moveEnd("textedit");
}
if (found) {
txt.moveStart("character", -1);
txt.findText(str);
txt.select();
txt.scrollIntoView();
n++;
}
else {
if (n > 0) {
n = 0;
findInPage(str);
}
else
alert(" 不好意思,在本页没找到");
}
}
return false;
}
</SCRIPT>

在寒冷、严酷的北方大陆上……

在寒冷、严酷的北方大陆上……

在寒冷、严酷的北方大陆上……
 
2009年11月04日 星期三 16:40

全文索引在 MySQL 中是一个FULLTEXT类型索引。FULLTEXT索引用于MyISAM表,可以在CREATE TABLE时或之后使用ALTER TABLE或CREATE INDEX在CHAR、VARCHAR或TEXT列上创建。对于大的数据库,将数据装载到一个没有FULLTEXT索引的表中,然后再使用ALTER TABLE(或CREATE INDEX) 创建索引,这将是非常快的。将数据装载到一个已经有FULLTEXT索引的表中,将是非常慢的。

全文搜索通过MATCH()函数完成。

mysql> CREATE TABLE articles (
    ->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->   title VARCHAR(200),
    ->   body TEXT,
    ->   FULLTEXT (title,body)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO articles VALUES
    -> (NULL,'MySQL Tutorial', 'DBMS stands for DataBase ...'),
    -> (NULL,'How To Use MySQL Efficiently', 'After you went through a ...'),
    -> (NULL,'Optimising MySQL','In this tutorial we will show ...'),
    -> (NULL,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
    -> (NULL,'MySQL vs. YourSQL', 'In the following database comparison ...'),
    -> (NULL,'MySQL Security', 'When configured properly, MySQL ...');
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM articles
    ->          WHERE MATCH (title,body) AGAINST ('database');
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
| 5 | MySQL vs. YourSQL | In the following database comparison ... |
| 1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)函数MATCH()对照一个文本集(包含在一个FULLTEXT索引中的一个或多个列的列集)执行一个自然语言搜索一个字符串。搜索字符串做为AGAINST()的参数被给定。搜索以忽略字母大小写的方式执行。对于表中的每个记录行,MATCH()返回一个相关性值。即,在搜索字符串与记录行在MATCH()列表中指定的列的文本之间的相似性尺度。

当MATCH()被使用在一个WHERE子句中时 (参看上面的例子),返回的记录行被自动地以相关性从高到底的次序排序。相关性值是非负的浮点数字。零相关性意味着不相似。相关性的计算是基于:词在记录行中的数目、在行中唯一词的数目、在集中词的全部数目和包含一个特殊词的文档(记录行)的数目。

它也可以执行一个逻辑模式的搜索。这在下面的章节中被描述。

前面的例子是函数MATCH()使用上的一些基本说明。记录行以相似性递减的顺序返回。

下一个示例显示如何检索一个明确的相似性值。如果即没有WHERE也没有ORDER BY子句,返回行是不排序的。

mysql> SELECT id,MATCH (title,body) AGAINST ('Tutorial') FROM articles;
+----+-----------------------------------------+
| id | MATCH (title,body) AGAINST ('Tutorial') |
+----+-----------------------------------------+
| 1 |                        0.64840710366884 |
| 2 |                                       0 |
| 3 |                        0.66266459031789 |
| 4 |                                       0 |
| 5 |                                       0 |
| 6 |                                       0 |
+----+-----------------------------------------+
6 rows in set (0.00 sec)下面的示例更复杂一点。查询返回相似性并依然以相似度递减的次序返回记录行。为了完成这个结果,你应该指定MATCH()两次。这不会引起附加的开销,因为 MySQL 优化器会注意到两次同样的MATCH()调用,并只调用一次全文搜索代码。

mysql> SELECT id, body, MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root') AS score
    -> FROM articles WHERE MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root');
+----+-------------------------------------+-----------------+
| id | body                                | score           |
+----+-------------------------------------+-----------------+
| 4 | 1. Never run mysqld as root. 2. ... | 1.5055546709332 |
| 6 | When configured properly, MySQL ... |   1.31140957288 |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)MySQL 使用一个非常简单的剖析器来将文本分隔成词。一个“词”是由文字、数据、“'”和“_”组成的任何字符序列。任何在 stopword 列表上出现的,或太短的(3 个字符或更少的)的 “word” 将被忽略。

在集和查询中的每个合适的词根据其在集与查询中的重要性衡量。这样,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重。然后,词的权重将被结合用于计算记录行的相似性。

这样一个技术工作可很好地工作与大的集(实际上,它会小心地与之谐调)。 对于非常小的表,词分类不足以充份地反应它们的语义值,有时这个模式可能产生奇怪的结果。

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL');
Empty set (0.00 sec)在上面的例子中,搜索词MySQL却没有得到任何结果,因为这个词在超过一半的记录行中出现。同样的,它被有效地处理为一个 stopword (即,一个零语义值的词)。这是最理想的行为 -- 一个自然语言的查询不应该从一个 1GB 的表中返回每个次行(second row)。

匹配表中一半记录行的词很少可能找到相关文档。实际上,它可能会发现许多不相关的文档。我们都知道,当我们在互联网上通过搜索引擎试图搜索某些东西时,这会经常发生。因为这个原因,在这个特殊的数据集中,这样的行被设置一个低的语义值。

到 4.0.1 时,MySQL 也可以使用IN BOOLEAN MODE修饰语来执行一个逻辑全文搜索。

mysql> SELECT * FROM articles WHERE MATCH (title,body)
    ->     AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+----+------------------------------+-------------------------------------+
| id | title                        | body                                |
+----+------------------------------+-------------------------------------+
| 1 | MySQL Tutorial               | DBMS stands for DataBase ...        |
| 2 | How To Use MySQL Efficiently | After you went through a ...        |
| 3 | Optimising MySQL             | In this tutorial we will show ...   |
| 4 | 1001 MySQL Tricks            | 1. Never run mysqld as root. 2. ... |
| 6 | MySQL Security               | When configured properly, MySQL ... |
+----+------------------------------+-------------------------------------+这个查询返回所有包含词MySQL的记录行(注意: 50% 的阈值没有使用),但是它没有包含词YourSQL。注意,一个逻辑模式的搜索不会自动地以相似值的降序排序记录行。你可以从上面的结果出看得出来,最高的相似值(包含MySQL两次的那个) 最列在最后,而不是第一位。一个逻辑全文搜索即使在没有一个FULLTEXT索引的情况下也可以工作,然而它慢些。

逻辑全文搜索支持下面的操作符:

+
一个领头的加号表示,该词必须出现在每个返回的记录行中。

-
一个领头的减号表示,该词必须不出现在每个返回的记录行中。

缺省的 (当既没有加号也没有负号被指定时)词是随意的,但是包含它的记录行将被排列地更高一点。这个模仿没有IN BOOLEAN MODE修饰词的MATCH() ... AGAINST()的行为。

< >
这两个操作符用于改变一个词的相似性值的基值。<操作符减少基值,>操作符则增加它。参看下面的示例。

( )
圆括号用于对子表达式中的词分组。

~
一个领头的否定号的作用象一个否定操作符,引起行相似性的词的基值为负的。它对标记一个噪声词很有用。一个包含这样的词的记录将被排列得低一点,但是不会被完全的排除,因为这样可以使用-操作符。

*
一个星号是截断操作符。不想其它的操作符,它应该被追加到一个词后,不加在前面。

"
短语,被包围在双引号"中,只匹配包含这个短语(字面上的,就好像被键入的)的记录行。
这里是一些示例:

apple banana
找至少包含上面词中的一个的记录行
+apple +juice
... 两个词均在被包含
+apple macintosh
... 包含词 “apple”,但是如果同时包含 “macintosh”,它的排列将更高一些
+apple -macintosh
... 包含 “apple” 但不包含 “macintosh”
+apple +(>pie <strudel)
... 包含 “apple” 和 “pie”,或者包含的是 “apple” 和 “strudel” (以任何次序),但是 “apple pie” 排列得比 “apple strudel” 要高一点
apple*
... 包含 “apple”,“apples”,“applesauce” 和 “applet”
"some words"
... 可以包含 “some words of wisdom”,但不是 “some noise words”
全文的限制
MATCH()函数的所有参数必须是从来自于同一张表的列,同时必须是同一个FULLTEXT索引中的一部分,除非MATCH()是IN BOOLEAN MODE的。

MATCH()列列表必须确切地匹配表的某一FULLTEXT索引中定义的列列表,除非MATCH()是IN BOOLEAN MODE的。

AGAINST()的参数必须是一个常量字符串。
微调 MySQL 全文搜索
不幸地,全文搜索仍然只有很少的用户可调参数,虽然增加一些在 TODO 上排列很高。如果你有一个 MySQL 源码发行,你可以发挥对全文搜索的更多控制。

注意,全文搜索为最佳的搜索效果,被仔细地调整了。修改默认值的行为,在大多数情况下,只会使搜索结果更糟。不要修改 MySQL 的源代码,除非你知道你在做什么!

被索引的词的最小长度由 MySQL 变量ft_min_word_len指定。

stopword 列表可以从ft_stopword_file变量指定的文件中读取。

50% 阈值选择由所选择的特殊的衡量模式确定。为了禁止它,修改`myisam/ftdefs.h'文件中下面的一行:
#define GWS_IN_USE GWS_PROB改为:
#define GWS_IN_USE GWS_FREQ然后重新编译 MySQL。在这种情况下,不需要重建索引。注意:使用了这个,将严重地减少 MySQL 为MATCH()提供足够的相似性值的能力。如果你确实需要搜索这样的公共词,最好使用IN BOOLEAN MODE的搜索代替,它不遵守 50% 的阈值。

有时,搜索引擎维护员希望更改使用于逻辑全文搜索的操作符。这些由变量ft_boolean_syntax定义。对于这些更改,要求你重建你的FULLTEXT索引,对于一个 MyISAM 表,最容易的重建索引文件的方式如下面的语句:
mysql> REPAIR TABLE tbl_name QUICK;全文搜索 TODO
使所有对FULLTEXT索引的操作更快
邻近(Proximity)操作符
对 "always-index words" 的支持。他们可以是用户希望视为一个词处理的任意字符串,例如 "C++"、"AS/400"、"TCP/IP",等等
支持在MERGE表中的全文搜索
对多字节字符的支持
依照数据的语言建立 stopword 列表
Stemming (当然,依赖于数据的语言)
Generic user-suppliable UDF preparser.
使模式更加灵活 (通过为CREATE/ALTER TABLE中的FULLTEXT增加某些可调整参数)

 
2009年11月04日 星期三 16:36
使用mysql这个数据库软件,它工作比较稳定,效率也很高。在遇到严重性能问题时,一般都有这么几种可能:

  1、索引没有建好;

  2、sql写法过于复杂;

  3、配置错误;

  4、机器实在负荷不了;

  1、索引没有建好

  如果看到mysql消耗的cpu很大,可以用mysql的client工具来检查。

  在linux下执行

  /usr/local/mysql/bin/mysql -hlocalhost -uroot -p

  输入密码,如果没有密码,则不用-p参数就可以进到客户端界面中。

  看看当前的运行情况

  show full processlist

  可以多运行几次

  这个命令可以看到当前正在执行的sql语句,它会告知执行的sql、数据库名、执行的状态、来自的客户端ip、所使用的帐号、运行时间等信息

  在我的cache后端,这里面大部分时间是看不到显示任何sql语句的,我认为这样才算比较正常。如果看到有很多sql语句,那么这台mysql就一定会有性能问题

  如果出现了性能问题,则可以进行分析:

  1、是不是有sql语句卡住了?

  这是出现比较多的情况,如果数据库是采用myisam,那么有可能有一个写入的线程会把数据表给锁定了,如果这条语句不结束,则其它语句也无法运行。

  查看processlist里的time这一项,看看有没有执行时间很长的语句,要留意这些语句。

  2、大量相同的sql语句正在执行

  如果出现这种情况,则有可能是该sql语句执行的效率低下,同样要留意这些语句。

  然后把你所怀疑的语句统统集合一下,用desc(explain)来检查这些语句。

  首先看看一个正常的desc输出:

  mysql> desc select * from imgs where imgid=1651768337;

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

  +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+

  | 1 | SIMPLE | imgs | const | PRIMARY | PRIMARY | 8 | const | 1 | |

  +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+

  1 row in set (0.00 sec)

  注意key、rows和Extra这三项,这条语句返回的结果说明了该sql会使用PRIMARY主键索引来查询,结果集数量为1条,Extra没有显示,证明没有用到排序或其他操作。由此结果可以推断,mysql会从索引中查询imgid=1651768337这条记录,然后再到真实表中取出所有字段,是很简单的操作。

  key是指明当前sql会使用的索引,mysql执行一条简单语句时只能使用到一条索引,注意这个限制;rows是返回的结果集大小,结果集就是使用该索引进行一次搜索的所有匹配结果;Extra一般会显示查询和排序的方式,。

  如果没有使用到key,或者rows很大而用到了filesort排序,一般都会影响到效率,例如:

  mysql> desc select * from imgs where userid="7mini" order by clicks desc limit 10;

  +----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+

  | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

  +----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+

  | 1 | SIMPLE | imgs | ALL | NULL | NULL | NULL | NULL | 12506 | Using where; Using filesort |

1 row in set (0.00 sec)

  这条sql结果集会有12506条,用到了filesort,所以执行起来会非常消耗效率的。这时mysql执行时会把整个表扫描一遍,一条一条去找到匹配userid="7mini"的记录,然后还要对这些记录的clicks进行一次排序,效率可想而知。真实执行时如果发现还比较快的话,那是因为服务器内存还足够将12506条比较短小的记录全部读入内存,所以还比较快,但是并发多起来或者表大起来的话,效率问题就严重了。

  这时我把userid加入索引:

  create index userid on imgs (userid);

  然后再检查:

  mysql> desc select * from imgs where userid="7mini" order by clicks desc limit 10;

  +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+

  | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

  +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+

  | 1 | SIMPLE | imgs | ref | userid | userid | 51 | const | 8 | Using where; Using filesort |

row in set (0.00 sec)

  嗯,这时可以看到mysql使用了userid这个索引搜索了,用userid索引一次搜索后,结果集有8条。然后虽然使用了filesort一条一条排序,但是因为结果集只有区区8条,效率问题得以缓解。

但是,如果我用别的userid查询,结果又会有所不同:

  mysql> desc select * from imgs where userid="admin" order by clicks desc limit 10;

  +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+

  | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

  +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+

  | 1 | SIMPLE | imgs | ref | userid | userid | 51 | const | 2944 | Using where; Using filesort |

  +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+

  1 row in set (0.00 sec)

  这个结果和userid="7mini"的结果基本相同,但是mysql用userid索引一次搜索后结果集的大小达到2944条,这2944条记录都会加入内存进行filesort,效率比起7mini那次来说就差很多了。这时可以有两种办法可以解决,第一种办法是再加一个索引和判断条件,因为我只需要根据点击量取最大的10条数据,所以有很多数据我根本不需要加进来排序,比如点击量小于10的,这些数据可能占了很大部分。

  我对clicks加一个索引,然后加入一个where条件再查询:

  create index clicks on imgs(clicks);

  mysql> desc select * from imgs where userid="admin" order by clicks desc limit 10;

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

  +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+

  | 1 | SIMPLE | imgs | ref | userid,clicks | userid | 51 | const | 2944 | Using where; Using filesort |

  +----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+

  1 row in set (0.00 sec)

  这时可以看到possible_keys变成了userid,clicks,possible_keys是可以匹配的所有索引,mysql会从possible_keys中自己判断并取用其中一个索引来执行语句,值得注意的是,mysql取用的这个索引未必是最优化的。这次查询mysql还是使用userid这个索引来查询的,并没有按照我的意愿,所以结果还是没有什么变化。改一下sql加上use index强制mysql使用clicks索引:

以上是对索引优化的办法,因为原因可能会比较复杂,所以写得比较的长,一般好好优化了索引之后,mysql的效率会提升n个档次,从而也不需要考虑增加机器来解决问题了。

  但是,mysql甚至所有数据库,可能都不好解决limit的问题。在mysql中,limit 0,10只要索引合适,是没有问题的,但是limit 100000,10就会很慢了,因为mysql会扫描排好序的结果,然后找到100000这个点,取出10条返回。要找到100000这个点,就要扫描100000条记录,这个循环是比较耗时的。不知道会不会有什么好的算法可以优化这个扫描引擎,我冥思苦想也想不出有什么好办法。对于limit,目前直至比较久远的将来,我想只能通过业务、程序和数据表的规划来优化,我想到的这些优化办法也都还没有一个是万全之策,往后再讨论。

2、sql写法过于复杂

  sql写法假如用到一些特殊的功能,比如groupby、或者多表联合查询的话,mysql用到什么方式来查询也可以用desc来分析,我这边用复杂sql的情况还不算多,所以不常分析,暂时就没有好的建议。

  3、配置错误

  配置里主要参数是key_buffer、sort_buffer_size/myisam_sort_buffer_size,这两个参数意思是:

  key_buffer=128M:全部表的索引都会尽可能放在这块内存区域内,索引比较大的话就开稍大点都可以,我一般设为128M,有个好的建议是把很少用到并且比较大的表想办法移到别的地方去,这样可以显著减少mysql的内存占用。

  sort_buffer_size=1M:单个线程使用的用于排序的内存,查询结果集都会放进这内存里,如果比较小,mysql会多放几次,所以稍微开大一点就可以了,重要是优化好索引和查询语句,让他们不要生成太大的结果集。

  另外一些配置:

  thread_concurrency=8:这个配置标配=cpu数量x2

  interactive_timeout=30

  wait_timeout=30:这两个配置使用10-30秒就可以了,这样会尽快地释放内存资源,注意:一直在使用的连接是不会断掉的,这个配置只是断掉了长时间不动的连接。

  query_cache:这个功能不要使用,现在很多人看到cache这几个字母就像看到了宝贝,这是不唯物主义的。mysql的query_cache在每次表数据有变化的时候都会重新清理连至该表的所有缓存,如果更新比较频繁,query_cache不但帮不上忙,而且还会对效率影响很大。这个参数只适合只读型的数据库,如果非要用,也只能用query_cache_type=2自行用SQL_CACHE指定一些sql进行缓存。

  max_connections:默认为100,一般情况下是足够用的,但是一般要开大一点,开到400-600就可以了,能超过600的话一般就有效率问题,得另找对策,光靠增加这个数字不是办法。

其它配置可以按默认就可以了,个人觉得问题还不是那么的大,提醒一下:1、配置虽然很重要,但是在绝大部分情况下都不是效率问题的罪魁祸首。2、mysql是一个数据库,对于数据库最重要考究的不应是效率,而是稳定性和数据准确性。

  4、机器实在负荷不了

  如果做了以上调整,服务器还是不能承受,那就只能通过架构级调整来优化了。

  1、mysql同步。

  通过mysql同步功能将数据同步到数台从数据库,由主数据库写入,从数据库提供读取。

  我个人不是那么乐意使用mysql同步,因为这个办法会增加程序的复杂性,并常常会引起数据方面的错误。在高负荷的服务中,死机了还可以快速重启,但数据错误的话要恢复就比较麻烦。

  2、加入缓存

  加入缓存之后,就可以解决并发的问题,效果很明显。如果是实时系统,可以考虑用刷新缓存方式使缓存保持最新。

  在前端加入squid的架构比较提倡使用,在命中率比较高的应用中,基本上可以解决问题。

  如果是在程序逻辑层里面进行缓存,会增加很多复杂性,问题会比较多而且难解决,不建议在这一层面进行调整。

  3、程序架构调整,支持同时连接多个数据库

  如果web加入缓存后问题还是比较严重,只能通过程序架构调整,把应用拆散,用多台的机器同时提供服务。

  如果拆散的话,对业务是有少许影响,如果业务当中有部分功能必须使用所有的数据,可以用一个完整库+n个分散库这样的架构,每次修改都在完整库和分散库各操作一次,或定期整理完整库。

  当然,还有一种最笨的,把数据库整个完完整整的做拷贝,然后程序每次都把完整的sql在这些库执行一遍,访问时轮询访问,我认为这样要比mysql同步的方式安全。

  4、使用 mysql proxy 代理

  mysql proxy 可以通过代理把数据库中的各个表分散到数台服务器,但是它的问题是没有能解决热门表的问题,如果热门内容散在多个表中,用这个办法是比较轻松就能解决问题。

  我没有用过这个软件也没有认真查过,不过我对它的功能有一点点怀疑,就是它怎么实现多个表之间的联合查询?如果能实现,那么效率如何呢?

  5、使用memcachedb

  数据库换用支持mysql的memcachedb,是可以一试的想法,从memcachedb的实现方式和层面来看对数据没有什么影响,不会对用户有什么困扰。

  为我现在因为数据库方面问题不多,没有试验过这个玩意。不过,只要它支持mysql的大部分主要的语法,而且本身稳定,可用性是无需置疑的。

 
2009年11月04日 星期三 16:35
你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起 。 ----- Arthur J.Riel

  (1)所有数据都应该隐藏在所在的类的内部。

  (2)类的使用者必须依赖类的共有接口,但类不能依赖它的使用者。

  (3)尽量减少类的协议中的消息。

  (4)实现所有类都理解的最基本公有接口[例如,拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。

  (5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。

  如果类的两个方法有一段公共代码,那么就可以创建一个防止这些公共代码的私有函数。

  (6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。

  (7)类之间应该零耦合,或者只有导出耦合关系。也即,一个类要么同另一个类毫无关系,要么只使用另一个类的公有接口中的操作。

  (8)类应该只表示一个关键抽象。

  包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响,则将对包中的所有类产生影响,而对其他的包不  造成任何影响 .

  (9)把相关的数据和行为集中放置。

  设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这种类型的行为暗示着这条经验原则被违反了。

  (10)把不相关的信息放在另一个类中(也即:互不沟通的行为)。

  朝着稳定的方向进行依赖.

  (11)确保你为之建模的抽象概念是类,而不只是对象扮演的角色。

  (12)在水平方向上尽可能统一地分布系统功能,也即:按照设计,顶层类应当统一地共享工作。

  (13)在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。

 
2009年11月04日 星期三 13:37
文件密码箱是一款免费、多项创新技术、多重保护的加密和文件安全存储管理软件,软件打破传统的文件“裸存”于磁盘中的状况,在磁盘之上创建一个加密存储文件的容器——密码箱 ,从外部看密码箱是一个文件,但输入密码打开密码箱后,里面就像是一个虚拟磁盘,可加密存储各类文件和文件夹,无需手动加解密,可像操作普通磁盘中文件一样直接操作密码箱中文件和文件夹(编辑文档、浏览图片、播放影音、运行程序...),密码箱中文件始终处于加密状态;密码箱中每个文件加密算法为动态随机选择,密码箱具有防删除、防复制、防篡改保护,密码箱支持大容量存储,密码箱中存储的EXE、DLL、CHM等类型文件对病毒免疫,支持快速批量加密存储各类文件和文件夹(工程图纸、技术方案、商业计划、财务报表、照片视频、信函日记...);软件智能判断应用场景,支持移动加密和刻录到光盘只读存档加密;支持创建自解密EXE文件和带密码的压缩包文件;支持内嵌的监控日志、密码提示问题、密钥文件、软键盘输入、一键锁定等多种防泄密和反窃密技术;支持注释、书签定位、带通配符的模糊查找、自定义排序、内部回收站、剪切复制等多种密码箱内文件管理功能;软件还提供强大的异常保护和自修复功能,若加密过程中发生停电之类异常,再次打开密码箱会自动恢复到异常发生前的状态。

软件名称:文件密码箱

软件分类:加密软件/免费软件/绿色免安装软件/简体中文/无插件

运行平台:win98/win2000/winNT/winxp/winme/vista/win7

下载地址:http://www.7safe.cn/download/EncryptBox.zip


 
    文件密码箱不仅功能强大,使用起来也非常方便:

 
     
 
 
文章分类
 
 
 
 
 
 
 
 
Mysql(14)
 
 
 
 
 
房产(19)
 
 
 
 
 
基金(13)
 
     
 
背景音乐
 
 
我的照片秀
 
   
 
最新评论
 
文章评论|照片评论


继续加油,期待着你的完美破解
 

继续加油,期待着你的完美破解
 

好厉害,好专业
 

回复dd:呵,互相学习
 
 
有很多好东西
 
很喜欢这些啊
 
壁纸
 
跟vista差不多,换汤不换药,欺骗消费者!!
 
小亲亲
 
     
 
我在百度
 
   
 
最近访客
 
 

wenbs

a1705920

molefeifei

hbo0815

ambitionenergy

hnytqiqi

chkesk

wuyun_mm
     
 
RSS订阅
 
   


©2009 Baidu