原則:永遠小表驅動大表
order by子句,盡量使用index方式排序,避免使用filesort方式排序
mysql支援兩種方式的排序,filesort和index,index效率高,mysql掃瞄索引本身完成排序。filesort方式效率較低
order by 滿足兩種情況下,會使用index方式排序
• 1.order by 語句使用索引最左前列
• 2.使用where子句與order by子句條件組合滿足索引最左前列
filesort 是在記憶體中還是在磁碟中完成排序的?
mysql 中的 filesort 並不一定是在磁碟檔案中進行排序的,也有可能在記憶體中排序,記憶體排序還是磁碟排序取決於排序的資料大小和 sort_buffer_size 配置的大小。
• 如果 「排序的資料大小」 < sort_buffer_size: 記憶體排序
• 如果 「排序的資料大小」 > sort_buffer_size: 磁碟排序
filesort有兩種演算法-雙路排序和單路排序
雙路排序,mysql4.1之前是使用雙路排序,字面意思就是兩次掃瞄磁碟,最終得到資料,讀取行指標和order by列,對他們進行排序,然後掃瞄已經排序好的列表,按照列表中的值重新從列表中讀取對應的資料輸出
單路排序,從磁碟讀取查詢需要的所有列,按照order by列在buffer對他們進行排序,然後掃瞄排序後的列表進行輸出,它的效率更快一些,避免了第二次讀取資料,並且把隨機io變成了順序io,但是它會使用更多的空間
優化策略調整mysql引數
增加sort_buffer_size引數設定
增大max_lenght_for_sort_data引數的設定
提高order by的速度
• order by時select * 是乙個大忌,只寫需要的字段
• 當查詢的字段大小總和小於max_length_for_sort_data而且排序字段不是text|blob型別時,會用改進後的演算法–單路排序
• 兩種演算法的資料都有可能超出sort_buffer的容量,超出之後,會建立tmp檔案進行合併排序,導致多次i/o
• 嘗試提高sort_buffer_size
• 嘗試提高max_length_for_sort_data
資料庫優化 資料庫設計優化
一 索引優化 1.首先索引不是越多越好,要視情況而定。因為索引會降低insert和update的效率 insert和update有時可能會重建索引。2.乙個表的索參數量最好不要超過6個,擇優而建。3.專案上線後,根據使用者的查詢條件字段稍微調整資料庫中的字段索引。二 分表 1.縱切 根據表字段來且分...
資料庫引擎優化顧問優化資料庫
現在一直在做的專案,資料量相對也不小,開始的時候沒有覺得,因為是剛開始,資料量還很小,在程式使用過程中速度還挺快,但是隨著資料量的不停的增長,發現程式越來越慢,甚至出現了超時的問題,因此要對程式和資料庫進行優化,前期專案比較緊,沒有針對大資料量業務進行分析設計,所以索引等相關優化沒有做到位,通過後期...
資料庫優化
資料庫優化 1 合理使用索引 索引是資料庫中重要的資料結構,它的根本目的就是提高查詢效率。索引的使用要恰到好處,其使用原則如下 在經常進行連線,但是沒有指定為外來鍵的列上建立索引,而不經常連線的字段則由優化器自動生成索引 在頻繁進行排序或分組 即進行groupby或orderby操作 的列上建立索引...