mysql優化相關的小技巧

2021-10-07 14:31:22 字數 1480 閱讀 8599

優化歸根到底是對i/o(磁碟i/o、網路i/o)的優化,主要考慮兩方面

i/o資料量

i/o的交換頻率

為什麼說是對i/o的優化?

所有的資料傳輸都離不開網路以及磁碟記憶體間的資料交換。

發起一條sql查詢要經歷以下幾個步驟:

建立網路連線,連線到mysql server

mysql server 聯結器進行訊息的連線,驗證許可權

mysql server 分析器進行詞法分析、語法分析,驗證語句的正確性

mysql server 優化器進行sql語句的優化,包括 索引的選擇,條件的先後順序、join的主表選擇等等

mysql server 執行器進行資料的檢索以及處理,下接對應的儲存引擎通訊

對應的儲存引擎進行資料的一次篩選(由磁碟讀取資料到記憶體中,進行篩選,拿innerdb來說,每次讀取1頁(16k)的資料,依次獲取符合條件的資料),將符合的資料傳遞給上游 mysql server, 由處理器判斷是否需要進行二次篩選或者排序操作

通過上面的過程,可以得出,大部分耗時的部分主要是在 磁碟i/o與網路i/o上,如果說,能控制好i/o的資料量以及交換頻率,則效能會大大提公升。

可以通過以下方面進行優化:

相對來說,選用最小的資料型別來儲存資料所占有的磁碟空間(雖然現在磁碟很廉價)、查詢時的快取、cpu會更小,速度會更快。

整型替代字串(計算速度會更加快速)

使用內建的時間資料型別替換以字串表示的時間

對於長度固定的字串使用char型別來儲存,varchar資料型別在更新欄位的時候會重新計算字串的長度,如果超過了磁碟塊的大小,則會通過**頁的方式進行儲存

避免使用null來進行儲存,null這種資料使得索引選擇、索引統計以及數值的比較更加複雜

盡量使用數字型的字段

額外的獲取不需要的資料,會加大磁碟io的交換頻率以及網路傳輸的資料量,盡可能的縮小資料量。

不使用select * 這類全量關鍵字

查詢時要善於使用limit關鍵字來控制資料量

只需要通過索引就可以返回查詢所需要的資料,而不必通過二級索引查到主鍵之後再去查詢資料。覆蓋索引不僅可以包括where 需要的字段,也可以把常用的select 欄位和order by 字段作為索引的一部分,利用索引覆蓋提高效率,防止二次回表。

使用explain 可以很清晰的獲取到某條sql的執行計畫,其中有一列 rows, rows越大,相對的可以近似推斷出查詢條件的區分度比較低,可能在儲存引擎層篩選的得到的目標資料會相對比較多,在mysql server層還會繼續進行篩選,耗費cpu以及記憶體,這是不可取的,但是也不是絕對的,盡量的縮小rows的個數,對提公升效能有很大的幫助。

針對innodb儲存引擎來說,統計行數的效率排序 count(字段) < count(主鍵id) < count(1) ≈ count(*),建議使用 count(*)。

持續更新。。。。。

MySQL相關小技巧

分享幾個很實用的mysql相關技巧 group concat 將取到的值用逗號連線,可以這麼用 select group concat distinct id from table 得到的結果類似為 1,2,3,4,5 unix timestamp to days now 這三個函式都是與日期相關的...

mysql優化小技巧

對mysql優化時乙個綜合性的技術,主要包括 a 表的設計合理化 符合3nf b 新增適當索引 index 四種 普通索引 主鍵索引 唯一索引unique 全文索引 c 分表技術 水平分割 垂直分割 d 讀寫 寫 update delete add 分離 e 儲存過程 模組化程式設計,可以提高速度 ...

Mysql優化小技巧

思夢php 2019 02 09 07 01 00 資料量和要求 優化技巧 先把每一條心得記錄在這裡,後面會進行實驗對其一一驗證。查詢資料總條數時,使用max id 而不是count 進行總量計數。當然,前提是id是從1開始自增長,並且沒有行被刪除過。對於常用的查詢字段建立索引。索引的速度優勢顯而易...