標籤: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啦