More  

小編的世界 優質文選 資料

mysql優化技巧大全


2021年2月28日 - 資料小編  
   

挨踢雜談zhu

MySQL是一個關系型數據庫管理系統,且也是最流行的關系型數據庫管理系統之一,在日常開發 WEB 應用方面,MySQL是最好的數據管理應用軟件之一。但是當我們的數據庫存儲的數據量龐大時,會造成應用程序讀取數據庫數據緩慢的現象,這大大降低了用戶體驗。接下來,筆者將帶領大家看看如何優化我們的數據庫,提高我們數據庫的數據讀取效率。

1、給自己數據表添加索引

數據表中索引相當於我們書本中的目錄索引,每一條數據都對應著一個索引值。如果我們沒有給數據表添加索引時,在大數據量下(百萬條數據或者更多)精確查找某一條數據是通過一條一條來查找的,這樣很耗服務器的cpu查找速度也慢;通過添加索引的後可以大大提高數據查找的速率。

創建普通索引:

CREATE INDEX 索引名 ON 表名 (列名)

創建唯一索引,它與上面的普通索引唯一不同的是,該索引不能重複也不能為空。

CREATE UNIQUE INDEX 索引名 ON 表名 (列名)

2、SELECT語句的優化

初學者使用Mysql時很喜歡使用select * from 表名這樣的語句,這樣的語句增加很多不必要的服務器消耗(比如cpu的計算消耗、數據讀取i/o的消耗),所以我們在使用select語句時根據自己的業務需求添加明確的查詢字段,不查詢額外的無意義的字段。除此之外我們查詢數據時應該添加上查詢條件,避免大面積對數據進行查詢。

例如:select name,age,email,phone from users where id = 1;

3、避免使用外鍵

在設計表的時候使用外鍵進行約束兩個表之間的數據關系,這樣的設計給數據庫的操作(增刪查改)會帶來壓力的。比如我們在約束學生表和教師表之間的關系時可以使用額外的字段來約束兩者之間的關系,可以給學生添加一個字段(teacher_id)來對兩者之間的關系的約束。

4、當我們明確只需要一條數據時,可以使用limit 1.

如:select name,age,email,phone from users where id = 1 limit 1;

5、in函數的值不能過多

在select語句使用in函數時,in函數裏面的參數不能過多,否則也會造成慢查詢,我們可以用between語句或者左右連接查詢來代替。

6、 ORDER BY 排序的問題

ORDER BY 查詢數據排序時假如排序時的字段沒有索引字段在裏面,不要進行排序,因為這樣也會造成cpu的額外消耗和慢查詢。

7、where語句中null語句判斷的問題

我們要避免在where語句中對字段進行 null 值判斷,如果對null進行判斷會導致mysql引擎放棄已經建立的索引查找方式而進行全表掃描,進行全表掃描在億萬條數據時可能導致服務崩潰。

8、union all 和union的使用問題

union all 和union之間的區別在於後者會將兩表之間查詢出來的數據進行唯一性的過濾,這樣也會造成cpu的額外消耗,如果兩個表之間的數據無重複的情況下,我們盡量使用union all 代替union ,可以增加查詢效率。

9、查詢時分頁的問題

在大數據量下使用分頁查詢也會導致查詢速度越來越慢,比如:

select name,phone from users limit 999999,20;

假如上面的語句時根據自增長的id進行分頁的,我們可以把上述查詢語句修改為:

select name,phone from users where id > 999999 limit 20;

10、關於模糊查詢like的優化

我們在使用模糊查詢時,盡量避免在查詢字段前使用%,比如 like“%name",這種查詢方式也會導致mysql引擎放棄已經建立的索引查找方式而進行全表掃描,降低查詢效率。

11、避免where語句中表達式的問題

在無特殊業務需求的情況下,我們應該避免在where語句使用表達式來對數據進行查詢。

12、根據的業務選擇適合的數據表引擎,常用的mysql引擎有myisam與innodb。如果你的表更新的少讀取數據比較多可選用myisam作為該表引擎,否則則選用innodb引擎。

MySQL中myisam與innodb的區別如下:

關於mysql優化的方法筆者總結上面的12條,當然筆者的經驗不夠,更多的優化方式等待著我們一起探討,如果您覺得這篇文章對您有幫助,請您多多關注筆者和分享,筆者會不斷分享一些計算機方面的使用技巧

  大家在看