SQL語句的優(yōu)化 0) 盡量多建立索引,,改匹配索引為查找索引,。 1) 盡量避免耗時(shí)操作。 帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語句會啟動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。 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)行下列操作: (2)避免在索引字段上使用not,,<>,,!= (3)避免在索引列上使用IS NULL和IS NOT NULL (4)避免在索引列上出現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換 (5)避免在索引字段上使用函數(shù) 例如:where trunc(create_date)=trunc(:date1) (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í)表 可以使用聯(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ù)的工作 Where后面的原則 第一個(gè)原則:在where子句中應(yīng)把最具限制性的條件放在最前面。 第二個(gè)原則:where子句中字段的順序應(yīng)和索引中字段順序一致,。 select field3,field4 from tb where
upper(field2)='RMN'不使用索引,。 如何設(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ù)載均衡 |
|