MySQL(五) 資料庫效能優化

2021-10-03 21:33:27 字數 3503 閱讀 1337

mysql(四)------使用慢查詢日誌定位sql

mysql(三)------mysql通過explain 命令檢視sql語句執行效率

1、避免select * 寫法

執行sql時優化器需要將 * 轉成具體的列;每次查詢都要回表,不能走覆蓋索引。

2、避免複雜sql語句

提公升可閱讀性;避免慢查詢的概率;可以轉換成多個短查詢,用業務端處理

3、使用like進行模糊查詢時應避免左模糊查詢

#左模糊查詢會導致全表掃瞄

select*from table where username like 『%kewordk%』

4、避免在 where 子句中對字段進行 null 值判斷

導致引擎放棄使用索引而進行全表掃瞄

select id from t where num is null
最好不要給資料庫留null,盡可能的使用 not null填充資料庫.

5、避免在 where 子句中使用 != 或 <> 操作符

導致引擎放棄使用索引而進行全表掃瞄。

在mysql資料庫中where 子句中使用 != 或 <> 操作符,引擎不會放棄使用索引。

6、避免在 where 子句中使用 or 來連線條件

如果乙個欄位有索引,乙個字段沒有索引,將導致引擎放棄使用索引而進行全表掃瞄

7、in 和 not in 也要慎用,否則會導致全表掃瞄

在mysql資料庫中where 子句中對索引字段使用 in 和 not in操作符,引擎不會放棄使用索引。

在mysql資料庫中where 子句中對不是索引字段使用 in 和 not in操作符,會導致全表掃瞄。

8、避免在 where 子句中對字段進行表示式操作

導致引擎放棄使用索引而進行全表掃瞄

select id from t where num/2 = 100

#可以優化為

select id from t where num = 100*2

9、避免在where子句中對字段進行函式操作

導致引擎放棄使用索引而進行全表掃瞄

select id from t where substring(name,1,3) = 』abc』
10、 where 及 order by 涉及的列上最好建立索引

對查詢進行優化,要盡量避免全表掃瞄

11、 where 及 order by 涉及到復合索引字段,應注意順序性

在使用索引字段作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓字段順序與索引順序相一致。

12、update 語句,如無必要,不要全修改

如果只更改1、2個字段,不要update全部字段,否則頻繁呼叫會引起明顯的效能消耗,同時帶來大量日誌。

13、只需要一條資料時使用limit 1

若已經知道結果只有一條的時候,一定要使用limit 1 ,這樣一來,mysql在查詢到一條資料之後,會立即停止搜尋

1、索引並不是越多越好

索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。乙個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。

2、應盡可能的避免更新 clustered 索引資料列

聚集索引(clustered index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)

聚簇索引的順序就是資料的物理儲存順序,而對非聚簇索引的索引順序與資料物理排列順序無關

聚簇索引的順序就是資料的物理儲存順序,所以乙個表最多只能有乙個聚簇索引,因為物理儲存只能有乙個順序

因為 clustered 索引資料列的順序就是表記錄的物理儲存順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引資料列,那麼需要考慮是否應將該索引建為 clustered 索引。

1、資料庫表字段型別

盡量用int型,固定長度用char,使用varchar的範圍盡量貼合實際,能用tinyint就不要用int和smallint,最好給字段設定預設值,預設值不為null;

2、字段盡量避免空(null)

mysql難以優化了使用了可空列的查詢,它會使索引、索引統計和值更加複雜。

並且可空列需要更多的儲存空間

即使要在表中儲存可為空的字段,也是有辦法不使用null的,可以考慮使用0,特殊值或字串來代替它。

3、盡量少用text型別,非用不可時最好考慮分表

4、盡量使用數字型字段

若只含數值資訊的字段盡量不要設計為字元型,這會降低查詢和連線的效能,並會增加儲存開銷。這是因為引擎在處理查詢和連 接時會逐個比較字串中每乙個字元,而對於數字型而言只需要比較一次就夠了。

mysql常用有兩種儲存引擎,乙個是myisam,不支援事務處理,讀效能處理快,表級別鎖。另乙個是innodb,支援事務處理(acid),設計目標是為處理大容量資料發揮最大化效能,行級別鎖。

表鎖:開銷小,鎖定粒度大,發生死鎖概率高,相對併發也低。

行鎖:開銷大,鎖定粒度小,發生死鎖概率低,相對併發也高。

根據以上看來,使用innodb儲存引擎是最好的選擇,也是mysql5.5以後版本中預設儲存引擎。

加大物理記憶體,提高檔案系統效能

隨著業務量越來越大,單台資料庫伺服器效能已無法滿足業務需求

1、主從複製與讀寫分離

因為生產環境中,資料庫大多都是讀操作,所以部署一主多從架構,主資料庫負責寫操作,並做雙擊熱備,多台從資料庫做負載均衡,負責讀操作

2、分庫、分表

分庫是根據業務不同把相關的表切分到不同的資料庫中,比如web、bbs、blog等庫。如果業務量很大,還可將切分後的庫做主從架構,進一步避免單個庫壓力過大。

資料量的日劇增加,資料庫中某個表有幾百萬條資料,導致查詢和插入耗時太長,怎麼能解決單錶壓力呢?你就該考慮是否把這個表拆分成多個小表,來減輕單個表的壓力,提高處理效率,此方式稱為分表。

效能優化 MySQL資料庫優化

可以從哪幾個方面進行資料庫的優化?如下圖所示 a sql及索引優化 根據需求寫出良好的sql,並建立有效的索引,實現某一種需求可以多種寫法,這時候我們就要選擇一種效率最高的寫法。這個時候就要了解sql優化 b 資料庫表結構優化 根據資料庫的正規化,設計表結構,表結構設計的好直接關係到寫sql語句。c...

資料庫(五)資料庫訪問效能優化

乙個優良的系統,效能問題是我們必須考慮的問題,而資料庫的效能瓶頸也是我們不得不面對的問題,本章我們將 一下關於資料庫訪問效能優化方面的問題。1 資料庫訪問涉及到的層面 cpu及記憶體 快取資料訪問 比較 排序 事務檢測 sql解析 函式或邏輯運算。網 絡 結果資料傳輸 sql請求 遠端資料庫訪問 d...

資料庫效能優化 MySQL

序 即使有較長的快取有效期和較理想的快取命中率,但是快取的建立和快取過期後的重建都是需要訪問資料庫的。對資料庫寫操作不是很容易引入快取策略。11.1 檢視資料庫狀態 可以通過show status show innodb status 來檢視mysql資料庫的狀態,使用mysqlreport這個第三...