標籤:title table dex 伺服器 lock 很多 返回 最佳化 fse
6. 合理使用EXISTS,NOT EXISTS子句。如下所示:
1.SELECT SUM(T1.C1) FROM T1 WHERE (SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0) 2.SELECT SUM(T1.C1) FROM T1WHERE EXISTS(SELECT * FROM T2 WHERE T2.C2=T1.C2) 兩者產生相同的結果,但是後者的效率顯然要高於前者。因為後者不會產生大量鎖定的表掃描或是索引掃描。如果你想校正表裡是否存在某條紀錄,不要用count(*)那樣效率很低,而且浪費伺服器資源。可以用EXISTS代替。如: IF (SELECT COUNT(*) FROM table_name WHERE column_name = ‘xxx’)可以寫成:IF EXISTS (SELECT * FROM table_name WHERE column_name = ‘xxx’)
7. 能夠用BETWEEN的就不要用IN
8. 能夠用DISTINCT的就不用GROUP BY
9. 盡量不要用SELECT INTO語句。SELECT INTO 語句會導致表鎖定,阻止其他使用者訪問該表。
10. 必要時強制查詢最佳化工具使用某個索引
SELECT * FROM T1 WHERE nextprocess = 1 AND processid IN (8,32,45) 改成: SELECT * FROM T1 (INDEX = IX_ProcessID) WHERE nextprocess = 1 AND processid IN (8,32,45) 則查詢最佳化工具將會強行利用索引IX_ProcessID 執行查詢。
14. 能用UNION ALL就不要用UNION
UNION ALL不執行SELECT DISTINCT函數,這樣就會減少很多不必要的資源 在跨多個不同的資料庫時使用UNION是一個有趣的最佳化方法,UNION從兩個互不關聯的表中返回資料,這就意味著不會出現重複的行,同時也必須對資料進行排序,我們知道排序是非常耗費資源的,特別是對大表的排序。 UNION ALL可以大大加快速度,如果你已經知道你的資料不會包括重複行,或者你不在乎是否會出現重複的行,在這兩種情況下使用UNION ALL更適合。此外,還可以在應用程式邏輯中採用某些方法避免出現重複的行,這樣UNION ALL和UNION返回的結果都是一樣的,但UNION ALL不會進行排序。
15. 欄位資料類型最佳化:
a. 避免使用NULL類型:NULL對於大多數資料庫都需要特殊處理,MySQL也不例外,它需要更多的代碼,更多的檢查和特殊的索引邏輯,有些開發人員完全沒有意識到,建立表時NULL是預設值,但大多數時候應該使用NOT NULL,或者使用一個特殊的值,如0,-1作為預設值。 b. 儘可能使用更小的欄位,MySQL從磁碟讀取資料後是儲存到記憶體中的,然後使用cpu周期和磁碟I/O讀取它,這意味著越小的資料類型佔用的空間越小,從磁碟讀或打包到記憶體的效率都更好,但也不要太過執著減小資料類型,要是以後應用程式發生什麼變化就沒有空間了。修改表將需要重構,間接地可能引起代碼的改變,這是很頭疼的問題,因此需要找到一個平衡點。 c. 優先使用定長型
18. 不要在選擇的欄位上放置索引,這是無意義的。應該在條件選擇的語句上合理的放置索引,比如where,order by。
SELECT id,title,content,cat_id FROM article WHERE cat_id = 1;
19. ORDER BY語句的MySQL最佳化: a. ORDER BY + LIMIT組合的索引最佳化。如果一個SQL語句形如:
SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort] LIMIT [offset],[LIMIT];
這個SQL語句最佳化比較簡單,在[sort]這個欄位上建立索引即可。
b. WHERE + ORDER BY + LIMIT組合的索引最佳化,形如:
SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [VALUE] ORDER BY [sort] LIMIT [offset],[LIMIT];
這個語句,如果你仍然採用第一個例子中建立索引的方法,雖然可以用到索引,但是效率不高。更高效的方法是建立一個聯合索引(columnX,sort)
d.WHERE+ORDER BY多個欄位+LIMIT,比如:
SELECT * FROM [table] WHERE uid=1 ORDER x,y LIMIT 0,10;
對於這個語句,大家可能是加一個這樣的索引:(x,y,uid)。但實際上更好的效果是(uid,x,y)。這是由MySQL處理排序的機製造成的。
mysql 最佳化2