久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

通用數(shù)據(jù)庫優(yōu)化

 終為始 2019-08-05

SQL語句的優(yōu)化

0) 盡量多建立索引,,改匹配索引為查找索引,。

1) 盡量避免耗時(shí)操作。

帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BYSQL語句會啟動SQL引 執(zhí)行,,耗費(fèi)資源的排序(SORT)功能,。DISTINCT需要一次排序操作而其他的至少需要執(zhí)行兩次排序

2) 如果無需排除重復(fù)值或是操作集無重復(fù)則用UNION ALL, UNION更費(fèi)事(因?yàn)橐容^)

UNION因?yàn)闀⒏鞑樵冏蛹挠涗涀霰容^,,故比起UNION ALL ,,通常速度都會慢上許多。一般來說,,如果使用UNION ALL能滿足要求的話,, 務(wù)必使用UNION ALL。還有一種情況大家可能會忽略掉,,就是雖然要求幾個(gè)子集的并集需要過濾掉重復(fù)記錄,,但由于腳本的特殊性,不可能存在重復(fù)記錄,,這時(shí)便應(yīng)該使用UNION ALL,,如xx模塊的某個(gè)查詢程序就曾經(jīng)存在這種情況,見,,由于語句的特殊性,,在這個(gè)腳本中幾個(gè)子集的記錄絕對不可能重復(fù),故可以改用UNION ALL)連接操作

3) 避免在WHERE子句中使用in,,not  in,,or 或者having
可以使用 exist not exist代替 innot in
可以使用表鏈接代替 exist,。
Having
可以用where代替,,如果無法代替可以分兩步處理。
例子

1. SELECT * FROM ORDERS WHERE CUSTOMER_NAME NOT IN

2. (SELECT CUSTOMER_NAME FROM CUSTOMER)

優(yōu)化

1. SELECT * FROM ORDERS WHERE CUSTOMER_NAME not exist

2. (SELECT CUSTOMER_NAME FROM CUSTOMER)

4) 不要在建立的索引的數(shù)據(jù)列上進(jìn)行下列操作:
1)避免對索引字段進(jìn)行計(jì)算操作

2)避免在索引字段上使用not,,<>,,!=

3)避免在索引列上使用IS NULLIS NOT NULL

4)避免在索引列上出現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換

5避免在索引字段上使用函數(shù)

例如:where trunc(create_date)=trunc(:date1)
雖然已對create_date 字段建了索引,但由于加了TRUNC,,使得索引無法用上,。此處正確的寫法應(yīng)該是
where create_date>=trunc(:date1) and create_date

6)避免建立索引的列中使用空值。

5) 查詢的模糊匹配

盡量避免在一個(gè)復(fù)雜查詢里面使用 LIKE '%parm1%'—— 紅色標(biāo)識位置的百分號會導(dǎo)致相關(guān)列的索引無法使用,,最好不要用,。

解決辦法:

其實(shí)只需要對該腳本略做改進(jìn),查詢速度便會提高近百倍,。改進(jìn)方法如下:

a,、修改前臺程序——把查詢條件的供應(yīng)商名稱一欄由原來的文本輸入改為下拉列表,用戶模糊輸入供應(yīng)商名稱時(shí),,直接在前臺就幫忙定位到具體的供應(yīng)商,這樣在調(diào)用后臺程序時(shí),,這列就可以直接用等于來關(guān)聯(lián)了,。

b、直接修改后臺——根據(jù)輸入條件,,先查出符合條件的供應(yīng)商,,并把相關(guān)記錄保存在一個(gè)臨時(shí)表里頭,然后再用臨時(shí)表去做復(fù)雜關(guān)聯(lián)

6) 避免使用臨時(shí)表
(1)
除非卻有需要,,否則應(yīng)盡量避免使用臨時(shí)表,,相反,可以使用表變量代替;
(2)
大多數(shù)時(shí)候(99%),,表變量駐扎在內(nèi)存中,,因此速度比臨時(shí)表更快,臨時(shí)表駐扎在TempDb數(shù)據(jù)庫中,,因此臨時(shí)表上的操作需要跨數(shù)據(jù)庫通信,,速度自然慢。

可以使用聯(lián)合(UNION)來代替手動創(chuàng)建的臨時(shí)表

MySQL 從 4.0 的版本開始支持 UNION 查詢,,它可以把需要使用臨時(shí)表的兩條或更多的 SELECT 查詢合并的一個(gè)查詢中,。在客戶端的查詢會話結(jié)束的時(shí)候,臨時(shí)表會被自動刪除,,從而保證數(shù)據(jù)庫整齊,、高效。使用 UNION 來創(chuàng)建查詢的時(shí)候,我們只需要用UNION作為關(guān)鍵字把多個(gè)SELECT語句連接起來就可以了,,要注意的是所有 SELECT 語句中的字段數(shù)目要想同,。下面的例子就演示了一個(gè)使用 UNION的查詢。

代碼如下:

1. SELECT Name, Phone FROM client UNION SELECT Name, BirthDate FROM author

2. UNION

3. SELECT Name, Supplier FROM product

7) 盡量少做重復(fù)的工作
盡量減少無效工作,,但是這一點(diǎn)的側(cè)重點(diǎn)在客戶端程序,,需要注意的如下:
A
控制同一語句的多次執(zhí)行,,特別是一些基礎(chǔ)數(shù)據(jù)的多次執(zhí)行是很多程序員很少注意的
B
,、減少多次的數(shù)據(jù)轉(zhuǎn)換,也許需要數(shù)據(jù)轉(zhuǎn)換是設(shè)計(jì)的問題,,但是減少次數(shù)是程序員可以做到的,。
C
、杜絕不必要的子查詢和連接表,,子查詢在執(zhí)行計(jì)劃一般解釋成外連接,,多余的連接表帶來額外的開銷。
D
,、合并對同一表同一條件的多次UPDATE,,比如
UPDATE EMPLOYEE SET FNAME='HAIWER' WHERE EMP_ID=' VPA30890F'
UPDATE EMPLOYEE SET LNAME='YANG' WHERE EMP_ID=' VPA30890F'

這兩個(gè)語句應(yīng)該合并成以下一個(gè)語句
UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME='YANG'
WHERE EMP_ID=' VPA30890F'

E
UPDATE操作不要拆成DELETE操作+INSERT操作的形式,,雖然功能相同,,但是性能差別是很大的。
F,、不要寫一些沒有意義的查詢,,比如
SELECT * FROM EMPLOYEE WHERE 1=2

Where后面的原則

第一個(gè)原則:在where子句中應(yīng)把最具限制性的條件放在最前面。

第二個(gè)原則:where子句中字段的順序應(yīng)和索引中字段順序一致,。

select field3,field4 from tb where upper(field2)='RMN'不使用索引,。
如果一個(gè)表有兩萬條記錄,建議不使用函數(shù),;如果一個(gè)表有五萬條以上記錄,,嚴(yán)格禁止使用函數(shù)!兩萬條記錄以下沒有限制,。

如何設(shè)計(jì)一個(gè)高并發(fā)的系統(tǒng)

1) 數(shù)據(jù)庫的優(yōu)化,,包括合理的事務(wù)隔離級別、SQL語句優(yōu)化,、索引優(yōu)化

2) 使用緩存,、盡量減少數(shù)據(jù)庫IO

3) 分布式數(shù)據(jù)庫、分布式緩存

4) 服務(wù)器的負(fù)載均衡

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多