Centos 5.X常见服务优化与说明总结

一 关闭selinux

selinux对很多服务的要求以及安全策略非常多非常多,新手很难驾驭,所以一般建议关闭, 但在加固一些网络服务时,还是需要开启的

#disable selinux
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config

 

二. 更换yum的更新源

如果服务器不是位于教育网内,中科大的镜像源速度也很一般啊, 强烈建议整合sohu或者163的更新源:

cd /etc/yum.repos.d

mv CentOS-Base.repo  CentOS-Base.repo.save

wget http://mirrors.sohu.com/help/CentOS-Base-sohu.repo

mv CentOS-Base-sohu.repo CentOS-Base.repo

wget http://mirrors.163.com/.help/CentOS-Base-163.repo

wget http://mirrors.ustc.edu.cn/centos/CentOS-Base.5.mirrors.repo

yum makecache

 

三 定时校正服务器时间

作为生产机的服务器时间的准备性非常重要, 我们需要定时根据NTP服务器时间自动校准时间, 全世界各地有很多ntp服务, 我们一般会选择当地的服务器, 但是, 我们要慎重选择像中国国家授时中心的标准时间服务器(210.72.145.44), 可能是访问量过大, 造成负载过大而无法访问。
推荐使用以下NTP服务器:
1.asia.pool.ntp.org
0.asia.pool.ntp.org
2.asia.pool.ntp.org
3.asia.pool.ntp.org

yum install ntp

crontab -e

增加一行,在每天的0点15分、6点15分、12点15分、18点15分与时间同步服务器进行同步:

15 0,6,12,18 * * * ntpdate 1.asia.pool.ntp.org

 

 

四. 设置终端模式(init 3)

1、vi /etc/inittab
2、找到id:5:initdefault: 这行
3、将5改为3即可,即id:3:initdefault:

 

五 停止网卡对ipv6的支持

在CentOS默认的状态下,ipv6是被启用的状态。因为我们不使用ipv6,所以停止ipv6,以最大限 度保证安全和快速。
#vi /etc/modprobe.conf ← 修改相应配置文件,添加如下行到文尾:

alias net-pf-10 off
alias ipv6 off

 

 

六 调整Linux的最大文件打开数

Linux最大文件打开数的默认值很低,必须修改的高一些
vim /etc/security/limit.conf
在最后一行添加

* soft nofile 60000
* hard nofile 65535

 

值得注意的是,通过命令ulimit -SHn是改变不了linux系统的最大文件打开数的,写进/etc/rc.d/rc.local也是不行的。

 

关闭不需要的服务

根据自己的需要和网络上的资料整理了80多个常见的centos5.6服务

服务名称优化建议服务类型功能简介
acpid开启系统acpid进阶电源管理的介面,这是一个新的电源管理模组,   可以监听来自核心层的电源相关事件而予以回应。   CentOS  的配置文件在   /etc/acpi/events/power.conf  中,预设仅有当你按下   power  按钮时,系统会自动关机!
anacron可关闭系统anacron与循环型的工作任务   cron  有关,可在任务过期后还可以唤醒来继续执行,   配置文件在   /etc/anacrontab 。
apmd可关闭系统apmd配置文件在   /etc/sysconfig/apmd  ,也是电源管理模组啦!   可侦测电池电量,当电池电力不足时,可以自动关机以保护电脑主机。
atd开启系统atd单一的例行性工作任务,抵挡机制的配置文件在   /etc/at.{allow,deny}  喔!
auditd开启系统auditd是SELinux中的一项,可以让系统需  SELinux审核的消息写入/var/log/audit/audit.log  中。若此服务没有启动,则消息会传给  syslog管理。
autofs可关闭系统autofs可用来自动挂载来自网路上的其他服务器所提供的网路磁碟机   ( 一般是 NFS) 。   不过我们是单机系统,所以目前还没必要这个服务。
avahi-daemon可关闭系统avahi-daemon也是一个用户端的服务,可以透过   Zeroconf  自动的分析与管理网路。   Zeroconf  较常用在笔记型电脑与行动装置上,所以我们可以先关闭他啦!
bluetooth可关闭系统bluetooth用在蓝芽装置的搜寻上,如果   Linux  是当作服务器使用时,   这个服务可以暂时关闭也没关系!
cpuspeed开启系统cpuspeed可以用来管理   CPU  的频率功能。若系统闲置时,此项功能可以自动的降低   CPU  频率来节省电量与降低   CPU  温度喔!
crond开启系统crond  (系统 ) 系统配置文件为   /etc/crontab 。
cups可关闭系统cups用来管理印表机的服务,可以提供网路连线的功能,有点类似列印服务器的功能哩!   你可以在   Linux  本机上面以浏览器的   http://localhost:631  来管理印表机喔!由于我们目前没有印表机,所以可以暂时关闭他。
firstboot可关闭系统firstboot还记得系统第一次进入图形介面还需要进行一些额外的设定吗?   就是这个服务的帮忙啦!既然已经安装妥当,现在你可以将这个服务关闭啰。
gpm开启系统gpm在   tty1~tty6  的环境下你竟然可以使用鼠标功能来复制贴上,就是这个   gpm  提供的能力啦!
haldaemon可关闭系统haldaemon通常用在桌上型电脑的环境中,可侦测类似   usb  的装置呢!   不过,如果是服务器环境,这个服务倒是可以关闭啦!如果是桌上型电脑,那最好可以启动啰!
hidd可关闭系统hidd也是蓝芽服务的功能啦!可以提供键盘、鼠标等蓝芽装置的侦测哩!   须搭配   bluetooth 。服务器环境倒是不需要此项服务。
hplip可关闭系统hplip主要是针对   HP  的印表机功能所开发的脚本服务,如果你的环境中并没有 HP 相关设备,这个服务就给他关闭吧!
ip6tables可关闭网络ip6tables是针对本机的防火墙功能!这个防火墙主要是针对   IPv6  的版本,如果你的网路环境并没有   IPv6  的设备,那么这个服务是可以关闭的。
iptables开启网络iptables本机防火墙功能,是核心支援的呢!所以功能与效能都非常棒!当然不能够取消啊!   只是设定上就得要努力研究啦!我们会在服务器篇介绍网路相关资讯的。
irqbalance 开启系统irqbalance如果你的系统是多核心的硬体,那么这个服务要启动,   因为它可以自动的分配系统中断   (IRQ)  之类的硬体资源。
isdn可关闭系统ISDN  是一种宽频设备   ( 数据机的一种 )  ,但是在台湾我们比较常使用 ADSL  及光纤设备,   所以这个服务是可以关闭啦。
kudzu可关闭系统kudzu如果你有增加新的硬体时,这个服务可以在开机时自动的侦测硬体,  并且会自动的呼叫相关的设定软件,方便你在开机时就处理好你的硬体啊!
lm_sensors可关闭系统lm_sensors这个服务可以帮你侦测主机板的相关侦测晶片,举例来说,   某些主机板会主动的侦测   CPU  温度、频率、电压等,这个   lm_sensors  能够将这些温度、频率等数据显示出来喔!
lvm2-monitor开启系统lvm2-monitor我们已经谈过   LVM  啰!所以我们当然要启动这个服务比较妥当。
mcstrans 开启系统mcstrans与   SELinux  有关的服务,最好也启动啊!
mdmonitor可关闭系统mdmonitor可以侦测所有软件的状态,暂时似乎也不需要启动这个服务哩!
messagebus可关闭系统messagebus可用来沟通各个软件之间的消息,有点类似剪贴簿的感觉。  不过在服务器环境则没有强烈需求就是了。
microcode_ctl可关闭系统Intel  的   CPU  会提供一个外挂的微指令集提供系统运作,   不过,如果你没有下载   Intel  相关的指令集档案,那么这个服务不需要启动的,也不会影响系统运作。
netfs可关闭网络netfs可以进行网路磁碟机   (NFS,  SMB/CIFS)  的挂载与卸载功能。   目前我们尚未使用网路,因此这个服务可以先关闭。
network开启网络network提供网路设定的功能,所以一定要启动的啦!
nfslock可关闭网络NFS  为一种   Unix  like  的网路磁碟机,但在进行档案的分享时,   为了担心同一档案多重编辑的问题,所以会有这个锁住   (lock)  的服务!可以避免同一个档案被两个不同的人编辑时所造成的档案错误问题。
pcscd可关闭系统pcscd智慧卡侦测的服务,可以关闭他啦。
portmap开启网络portmap用在远端程序呼叫的服务,很多服务都使用这个玩意儿来辅助连线的,   因此建议不要取消他,除非你确定你的系统没有使用到任何的   RPC  服务喔!
readahead_early可关闭系统(可关闭 )  ( 系统 ) 在系统开机的时候可以先将某些程式载入到记忆体中,以方便快速的载入,   可加快一些启动的速度。
readahead_later系统
restorecond开启系统restorecond利用   /etc/selinux/restorecond.conf  的设定来判断当新建档案时,该档案的   SELinux  类型应该如何还原。需要注意的是,如果你的系统有很多非正规的   SELinux  档案类型设定时,这个   daemon  最好关闭,否则他会将你设定的   type  修改回预设值。
rpcgssd可关闭网络与  NFS  有关的用户端功能,在你还没有玩到网路阶段时,   这两个咚咚也能够先取消啦!
rpcidmapd可关闭网络
sendmail可关闭网络sendmail这就是电子邮件的软件啊!我们想要拥有可寄信的功能时,  这个服务可不能关闭。不过,预设这个服务仅能支援本机的功能,无法收受来自网际网路的邮件喔!
setroubleshoot开启系统setroubleshoot一定要启动啊!因为这玩意儿可以将你的  SELinux  相关消息记录在/var/log/messages  里面,非常有帮助喔!
smartd开启系统smartd这个服务可以自动的侦测硬碟状态,如果硬碟发生问题的话,还能够自动的回报给系统管理员,是个非常有帮助的服务喔!不可关闭他啊!
sshd开启网络sshd这个是远端连线服务器的软件功能,  这个通讯协定比  telnet  好的地方在于  sshd  在传送资料时可以进行加密喔!这个服务不要关闭他啦!
syslog开启系统syslog这个服务可以记录系统所产生的各项消息,  包括/var/log/messages  内的几个重要的登录档啊。
xfs可关闭系统xfs这个是   X  Font  Server ,主要提供图形介面的字型的一个服务,   如果你不启动   X  视窗的话,那么这个服务可以启动。但是如果你有需要用到   X  时,一定要启动这玩意儿,否则图形介面是无法启动的喔。
xinetd开启系统xinetd就是   super  daemon  啊,不必讲了吧   ^_^
yum-updatesd 可关闭系统yum-updatesd可以透过  yum  的功能进行软件的线上升级机制,  若有升级的软件释出时,就能够以邮件或者是  syslog  来通知系统管理原来手动升级啊。

完整点击我下载查看

 

八 TCP性能优化

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096        87380    4194304
net.ipv4.tcp_wmem = 4096        16384    4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024    65000

大型系统开发sql优化总结(转)亟需

Problem Description:
1.每个表的结构及主键索引情况
2.每个表的count(*)记录是多少
3.对于创建索引的列,索引的类型是什么?count(distinct indexcol)的值是多少?
4.最后一次对表进行分析是在什么时间,分析后,是否又对相关表做过大的操作
5.索引最后一次rebuild,是在什么时间,此后对表的操作类型又是什么状况?索引中浪费的空间是多少?
6.这些表的存储情况,表的存储参数,表空间的类型,存储参数等
7.执行该SQL语句时,系统等候的资源是什么? Trace SQL语句的执行过程
8.另一台执行相似SQL速度很快的机器上的相关表的如上信息是什么?

一:SQL tuning 类
1:列举几种表连接方式
  hash join/merge join/nest loop(cluster join)/index join

2:不借助第三方工具,怎样查看sql的执行计划
set autotrace on
set autotrace traceonly

explain plan set statement_id = &item_id for &sql;
select * from table(dbms_xplan.display);
http://download-west.oracle.com/ ... /b10752/ex_plan.htm

3:如何使用CBO,CBO与RULE的区别
  在optimizer_mode=choose时,如果表有统计信息(分区表外),优化器将选择CBO,否则选RBO。

  RBO遵循简单的分级方法学,使用15种级别要点,当接收到查询,优化器将评估使用到的要点数目,
然后选择最佳级别(最少的数量)的执行路径来运行查询。
CBO尝试找到最低成本的访问数据的方法,为了最大的吞吐量或最快的初始响应时间,计算使用不同
的执行计划的成本,并选择成本最低的一个,关于表的数据内容的统计被用于确定执行计划。

4:如何定位重要(消耗资源多)的SQL
  select sql_text
  from v$sql
where disk_reads > 1000 or (executions > 0 and buffer_gets/executions > 30000);

5:如何跟踪某个session的SQL
  exec dbms_system.set_sql_trace_in_session(sid,serial#,&sql_trace);

select sid,serial# from v$session where sid = (select sid from v$mystat where rownum = 1);
  exec dbms_system.set_ev(&sid,&serial#,&event_10046,&level_12,'');

6:SQL调整最关注的是什么
  查看该SQL的response time(db block gets/consistent gets/physical reads/sorts (disk))

7:说说你对索引的认识(索引的结构、对dml影响、为什么提高查询性能)
  b-tree index/bitmap index/function index/patitional index(local/global)
  索引通常能提高select/update/delete的性能,会降低insert的速度,
 
8:使用索引查询一定能提高查询的性能吗?为什么
  索引就是为了提高查询性能而存在的,
如果在查询中索引没有提高性能,
只能说是用错了索引,或者讲是场合不同

9:绑定变量是什么?绑定变量有什么优缺点?
  绑定变量是相对文本变量来讲的,所谓文本变量是指在SQL直接书写查询条件,
这样的SQL在不同条件下需要反复解析,绑定变量是指使用变量来代替直接书写条件,
查询bind value在运行时传递,然后绑定执行。
 
优点是减少硬解析,降低CPU的争用,节省shared_pool
缺点是不能使用histogram,sql优化比较困难

10:如何稳定(固定)执行计划
  query_rewrite_enabled = true
  star_transformation_enabled = true
  optimizer_features_enable = 9.2.0

创建并使用stored outline
  http://download-west.oracle.com/ ... /outlines.htm#26854
 
这个贴子:
http://www.cnoug.org/viewthread.php?tid=27598
 
11:和排序相关的内存在8i和9i分别怎样调整,临时表空间的作用是什么
   8i中sort_area_size/sort_area_retained_size决定了排序所需要的内存
  如果排序操作不能在sort_area_size中完成,就会用到temp表空间

  9i中如果workarea_size_policy=auto时,
  排序在pga内进行,通常pga_aggregate_target的1/20可以用来进行disk sort;
  如果workarea_size_policy=manual时,排序需要的内存由sort_area_size决定

   在执行order by/group by/distinct/union/create index/index rebuild/minus等操作时,
  如果在pga或sort_area_size中不能完成,排序将在临时表空间进行(disk sort),
  临时表空间主要作用就是完成系统中的disk sort.

12:存在表T(a,b,c,d),要根据字段c排序后取第21—30条记录显示,请给出sql
   create table t(a number(,b number(,c number(,d number();
  /
  begin      
    for i in 1 .. 300 loop
      insert into t values(mod(i,2),i/2,dbms_random.value(1,300),i/4);
    end loop;
  end;
  /
   select * from (select c.*,rownum as rn from (select * from t order by c desc) c) where rn between 21 and 30;
   /
  select * from (select * from test order by c desc) x where rownum < 30
  minus
   select * from (select * from test order by c desc) y where rownum < 20 order by 3 desc
   相比之 minus性能较差

二:数据库基本概念类

1:pctused and pctfree 表示什么含义有什么作用
  pctused与pctfree控制数据块是否出现在freelist中,
pctfree控制数据块中保留用于update的空间,当数据块中的free space小于pctfree设置的空间时,
该数据块从freelist中去掉,当块由于dml操作free space大于pct_used设置的空间时,该数据库块将
被添加在freelist链表中。
--PCTFREE存储参数
  PCTFREE存储参数告诉ORACLE什么时候应该将数据块从对象的空闲列表中移出。ORACLE的默认参数是PCTFREE=10;
也就是说,一旦一个INSERT操作使得数据块的90%被使用,这个数据块就从空闲列表(free list)中移出。
 --PCTUSED存储参数
  PCTUSED存储参数告诉ORACLE什么时候将以前满的数据块加到空闲列表中。当记录从数据表中删除时,数据库的数
据块就有空间接受新的记录,但只有当填充的空间降到PCTUSED值以下时,该数据块才被连接到空闲列表中,才可以往
其中插入数据。PCTUSED的默认值是PCTUSED=40。
--存储参数规则小结
  (1)PCTUSED较高意味着相对较满的数据块会被放置到空闲列表中,从而有效的重复使用数据块的空间,但会导致
I/O消耗。PCTUSED低意味着在一个数据块快空的时候才被放置到空闲列表中,数据块一次能接受很多的记录,因此可以
减少I/O消耗,提高性能。
  (2)PCTFREE的值较大意味着数据块没有被利用多少就从空闲列表中断开连接,不利于数据块的充分使用。PCTFREE
过小的结果是,在更新时可能会出现数据记录迁移(Migration)的情况。(注:数据记录迁移(Migration)是指记录在是
UPDATE操作扩展了一个VARCHAR2类型的列或BLOB列后,PCTFREE参数所指定的空间不够扩展,从而记录被ORACLE强制迁移到
新的数据块,发生这种情况将较严重的影响ORACLE的性能,出现更新缓慢)。
  (3)在批量的插入、删除或者更新操作之前,先删除该表上的索引,在操作完毕之后在重新建立,这样有助于提高
批量操作的整体速度,并且保证B树索引在操作之后有良好的性能。

---------------------------------------------------------------------------------------------------------------------------------------------------
--MartriWang@gmail.com 17/05/2007--
--表的pctfree和pctused两个参数进行估算的方法

对于不同的应用系统,表的pctfree 和pctused两个参数有不同的设计原则,以下是根据特定的应用系统进行估算的例子,从中可以掌握基本的估算方法。

表的存储参数调整,一般情况,设置为pctfree 5 pctused 85即可(缺省为pctfree 10 pctused 40)
1.对于Pctfree参数
除了可以按字段及字段长度估算平均行长外,下面的方面可以根据已有数据分析出平均行长和每块行数
例:
analyze table 病人信息 compute statistics for table for all indexes for all indexed columns;
Select Num_Rows,Blocks,Round(Num_Rows / Blocks) Avg_Rows_Block, Avg_Row_Len From User_Tables Where Table_Name = '病人信息'

    NUM_ROWS BLOCKS AVG_ROWS_BLOCK AVG_ROW_LEN   
857291 14161 61 117 

对于一般8192的块,实际可用空间为8100左右.
假设以前该表的pctfree为15,改为5后,pctfree减少10,就可以再存入约7行.

相同的1万4千块就可以多存放约10万行数据,
这10万行数据,如果按每块60行算,就可以少占用约1700块(约13M的空间)
如果全表扫描该表的话,少读1700块数据,少106次IO操作(按缺省db_file_multiblock_read_count=16计算)
少占13M的内存

另外,需要考虑的两个因素
1。更新操作时,数据增长量大不大,例如:主要是把状态字段由1改为3,还是把摘要由空改为一段文字
2。并发事务的多少,因为一个事务信息在块中要占用约24Byte,如果有10个并发事务的话,至少额外考虑240Byte的空闲空间。

2.对于Pctused参数
主要考虑删除后插入数据的情况多不多,以及平均行长大小
例如:
病人费用记录,医保如果存在校对操作的话,是先产生预交结算数据,正式结算时,删除这些数据再重新生成
所以,病人预交记录,Pctused不能设置太高,否则重用那些低于Pctused的块,只能插入少量数据行,增加了IO操作
analyze table 病人预交记录 compute statistics for table for all indexes for all indexed columns;
Select Num_Rows,Blocks,Round(Num_Rows / Blocks) Avg_Rows_Block, Avg_Row_Len From User_Tables Where Table_Name = '病人预交记录'

    NUM_ROWS BLOCKS AVG_ROWS_BLOCK AVG_ROW_LEN   
181758 2147 85 83 

如果设置pctfree 5 pctused 85,那么当删除一些行使块的已用空间低于85%时,块会被重用,但是因为要预留5%的空闲空间,
所以,对于已用空间刚刚低于85%的块,重用空间就只有10%,对于8K的块,可用810Byte,平均行长83,可以再放入9行,所以这个参数也是可以的。

但是,如果是病人费用记录,平均行长229,这样设置,只能放下3行,这个参数就不太合适了

    NUM_ROWS BLOCKS AVG_ROWS_BLOCK AVG_ROW_LEN   
925133 38278 24 229 

根据分析,病人费用记录的数据更新量不大,但是并发操作比较大,最好把Pctfree设置高一点
所以,可以设置为pctfree 10 pctused 75(重用的块至少可以放5行,约1-2张单据),甚至pctused 70也是可以的。

如果一个块的数据行数太多,可能造成热块争用,但是相对于减少存储,减少IO,减少内存占用带来的好处来说,热块不是特别突出的情况下可以不考虑。

--MartriWang@gmail.com 17/05/2007--

PCTFREE=(Average Row Size-Initial Row Size)*100/Average Row Size
PCTUSED=(100-PCTFREE) -Average Row Size * 100/Availabe Data Space
  
  Oracle的其中一个优点时它可以管理每个表空间中的自由空间。Oracle负责处理表和索引的空间管理,这样就可以让我们无需懂得Oracle的表和索引的
内部运作。不过,对于有经验的Oracle调优专家来说,他需要懂得Oracle是如何管理表的extent和空闲的数据块。对于调整拥有高的insert或者update的系
统来说,这是非常重要的。
  
  要精通对象的调整,你需要懂得freelists和freelist组的行为,它们和pctfree及pctused参数的值有关。这些知识对于企业资源计划(ERP)的应用是
特别重要的,因为在这些应用中,不正确的表设置通常是DML语句执行慢的原因。 
  对于初学者来说,最常见的错误是认为默认的Oracle参数对于所有的对象都是最佳的。除非磁盘的消耗不是一个问题,否则在设置表的pctfree和pctused
参数时,就必须考虑平均的行长和数据库的块大小,这样空的块才会被有效地放到freelists中。当这些设置不正确时,那些得到的freelists也是"dead"块,
因为它们没有足够的空间来存储一行,这样将会导致明显的处理延迟。
  Freelists对于有效地重新使用Oracle表空间中的空间是很重要的,它和pctfree及pctused这两个存储参数的设置直接相关。如果将pctused设置为一个高的值,
这时数据库就会尽快地重新使用块。不过,高性能和有效地重新使用表的块是对立的。在调整Oracle的表格和索引时,需要认真考虑究竟需要高性能还是有效的空
间重用,并且据此来设置表的参数。以下我们来看一下这些freelists是如何影响Oracle的性能的。
  
  当有一个请求需要插入一行到表格中时,Oracle就会到freelist中寻找一个有足够的空间来容纳一行的块。你也许知道,freelist串是放在表格或者索引的第
一个块中,这个块也被称为段头(segment header)。pctfree和pctused 参数的唯一目的就是为了控制块如何在freelists中进出。虽然freelist link和 unlink
是简单的Oracle功能,不过设置freelist link (pctused) 和unlink (pctfree) 对Oracle的性能确实有影响。
  
  由DBA的基本知识知道,pctfree参数是控制freelist un-links的(即将块由freelists中移除)。设置pctfree=10 意味着每个块都保留10%的空间用作行扩展。
pctused参数是控制freelist re-links的。设置pctused=40意味着只有在块的使用低于40%时才会回到表格的freelists中。
  
  许多新手对于一个块重新回到freelists后的处理都有些误解。其实,一旦由于一个删除的操作而令块被重新加入到freelist中,它将会一直保留在freelist中
即使空间的使用超过了60%,只有在到达pctfree时才会将数据块由freelist中移走。
  
  表格和索引存储参数设置的要求总结
  
  以下的一些规则是用来设置freelists, freelist groups, pctfree和pctused存储参数的。你也知道,pctused和pctfree的值是可以很容易地通过alter table
命令修改的,一个好的DBA应该知道如何设置这些参数的最佳值。
  
  有效地使用空间和高性能之间是有矛盾的,而表格的存储参数就是控制这个方面的矛盾:
  
  . 对于需要有效地重新使用空间,可以设置一个高的pctused值,不过副作用是需要额外的I/O。一个高的pctused值意味着相对满的块都会放到freelist中。因
此,这些块在再次满之前只可以接受几行记录,从而导致更多的I/O。
  
  . 追求高性能的话,可以将pctused设置为一个低的值,这意味着Oracle不会将数据块放到freelists中直到它几乎是空的。那么块将可以在满之前接收更多的行,
因此可以减少插入操作的I/O。要记住Oracle扩展新块的性能要比重新使用现有的块高。对于Oracle来说,扩展一个表比管理freelists消耗更少的资源。
  
  让我们来回顾一下设置对象存储参数的一些常见规则:
  
  .经常将pctused设置为可以接收一条新行。对于不能接受一行的free blocks对于我们来说是没有用的。如果这样做,将会令Oracle的性能变慢,因为Oracle将
在扩展表来得到一个空的块之前,企图读取5个"dead" 的free block。
  
  .表格中chained rows的出现意味着pctfree太低或者是db_block_size太少。在很多情况下,RAW和LONG RAW列都很巨大,以至超过了Oracle的最大块的大小,
这时chained rows是不可以避免的。
  
  .如果一个表有同时插入的SQL语句,那么它需要有同时删除的语句。运行单一个一个清除的工作将会把全部的空闲块放到一个freelist中,而没有其它包含有任何
空闲块的freelists出现。
  
  .freelist参数应该设置为表格同时更新的最大值。例如,如果在任何时候,某个表最多有20个用户执行插入的操作,那么该表的参数应该设置为freelists=20。
  
  应记住的是freelist groups参数的值只是对于Oracle Parallel Server和Real Application Clusters才是有用的。对于这类Oracle,freelist groups应该设置
为访问该表格的Oracle Parallel Server实例的数目。

---------------------------------------------------------------------------------------------------------------------------------------------------

2:简单描述table / segment / extent / block之间的关系
  table创建时,默认创建了一个data segment,
每个data segment含有min extents指定的extents数,
每个extent据据表空间的存储参数分配一定数量的blocks

3:描述tablespace和datafile之间的关系
一个tablespace可以有一个或多个datafile,每个datafile只能在一个tablespace内,
table中的数据,通过hash算法分布在tablespace中的各个datafile中,
tablespace是逻辑上的概念,datafile则在物理上储存了数据库的种种对象。

4:本地管理表空间和字典管理表空间的特点,ASSM有什么特点
  本地管理表空间(Locally Managed Tablespace简称LMT)
  8i以后出现的一种新的表空间的管理模式,通过位图来管理表空间的空间使用。
  字典管理表空间(Dictionary-Managed Tablespace简称DMT)
  8i以前包括以后都还可以使用的一种表空间管理模式,通过数据字典管理表空间的空间使用。
  动段空间管理(ASSM),
  它首次出现在Oracle920里有了ASSM,链接列表freelist被位图所取代,它是一个二进制的数组,
  能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善分段存储本质,
  ASSM表空间上创建的段还有另外一个称呼叫Bitmap Managed Segments(BMB 段)。

5:回滚段的作用是什么
事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,
          当用户回滚事务(ROLLBACK)时,ORACLE将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。
 
  事务恢复:当事务正在处理的时候,例程失败,回滚段的信息保存在undo表空间中,
           ORACLE将在下次打开数据库时利用回滚来恢复未提交的数据。

 读一致性:当一个会话正在修改数据时,其他的会话将看不到该会话未提交的修改。
           当一个语句正在执行时,该语句将看不到从该语句开始执行后的未提交的修改(语句级读一致性)
      当ORACLE执行SELECT语句时,ORACLE依照当前的系统改变号(SYSTEM CHANGE NUMBER-SCN)
      来保证任何前于当前SCN的未提交的改变不被该语句处理。可以想象:当一个长时间的查询正在执行时,
      若其他会话改变了该查询要查询的某个数据块,ORACLE将利用回滚段的数据前影像来构造一个读一致性视图。
  http://www.itpub.net/showthread. ... E%B5%C4%D7%F7%D3%C3

6:日志的作用是什么
  记录数据库事务,最大限度地保证数据的一致性与安全性

  重做日志文件:含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复,一个数据库至少需要两个重做日志文件
  归档日志文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。

http://www.cnoug.org/viewthread. ... hlight=%C8%D5%D6%BE

7:SGA主要有那些部分,主要作用是什么
  SGA:db_cache/shared_pool/large_pool/java_pool
db_cache:
  数据库缓存(Block Buffer)对于Oracle数据库的运转和性能起着非常关键的作用,
   它占据Oracle数据库SGA(系统共享内存区)的主要部分。Oracle数据库通过使用LRU
   算法,将最近访问的数据块存放到缓存中,从而优化对磁盘数据的访问.
shared_pool:
  共享池的大小对于Oracle 性能来说都是很重要的。
  共享池中保存数据字典高速缓冲和完全解析或编译的的PL/SQL 块和SQL 语句及控制结构
large_pool:
  使用MTS配置时,因为要在SGA中分配UGA来保持用户的会话,就是用Large_pool来保持这个会话内存
   使用RMAN做备份的时候,要使用Large_pool这个内存结构来做磁盘I/O缓存器
java_pool:
  为java procedure预备的内存区域,如果没有使用java proc,java_pool不是必须的
  
8racle系统进程主要有哪些,作用是什么
  数据写进程(dbwr):负责将更改的数据从数据库缓冲区高速缓存写入数据文件
  日志写进程(lgwr):将重做日志缓冲区中的更改写入在线重做日志文件
  系统监控(smon)  :检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复
  进程监控(pmon)  :负责在一个Oracle 进程失败时清理资源
  检查点进程(chpt):负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。
  归档进程(arcn)  :在每次日志切换时把已满的日志组进行备份或归档
  作业调度器(cjq)  :负责将调度与执行系统中已定义好的job,完成一些预定义的工作.
恢复进程(reco)  :保证分布式事务的一致性,在分布式事务中,要么同时commit,要么同时rollback;

三:备份恢复类

1:备份如何分类
逻辑备份:exp/imp
物理备份:
    RMAN备份
     full backup/incremental backup(累积/差异)
     热备份:alter tablespace begin/end backup;
     冷备份:脱机备份(database shutdown)
    
2:归档是什么含义
关于归档日志:Oracle要将填满的在线日志文件组归档时,则要建立归档日志(archived redo log)。
其对数据库备份和恢复有下列用处:
    <1>数据库后备以及在线和归档日志文件,在操作系统和磁盘故障中可保证全部提交的事物可被恢复。
    <2>在数据库打开和正常系统使用下,如果归档日志是永久保存,在线后备可以进行和使用。
  数据库可运行在两种不同方式下:
   NOARCHIVELOG方式或ARCHIVELOG 方式
数据库在NOARCHIVELOG方式下使用时,不能进行在线日志的归档,
如果数据库在ARCHIVELOG方式下运行,可实施在线日志的归档。

3:如果一个表在2004-08-04 10:30:00 被drop,在有完善的归档和备份的情况下,如何恢复?
  手工拷贝回所有备份的数据文件
sql>startup mount;
sql>alter database recover automatic until time '2004-08-04:10:30:00';
sql>alter database open resetlogs;

4:rman是什么,有何特点?
RMAN(Recovery Manager)是DBA的一个重要工具,用于备份、还原和恢复oracle数据库,
RMAN 可以用来备份和恢复数据库文件、归档日志、控制文件、系统参数文件,也可以用来执行完全或不完全的数据库恢复。
RMAN有三种不同的用户接口:
  COMMAND LINE方式、GUI 方式(集成在OEM 中的备份管理器)、API 方式(用于集成到第三方的备份软件中)。
具有如下特点:
1)功能类似物理备份,但比物理备份强大N倍;
2)可以压缩空块;
3)可以在块水平上实现增量;
4)可以把备份的输出打包成备份集,也可以按固定大小分割备份集;
5)备份与恢复的过程可以自动管理;
6)可以使用脚本(存在Recovery catalog 中)
7)可以做坏块监测

5:standby的特点
备用数据库(standby database):ORACLE推出的一种高可用性(HIGH AVAILABLE)数据库方案,
在主节点与备用节点间通过日志同步来保证数据的同步,备用节点作为主节点的备份
可以实现快速切换与灾难性恢复,从920开始,还开始支持物理与逻辑备用服务器。
  9i中的三种数据保护模式分别是:
  1)、MAXIMIZE PROTECTION :最大数据保护与无数据分歧,LGWR将同时传送到备用节点,
    在主节点事务确认之前,备用节点也必须完全收到日志数据。如果网络不好,引起LGWR不能传送数据,将引起严重的性能问题,导致主节点DOWN机。
  2)、MAXIMIZE AVAILABILITY :无数据丢失模式,允许数据分歧,允许异步传送。
    正常情况下运行在最大保护模式,在主节点与备用节点的网络断开或连接不正常时,自动切换到最大性能模式,
   主节点的操作还是可以继续的。在网络不好的情况下有较大的性能影响。
  3)、MAXIMIZE PERFORMANCE:这种模式应当可以说是从8i继承过来的备用服务器模式,异步传送,
    无数据同步检查,可能丢失数据,但是能获得主节点的最大性能。9i在配置DATA GUARD的时候默认就是MAXIMIZE PERFORMANCE

6:对于一个要求恢复时间比较短的系统(数据库50G,每天归档5G),你如何设计备份策略
  rman/每月一号 level 0 每周末/周三 level 1 其它每天level 2 

四:系统管理类

1:对于一个存在系统性能的系统,说出你的诊断处理思路
1 做statspack收集系统相关信息
  了解系统大致情况/确定是否存在参数设置不合适的地方/查看top 5 event/查看top sql等
2 查v$system_event/v$session_event/v$session_wait
   从v$system_event开始,确定需要什么资源(db file sequential read)等
  深入研究v$session_event,确定等待事件涉及的会话
  从v$session_wait确定详细的资源争用情况(p1-p3的值:file_id/block_id/blocks等)
3 通过v$sql/v$sqltext/v$sqlarea表确定disk_reads、(buffer_gets/executions)值较大的SQL

2:列举几种诊断IO、CPU、性能状况的方法
    top/vmstat
  statspack
  sql_trace/tkprof
    查v$system_event/v$session_event/v$session_wait
  查v$sqlarea(disk_reads或buffer_gets/executions较大的SQL)

3:对statspack有何认识
StapSpack是Oracle公司提供的一个收集数据库运行性能指标的软件包,该软件包从8i起,在9i、10g都有显著的增强
该软件包的辅助表(存储相关参数与收集的性能指标的表)由最初的25个增长到43个
收集级别参数由原来的3个(0、5、10)增加到5个(0、5、6、7、10)
通过分析收集的性能指标,数据库管理员可以详细地了解数据库目前的运行情况,对数据库实例、等待事件、SQL等进行优化调整
利用statspack收集的snapshot,可以统计制作数据库的各种性能指标的统计趋势图表。

4:如果系统现在需要在一个很大的表上创建一个索引,你会考虑那些因素,如何做以尽量减小对应用的影响
在系统比较空闲时
nologging选项(如果有dataguard则不可以使用nologging)
大的sort_ared_size或pga_aggregate_target较大

5:对raid1+0 和raid5有何认识
RAID 10(或称RAID 1+0)与RAID 0+1不同,它是用硬盘驱动器先组成RAID 1阵列,然后在RAID 1阵列之间再组成RAID 0阵列。
RAID 10模式同RAID 0+1模式一样具有良好的数据传输性能,但却比RAID 0+1具有更高的可靠性。RAID 10阵列的实际容量为M×n/2,
磁盘利用率为50%。RAID 10也需要至少4个硬盘驱动器构成,因而价格昂贵。
  RAID 10的可靠性同RAID 1一样,但由于RAID 10硬盘驱动器之间有数据分割,因而数据传输性能优良。

RAID 5与RAID 3很相似,不同之处在于RAID 5的奇偶校验信息也同数据一样被分割保存到所有的硬盘驱动器,
而不是写入一个指定的硬盘驱动器,从而消除了单个奇偶校验硬盘驱动器的瓶颈问题。RAID 5磁盘阵列的性能比RAID 3有所提高,
但仍然需要至少3块硬盘驱动器。其实际容量为M×(n-1),磁盘利用率为(n-1)/n 。

五:综合随意类

1:你最擅长的是oracle哪部分?
pl/sql及sql优化

2:喜欢oracle吗?喜欢上论坛吗?或者偏好oracle的哪一部分?
喜欢,sql的优化

3:随意说说你觉得oracle最有意思的部分或者最困难的部分
latch free的处理

4:为何要选择做DBA呢?
兴趣所在

--MartriWang@gmail.com 17/05/2007--
消耗在准备利用Oracle执行计划机制提高查询性能新的SQL语句的时间是Oracle SQL语句执行时间的最重要的组成部分。
但是通过理解Oracle内部产生执行计划的机制,你能够控制Oracle花费在评估连接顺序的时间数量,并且能在大体上提高查询性能。
准备执行SQL语句
当SQL语句进入Oracle的库缓存后,在该语句准备执行之前,将执行下列步骤:
1) 语法检查:检查SQL语句拼写是否正确和词序。

2) 语义分析:核实所有的与数据字典不一致的表和列的名字。

3) 轮廓存储检查:检查数据字典,以确定该SQL语句的轮廓是否已经存在。

4) 生成执行计划:使用基于成本的优化规则和数据字典中的统计表来决定最佳执行计划。

5) 建立二进制代码:基于执行计划,Oracle生成二进制执行代码。

一旦为执行准备好了SQL语句,以后的执行将很快发生,因为Oracle认可同一个SQL语句,并且重用那些语句的执行。然而,对于生成
特殊的SQL语句,或嵌入了文字变量的SQL语句的系统,SQL执行计划的生成时间就很重要了,并且前一个执行计划通常不能够被重用。
对那些连接了很多表的查询,Oracle需要花费大量的时间来检测连接这些表的适当顺序。

评估表的连接顺序

在SQL语句的准备过程中,花费最多的步骤是生成执行计划,特别是处理有多个表连接的查询。当Oracle评估表的连接顺序时,它必须
考虑到表之间所有可能的连接。例如:六个表的之间连接有720(6的阶乘,或6 * 5 * 4 * 3 * 2 * 1 = 720)种可能的连接线路。
当一个查询中含有超过10个表的连接时,排列的问题将变得更为显著。对于15个表之间的连接,需要评估的可能查询排列将超过1万亿
(准确的数字是1,307,674,368,000)种。

使用optimizer_search_limit参数来设定限制

通过使用optimizer_search_limit参数,你能够指定被优化器用来评估的最大的连接组合数量。使用这个参数,我们将能够防止优化器
消耗不定数量的时间来评估所有可能的连接组合。如果在查询中表的数目小于optimizer_search_limit的值,优化器将检查所有可能的
连接组合。

例如:有五个表连接的查询将有120(5! = 5 * 4 * 3 * 2 * 1 = 120)种可能的连接组合,因此如果optimizer_search_limit等于5
(默认值),则优化器将评估所有的120种可能。optimizer_search_limit参数也控制着调用带星号的连接提示的阀值。当查询中的表的
数目比optimizer_search_limit小时,带星号的提示将被优先考虑。

另一个工具:参数optimizer_max_permutations

初始化参数optimizer_max_permutations定义了优化器所考虑组合数目的上限,且依赖于初始参数optimizer_search_limit。
optimizer_max_permutations的默认值是80,000。

参数optimizer_search_limit和optimizer_max_permutations一起来确定优化器所考虑的组合数目的上限:除非(表或组合数目)
超过参数optimizer_search_limit 或者 optimizer_max_permutations设定的值,否则优化器将生成所有可能的连接组合。一旦优
化器停止评估表的连接组合,它将选择成本最低的组合。

使用ordered提示指定连接顺序你能够设定优化器所执行的评估数目的上限。但是即使采用有很高价值的排列评估,我们仍然拥有使优化器可以尽早 地放弃复杂的查询的重要机会。回想一下含有15个连接查询的例子,它将有超过1万亿种的连接组合。如果优化器在评估了80,000个组合后停止,那么它才 仅仅评估了0.000006%的可能组合,而且或许还没有为这个巨大的查询找到最佳的连接顺序。

在Oracle SQL中解决此问题的最好的方法是手工指定表的连接顺序。为了尽快创建最小的解决方案集,这里所遵循的规则是将表结合起来,通常优先使用限制最严格的WHERE子句来连接表。
 

Javascript高效简洁代码的编写及优化技巧

 

真假的判断


Javascript
中有null、undefined、string、number、boolean五种基本的类型,一般判断真假或者为空的时候大家会使用下面的代码:

if(a==true){
    //doSomeTing();
}

但是这种方法很不简洁,我们完全可以使用1,0来判断,比如我们设定一个a,如果a为假,我们就改成真,而a在程序后面可能用于判断,最简单也是最好理解的方法就是下面的写法

var a=false;
if(a==false){
    a=true;
}

既然提到了0,1,肯定有人想到了第二种写法:

var a=0;
if(!a){
    a=1;
}

这个代码还可以进一步简写优化,就是使用js的三元运算符,也就是三目运算符:

var a=0;
!a?a=1?null;

还有一点,对于空字符串的判断,往往采用if(a==”"),其实对于空字符本身就是false,下面我总结了下Javascript中的真假值,希望对大家有用
 


JavaScript 中的真假值
类型 真假值
Null 总是为假(false)
Undefined 总是为假(false)
Boolean 保持真假值不变
Number +0,-0 或是 NaN 的时候为假,其它值为真
String 空字符串的时候为假,其它值为真
Object 总是为真(true)

 


组跟对象的定义


对于类似下面的正统数组跟对象的定义

var a=new Array;
var b=new obj;
obj.name="WYQ";
obj.webSite="http://www.2fool.cn";

我们可以使用

var a=[];
var b={name:"WYQ",webSite:"http://www.2fool.cn"};

来代替


环的控制


在使用循环遍历时候要注意提前把长度或者要计算的长度记录下来,如下面的写法

var list = document.getElementsByTagName('p');
for (var i = 0, l = list.length; i < l; i++) {//注意此处把list的长度提前计算出来,避免了每次循环重复计算
    ……
}

注意循环体内部的写法,该放在外面的放在外面如下面的代码

var list = $(".abc");
for (var i = 0, l = list.length; i < l; i++) {//注意此处把list的长度提前计算出来,避免了每次循环重复计算
    var a=list[i].html();
    $("#abc").after(a);
}

我们分析一下:每次循环的时候,都要首先解析$(”#abc”);势必效率变低,接着在使用after插入到#abc中去。这样子写效率会很低的,而下面的写法就高效了

var list = $(".abc");
var b = $("#abc");
for (var i = 0, l = list.length; i < l; i++) {//注意此处把list的长度提前计算出来,避免了每次循环重复计算
    var a=list[i].html();
    b.after(a);
}

这样的写法还不是最高效的,看下面的方法

var list = $(".abc");
var b = "";
for (var i = 0, l = list.length; i < l; i++) {//注意此处把list的长度提前计算出来,避免了每次循环重复计算
    b+=list[i].html();
}
$("#abc").after(b);

看似简单的Javascript代码,其实要做的功夫很多!


while还是for?


对于我来说,那个使用的方便,那个用的变量少使用那个,如对顺序没有关系的循环可以使用while,如下面的两段代码,前者使用了for,后者使用了while,两者明显while使用的变量少,虽然for容易使大家理解

//使用for
var arr = [1,2,3,4,5,6,7];
var sum = 0;
for (var i = 0, l = arr.length; i < l; i++) {
    sum += arr[i];
}   
//使用while
var arr = [1,2,3,4,5,6,7];
var sum = 0, l = arr.length;
while (l--) {
    sum += arr[l];
}


件判断的优化技巧


1、对于可能性的排列按照从高到底的顺序进行排列

原因很简单,可以减少程序的试探次数。
2、使用三目运算符三目运算符比if else判断语句效率高,而且往往代码比较简洁如下面的两段代码

//使用if else
if (a > b) {
    num = a;
} else {
    num = b;
}
//三目运算符
num = a > b ? a : b;
//谁说三目不能代替if else的function?
c=a>b?function(){
            }:function(){
                 };
c();

使用switch 代替if对于同一个条件不同情况的判断,使用switch简洁易懂,并且switch本身比if效率要高,在IE下尤为明显!


=与===的区别


看过jQuery
源码的朋友发现,其中很多使用的是===,而不是==,这是因为===的效率比==要高,但是使用===要注意,===不会进行类型的转换,比如如果你确定比较两者类型相同,推荐使用===,这也是大家在编写代码时候自己细节的养成。当然也有一定的注意情况,下面仔细的说说==跟===的区别


=== 操作符的判断算法

在使用 === 来判断两个值是否相等的时候,如判断x===y,会首先比较两个值的类型是否相等,如果不相等的话,直接返回 false 。接着根据 x 的类型有不同的判断逻辑。

如果 x 的类型是 Undefined 或 Null,则返回 true 。
如果 x 的类型是 Number,只要 x 或 y 中有一个值为 NaN,就返回 false ;如果 x 和 y 的数字值相等,就返回 true ;如果 x 或 y 中有一个是 +0,另外一个是 -0,则返回 true 。
如果 x 的类型是 String,当 x 和 y 的字符序列完全相同时返回 true,否则返回 false 。
如果 x 的类型是 Boolean,当 x 和 y 同为 true 或 false 时返回 true,否则返回 false 。
当 x 和 y 引用相同的对象时返回 true,否则返回 false 。
== 操作符的判断算法

在使用 == 来判断两个值是否相等的时候,如判断x==y,当 x 和 y 的类型一样的时候,判断逻辑与 === 一样;如果 x 和 y 的类型不一样,== 不是简单的返回 false,而是会做一定的类型转换。

如果 x 和 y 中有一个是 null,另外一个是 undefined 的话,返回 true 。如null == undefined。
如果 x 和 y 中一个的类型是 String,另外一个的类型是 Number 的话,会将 String 类型的值转换成 Number 来比较。如3 == “3″。
如果 x 和 y 中一个的类型是 Boolean 的话,会将 Boolean 类型的值转换成 Number 来比较。如true == 1、true == “1″
如果 x 和 y 中一个的类型是 String 或 Number,另外一个的类型是 Object 的话,会将 Object 类型的值转换成基本类型来比较。如[3,4] == “3,4″
需要注意的是 == 操作符不一定是传递的,即从A == B, B == C并不能一定得出A == C。考虑下面的例子,var str1 = new String(”Hello”); var str2 = new String(”Hello”); str1 == “Hello”; str2 == “Hello”,但是str1 != str2。


ypeof使用时候注意


对于同一个var a=”abc”;
在FF下typeof a==string 返回 true
在IE下返回false,IE就是这样的娇贵!
推荐写法:


typeof a==”string”


后,尽量避免使用eval等语句!


eval、Function、execScript等语句会再次使用javascript解析引擎进行解析,需要消耗大量的执行时间。

标签: js, 优化

HTML代码优化

目录
一. 为什么要优化?
二. 优化原则
三. 优化技巧
四. SEO
五. 关于网页标准

  1. 何谓标准?
  2. 使用标准价值在哪?
  3. 团队合作流程
  4. 如何实现

六. 实例分析

  1. 删除空标签
  2. 合并标签
  3. 合理安排表格布局
  4. 表格列表优化
  5. 利用<div>简化代码

 




一. 为什么要优化?

  1. 节省带宽
    服务器带宽是有限制的,为了支持更多在线人数,可以租用更多带宽,也可以增加服务器,但如果能通过优化代码减小网页体积,例如减少50%,那原本支持1000人同时在线的带宽现在就可以支持2000人了,这样就节省了昂贵的带宽费用
  2. 利于程序员编写代码
    静态页面转为动态页面时,经常要分析结构,把重复代码改为循环,因此简洁的代码有利用提高效率
  3. 减少页面下载及解析时间
    虽然现在大部分都是宽带,带宽非常充足,但一般访客都不只打开一个页面,而是同时访问多个网站,加上聊天、下载等工具占用一定带宽,这样带宽就显得拥挤了,减少页面体积可以缩短下载时间,同时也能减少客户端浏览器的解析时间


二. 优化原则

  1. 不影响原外观
  2. 不要把整个页面放到一个table里面
  3. 不要嵌套太多表格,因为表格需要代码全部下载才能显示出来
  4. 不要用太大、太多Flash动画
  5. 不要用太多JavaScript特效,用户是来看内容不是看特效
  6. 尽量把大图切成小图,可以再次利用的图片就无需再另切图了


三. 优化技巧

  1. 使用静态页面可以有效减少服务器资源占用
  2. 重复使用的样式写到外部CSS文件,一般是整站一个共用CSS文件,各独立栏目共用一个CSS文件,某页面特有的可以写在本页面内
  3. 需要从数据库读取但又不经常更换的内容,写到单独JS文件,例如各个栏目,内容是从数据库获取的,但又不会频繁更换
  4. 需要链接外部的Flash、图片等,可以用iframe标签,避免外部网络延迟而拖慢整体页面显示


四. SEO
SEO全称是Search Engine Optimization,即针对搜索的优化。网站在推出之后,最大的难点莫过于推广,而通过搜索引擎带来的流量是不可忽视的,如何通过优化代码使搜索引擎最大限度的收录,也就成为重要课题。

  1. 明确的标题,即<title>标签
    例如搜索“电脑”,搜索结果有2个页面,一个标题包含“电脑”,另一个只包含在正文<body>标签中,第一个页面会排第一位。
    根据观察,各搜索引擎都会对标题进行截断,具体为baidu20字、google30字、Yahoo20字、MSN Search25字(均为中文)
    所以标题不能过长,要跟正文内容符合,例如一个《碟中碟》电影页面,标题可以为“碟中碟 汤姆克鲁斯 酷娱乐 91Q.com”
  2. META标记
    <meta name="description" content="网页简述">
    <meta name="keywords" content="关键字">
  3. 链接文本
    文章、新闻经常标题过长,为了页面美观而不得不截短,加入title属性,一来有利于访客阅读完整标题,也有利于搜索引擎的收录
    <a href="test.htm" title="浅谈Flash ActionScript代码优化">浅谈Flash ActionScr…</a>
  4. 图像
    同上,相应属性为alt
  5. 另外其它如<h1><input>都可以加入关键字
    SEO还包括其它方面的内容,以上只是在代码方面的优化


五. 关于网页标准

  1. 何谓标准?
    网页标准是进2年流行的话题,简单的说,就是抛弃HTML+Table改用XHTML+CSS来写网页,做到结构和样式分离。XHTML标准分过渡型和严格型,其中过渡型可以使用table,而严格型只能用div来进行布局。
  2. 使用标准价值在哪?
    1. 易于维护
      HTML代码发展到现在,已经变得十分臃肿,这对网页设计师来说是非常不利的,特别在重构大型网站的时候,经常显得力不从心
    2. 加速开发
      通过结构与表现层分离,可以优化团队工作流程,提高工作效率
    3. 拓展访问渠
      不需做大改动即可在PDA等掌上设备浏览
    4. 节约带宽成本
      一般运用网页标准进行网站重构之后,代码可以减少一半以上,每页面如果能减少几十K,乘以访问量,一个月下来,就可以节约昂贵的带宽费用了
    5. 提高用户体验
      干净简介的代码,总比臃肿复杂代码显示得快,用户不必再忍受缓慢的访问速度
  3. 团队合作流程
  4. 如何实现
    1. XHTML标签和属性全部要小写,比如<BODY><HEAD><BR />
    2. 标签注意要关闭,常见的比如<br /><input />等,还有<img src="" alt="" />,别把alt属性忘记了
    3. 不用<font>标签,可以用<span>标签加CSS定义
    4. XHTML不具备HTML标签所有属性和值,例如居中align='absmiddle',在XHTML里面是没有absmiddle值的,只有top/bottom/right/left/center,某些属性例如onload也被废除了
    5. 公用函数<script></script>放在<head></head>之间,共有的写在单独文件再在网页导入
    6. 尽量用div布局而不用table,但table还是可以用的


六. 实例分析

  1. 删除空标签
    <td height="23"><div align="left" class="lineh15 style4"> <a href="#">剧情看点: </a><%=exStr1%></div><div align="left"></div></td>
    <div align="left"></div> 是可以去掉的
  2. 合并标签
    <td height="23"><div align="left"><strong><%=sShowName%></strong></div></td>
    div太多,不仅影响浏览器解析,还可能因为未关闭标签造成错乱,也给编辑带来困难,例如用DW打开,如下图


    表格和div密密麻麻的N多线
    <div align="left"> 的作用是左对其,其实在表格设置水平左对其也一样,修改后为
    <td height="23" align="left"><strong><%=sShowName%></strong></td>
  3. 合理安排表格布局

    上图红色表示表格,绿色表示div层,可以看出里面嵌套了4层表格,同时也用了div来使文字靠左,其实<td>标签也有水平位置的align属性,而且表格默认就是左对齐,所以div标签完全可以取消,整理一下,结果如下图
  4. 表格列表优化


    如上图,红色表示表格,绿色是DIV,可以看出套了很多表格,整理一下所要的效果,无非是外面圆角边框加里面数据,其中数据又分上下两部分,上面是图片加文字,而下面是文字。
    下图是优化后,可以看出只有2个表格嵌套,结构很简洁。


    优化过程:
    1. 将【本类排行】表格,放到外面表格中,作为一行而不是单独表格
    2. 排行第一的电影,原先用了几个表格嵌套,现改用div将图片浮动左边,文字会自动插入到右边空白处
    3. 下面的2-10排行不再用表格分割,改用<li>标签,再用css进行修饰

    代码片段:
    CSS部分
    #test{
    color:#000000;
    list-style:none;
    line-height:200%;
    margin:5px 0 0 10px;
    }
    #test li{
    border-bottom:1px dotted #FFFFFF;
    }

    排行列表
    <li>2.新精武门</li>
    <li>3.赌圣2之街头赌圣</li>
    <li>4.流氓状元</li>
    <li>5.韩2005爆笑性喜..</li>
    <li>6.我的野蛮本色</li>
    <li>7.捣蛋三人组-整蛊王</li>
    <li>8.笑林小子2之乌龙院</li>
    <li>9.妓女竞选总统记</li>
    <li>10.一见钟性</li>

    优化后代码字数为原来32%
  5. 利用<div>简化代码   (该节不全)

    如上图,五部影片所在的表格,先是用<td>分割,再用<div>定义样式(主要是定义字体大小),其中影片截图,为了显示圆边框,又套了一个表格,表格采用九宫格布置。单个电影代码如下:
    <td height="52" align="center" class="lineh15"><div align="left" class="size14">
       <table border="0" cellspacing="0" cellpadding="0">
         <tr>
           <td width="6" height="6"><img src="http://www.21ido.com/bbs/images/ttl.jpg" width="6" height="6"></td>
           <td background="http://www.21ido.com/bbs/images/tt.jpg"><img src="http://www.21ido.com/bbs/images/tt.jpg" width="1" height="6"></td>
           <td width="6" height="6"><img src="http://www.21ido.com/bbs/images/ttr.jpg" width="6" height="6"></td>
         </tr>
         <tr>
           <td background="http://www.21ido.com/bbs/images/tl.jpg"><img src="http://www.21ido.com/bbs/images/tl.jpg" width="6" height="1"></td>
           <td width="65" height="75"><a href="movie2.jsp?sTypeId=164&sPgmId=176"><img src="http://cqmovie.bqol.com.cn:8092/logo/凤凰大视野:天空铁路01.jpg" width="92" height="124" border="0"></a></td>
           <td background="http://www.21ido.com/bbs/images/tr.jpg"><img src="http://www.21ido.com/bbs/images/tr.jpg" width="6" height="1"></td>
         </tr>
         <tr>
           <td width="6" height="6"><img src="http://www.21ido.com/bbs/images/tbl.jpg" width="6" height="6"></td>
           <td background="http://www.21ido.com/bbs/images/tb.jpg"><img src="http://www.21ido.com/bbs/images/tb.jpg" width="1" height="6"></td>
           <td width="6" height="6"><img src="http://www.21ido.com/bbs/images/tbr.jpg" width="6" height="6"></td>
         </tr>
         <tr>
           <td class="lineh15" colspan="3"><div align="center"><span class="title-16px120b-B00000"><a href="movie2.jsp?sTypeId=164&sPgmId=176">北纬17度线</a></span></div></td>
         </tr>
       </table>
    </div></td>