MySQL 最佳化方案

來源:互聯網
上載者:User

標籤:des   使用   資料   問題   sql   設計   mysql   ad   

基本上通過索引來解決 。 
通常索引鍵在where , group by , order by 相關的列 
一個表只能用一個索引(查詢的時候)
所以當要執行複雜查詢時最好使用聯合索引就是 index (a,b,c,d,....)
where 需要注意的事,
索引是左到右使用的 , 如果是 index(a,b,c) 那麼可以
1. where a = x and b = y and c = z 
2. where a = x order by b,c 
3 where a = x group by a,b,c
group by 需要注意的事 :
如果是多表查詢,group by 索引只能group 最後的那個被join出來的表的列  
比如 a straight join b 
那麼 group by a.x 是可以的 
如果是 group by a.x,b.y 那就fair 了 
table join 完了最後只能有一個表索引,其它表的列的索引全部作廢了
但是在join的時候他們的索引是有協助的 
order by 要注意的事 
group by 之後 要order by 是很困難的,因為他們必須是用聯合索引順著走.但一般上不那麼巧 
而且如果你order by 有 desc 反來反去也是不會走索引的。 

所以呢遇到一些沒辦法用索引來最佳化的案子只好退而求其次 
group by 和 order by 都是很傷的,尤其是你join table 的話它通常還會要 using temp  filesort . 
所以儘可能滿足其中一個也好 。 
那麼如果真的無法滿足的話,那麼要確保資料量不要太大不然就gg 了 .

那麼其它的一些方向就是通過一些table 設計來儘可能的最佳化 
比如 : 反範式
就是把多個table的資料放在一個table 讓他不必join .
這樣的缺點就是重複資料多坑多,admin update的時候要同步的地方也多 
maintain 起來會很難 。
優點就是資料在一個table 索引就容易建了 。

預先計算
就是不要在拿資料的時候才做計算,儘可能預先算了放進去 。
那麼可以減低需要 group by sum order by sum 之類的問題 .

緩衝
要確保每個語句一定可以被緩衝,不要使用日期的函數來寫語句,比如 where a.x = now() 

把語句拆開 
讓c#分幾次查詢 ,簡化sql語句 . 
好處是可以分散緩衝,容易使用各各表的索引 。 

當然要在c#做,就要厲害LINQ啦


 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.