天蠶在你身邊
不方便打電話?讓天蠶聯(lián)絡(luò)你
天蠶在你身邊
不方便打電話?讓天蠶聯(lián)絡(luò)你
天蠶重慶網(wǎng)絡(luò)公司:我們在進(jìn)行系統(tǒng)或者我們叫它軟件,在開進(jìn)行開發(fā)時(shí),對它的數(shù)據(jù)庫以及結(jié)構(gòu),是需要作一些必要優(yōu)化處理的,下面來看看詳細(xì)的介紹:
1. 程序優(yōu)化
a. 當(dāng)只限取前面N條記錄時(shí),不要用 select * ,然后再用ADO分頁
改為 select top N 字段列表 這樣的語句會(huì)高效很多
b. 統(tǒng)計(jì)記錄數(shù)時(shí)不要用 select * from .... 這樣的語句,改
用 select count(1) from .... 這樣會(huì)好很多
c. 盡量避免使用 select * from table 這樣的sql語句,這樣會(huì)導(dǎo)致程序從數(shù)據(jù)庫里讀取太多無用的數(shù)據(jù),一般來說應(yīng)該使用
select 字段1,字段2 from table 這種形式,只從數(shù)據(jù)庫里讀取必要的數(shù)據(jù),這樣能大大提高程序讀取數(shù)據(jù)庫的效率
d. 不要用嵌套查詢,比如
<%
sql = "select col1,col2 from a"
set rs = server.createobject("adodb.recordset")
rs.open sql,conn,1,1
while not rs.eof
sql2 = "select col1,col2 from b where id=" & rs("id")
set rs2 = server.createobject("adodb.recordset")
rs2.open sql2,conn,1,1 '這里用了嵌套查詢,效率會(huì)下降很多,如果數(shù)據(jù)庫的時(shí)候根本沒法運(yùn)行
while not rs2.eof
response.write rs("id") & "=" & rs2("name")
rs2.movenext
wend
rs.movenext
wend
%>
如果改為
<%
sql = "select a.id ,b.name from a left join b on b.id=a.id" '使用連表操作,并用具體的字段名代替 *,程序是高效很多
set rs = server.createobject("adodb.recordset")
rs.open sql,conn,1,1
while not rs.eof
response.write rs("id") & "=" & rs("name")
rs.movenext
wend
%>
2. 數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化
a. 比如一些標(biāo)志信息是否認(rèn)證之類的字段要建索引卻沒有建
b. 表沒有設(shè)主鍵,加上主鍵
c. 外鍵一般都要加上索引
3. 對于 access 數(shù)據(jù)庫:
access 數(shù)據(jù)是一個(gè)桌面型的數(shù)據(jù)庫系統(tǒng),它只能應(yīng)付一些數(shù)據(jù)量少且訪問量不大的網(wǎng)站,如果access的數(shù)據(jù)庫超過
100M 以上,性能會(huì)急速下降,并且 access 數(shù)據(jù)庫的數(shù)據(jù)庫驅(qū)動(dòng)程序只能應(yīng)付同時(shí)15個(gè)進(jìn)程共享,也就是說它最多只能
允許15個(gè)人同時(shí)打開它,對于大訪問量的網(wǎng)站來說這是很低的一個(gè)數(shù)值,所以一般訪問量大或者是數(shù)據(jù)量大的網(wǎng)站一般
要采用 sqlserver 或者 mysql 等高性能的數(shù)據(jù)庫服務(wù)器平臺(tái)。
有很多人使用 access 數(shù)據(jù)庫時(shí)并沒有對數(shù)據(jù)庫的結(jié)構(gòu)進(jìn)行優(yōu)化,這也是造成網(wǎng)站程序效率低下的另一個(gè)重要原因
一般來說每個(gè)數(shù)據(jù)表都要設(shè)置一個(gè)主鍵,并且其外鍵一般都要建立索引,還有一些標(biāo)志性的字段(如果標(biāo)記一條信息是否是
通過審核等)如果不是布爾型的話,一般來說也應(yīng)該建立索引。
在查詢程序優(yōu)化方面 , 如果用 ADODB.Recoedset 自帶的分頁功能,也是存在問題,
因?yàn)橛肁DO分頁的話,這個(gè)對象是先將很多的記錄選出來,加載到對象里(這將導(dǎo)致這個(gè)對象可能會(huì)加載成千上萬的記錄),
再在對象里通過移動(dòng)記錄游標(biāo)等操作來達(dá)到定位到某一行的目的,當(dāng)數(shù)據(jù)量大的時(shí)候,性能也會(huì)急速下降。
如果采用 where RecID NOT IN(....) 這種結(jié)構(gòu)的話,雖然記錄集不會(huì)加載很多的數(shù)據(jù),但是在數(shù)據(jù)庫引擎在查詢時(shí)
做這種NOT IN(...) 的比較是很費(fèi)時(shí)間的,比如 NOT IN 的列表里有 1000 個(gè)記錄ID,這在查詢是將導(dǎo)致對整個(gè)數(shù)據(jù)表
的每一條記錄都跟這1000個(gè)ID進(jìn)行比較,比如數(shù)據(jù)表里有 3000 條記錄,那么執(zhí)行這條 sql 的時(shí)候?qū)?dǎo)致 3000*1000 這么
多次的比較,效率之低是可想而知的.
對于分頁的優(yōu)化方法:
采用分步查詢,這個(gè)方法可能要對數(shù)據(jù)表的結(jié)構(gòu)作一些修改.
1. 數(shù)據(jù)表本身的主鍵( 比如是 RecID )應(yīng)該是數(shù)字類型的。
2. 要查詢分頁的時(shí)候
(1). 先得出不應(yīng)該包含在最終查詢結(jié)果里的記錄的最大ID號(hào),比如
比如要查詢第 100 條記錄以后的 N (N=每頁的記錄數(shù)) 條記錄,可這樣做:
<%
SQLMAXID = "SELECT MAX(RecID) FROM(SELECT TOP 100 RecID FROM ChatRec WHERE RecID>0 ORDER BY RecID)"
'這里只返回一個(gè)值,就是最大的ID
%>
(2). 執(zhí)行最終的數(shù)據(jù)查詢
比如
<%
SQL = "SELECT TOP 每頁的記錄條數(shù) * FROM ChatRec WHERE RecID>("& SQLMAXID &") ORDER BY RecID"
'這里是找出 ID > MAXID 的前 N 條記錄
%>
這樣的話避免用 NOT IN(...) 這個(gè)語句,效率會(huì)提高很多
說明:用這個(gè)方法有一點(diǎn)一定要注意的是子查詢跟主查詢都必須要按某個(gè)字段用相同的規(guī)則排序,比如像例子中的 ORDER BY RecID
并且一般建議用主鍵來進(jìn)行排序
4.asp程序中應(yīng)盡量避免用 on error resume next
很多用戶會(huì)采用 on error resume next 來屏蔽掉出錯(cuò)信息,這樣雖然可以讓訪客看不到出錯(cuò)信息,界面友好一些,但是這樣可能會(huì)帶來非常嚴(yán)重的問題:當(dāng)程序出錯(cuò)后,如果沒有及時(shí)的捕獲異常,從而中止程序執(zhí)行的話,很空間導(dǎo)致程序出現(xiàn)死循環(huán),導(dǎo)致服務(wù)器當(dāng)機(jī),所以只有在非常必要的情況下才好使用 on error resume next ,并且在使用on error resume next后及時(shí)捕獲異常,如果出現(xiàn)錯(cuò)誤就中止程序執(zhí)行。比如:
<%
set conn = Server.CreateObject("ADODB.Connection")
connstr = "Driver={SQL Server};Server=db107.72dns.com;UID=abc;WD=abc;Database=abc"
on error resume next '這里的用 on error resume next 是為了屏蔽連接數(shù)據(jù)庫時(shí)出錯(cuò)的信息
err.clear
conn.open connstr
if err.number<>0 then '這里開始及時(shí)捕獲異常,中止程序執(zhí)行,否則很容易死循環(huán)而令服務(wù)器當(dāng)機(jī)
response.write "鏈接數(shù)據(jù)庫服務(wù)器出錯(cuò)"
response.end
end if
%>
天蠶重慶網(wǎng)絡(luò)公司總結(jié): 如果網(wǎng)站的訪問量大并且數(shù)據(jù)庫查詢操作的任務(wù)比較重,要考慮采用自動(dòng)生成靜態(tài)頁面然后定時(shí)自動(dòng)更新的技術(shù)
地址:重慶市渝中區(qū)上清寺鑫隆達(dá)B座28-8
郵編:400015
電話:023-63612462
EMAIL:cnjl_net@163.com