1、盡量取出自己想要的欄位,不要這樣select * from table
因為你取的越多,網路傳輸的資料就越多,從網路頻寬和網路緩衝區上來看都是浪費。
特別是在order,效能更是下降。,實現方式是先將需要排序的欄位和可以直接定位到相關行資料的指標資訊取
出,然後在我們所設定的排序區(通過參數sort_buffer_size 設定)中進行排序,完成排序之後再次
通過行指標資訊取出所需要的Columns,也就是說這種演算法需要訪問兩次資料。第二種排序演算法是從
MySQL4.1 版本開始使用的改進演算法,一次性將所需要的Columns 全部取出,在排序區中進行排序後直
接將資料返回給請求用戶端。改行演算法只需要訪問一次資料,減少了大量的隨機IO,極大的提高了帶有
排序的Query 語句的效率。但是,這種改進後的排序演算法需要一次性取出並緩衝的資料比第一種演算法
要多很多,如果我們將並不需要的Columns 也取出來,就會極大的浪費排序過程所需要的記憶體。在
MySQL4.1 之後的版本中,我們可以通過設定max_length_for_sort_data 參數大小來控制MySQL 選擇
第一種排序演算法還是第二種排序演算法。當所取出的Columns 的單條記錄總大小max_length_for_sort_data 設定的大
小的時候,MySQL 就會選擇使用第一種排序演算法,反之,則會選擇第二種最佳化後的演算法。為了儘可能提高排序效能,
我們自然是更希望使用第二種排序演算法,所以在Query 中僅僅取出我們所需要的Columns 是非常有必要的。
2、適當建立索引,來提高查詢速度
我想每個人都知道索引能夠提高查詢速度,但是建立索引時有原則。
前提:一般對不經常變化的欄位、最好不是常量欄位、能夠過濾大部分資料的欄位進行索引,因為如果這個欄位經常
變化,當資料量很大的時候,每次更新這個欄位索引都是需要重建立立的,會耗很大效能和時間的,如果這個欄位是個
常量值,要有七八個值,那麼這樣索引區中重複索引會很多,極大地浪費空間,資料量會很大,查詢的效能也不會提高。
在以下情況下索引不會起到作用:
like語句、!=、<>、函數索引、join的時候欄位不一致。
3、圖片,大檔案、日誌、流水資訊不應該儲存在資料庫裡
4、在排序和分組的時候盡量使用索引欄位
因為查詢的時候,如果按照索引進行排序的話,查詢的時候返回的資料資料已經是排序好的資料了,
在分組的時候 是先進行排序在進行分組的。
5、小的結果集驅動大的結果集
在進行join的時候,永遠都是要小的結果集來驅動大的結果集,因為mysql是通過嵌套迴圈來實現join的,也就是第一查詢出來的結果越多,那麼第二次查詢的迴圈次數也就越多,進行磁碟io操作也就多。
6、採用MYsql MYISAM儲存引擎的時候,由於採用的是表級鎖定,那麼爭用資來源物件的幾率就大了,那麼對並發影響很大,那麼這個時候,
我們應該盡量減少sql執行的時候,拆分複雜的sql,變成簡單的sql,進而縮短執行sql的時間,加快響應的時間,這樣並發亮相應的也就提高了
但是有在很難拆分的情況,我可以通過增大join_buffer_size來提高join的效能。
7、在join的時候盡量使用索引欄位
8、不要是自己的產品過渡理想化
如即時性,即時更新某個表的欄位,在高並發的時候這樣讀寫對資料庫且是同一張表,可想而知後果,可以改為日終的時候再去處理日誌或者資料庫相關資料進行分析。
9、運用explain、profile分析sql