MySQL資料庫的優化

2021-10-03 09:32:24 字數 4604 閱讀 3719

mysql為何要進行優化:

mysql優化是乙個綜合性的技術,主要包括:

要保證資料庫的效率,要做好以下四個方面的工作

通俗地理解三個正規化

第一正規化: 1nf是對屬性的原子性約束,要求屬性(列)具有原子性,不可再分解;(只要是關係型資料庫都滿足1nf)

第二正規化: 2nf是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;

第三正規化: 3nf是對字段冗餘性的約束,它要求字段沒有冗餘。 沒有冗餘的資料庫設計可以做到。

第一正規化(1nf)

1. 即表的列的具有原子性,不可再分解,即列的資訊,不能分解, 只要資料庫是關係型資料庫(mysql/oracle/db2/informix/sysbase/sql server),就自動的滿足1nf。

2. 資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。

3. 如果實體中的某個屬性有多個值時,必須拆分為不同的屬性 。通俗理解即乙個欄位只儲存一項資訊。

第二正規化(2nf)

1、要求資料庫表中的每個例項或行必須可以被惟一地區分。為實現區分通常需要我們設計乙個主鍵來實現(這裡的主鍵不包含業務邏輯)。

第三正規化(3nf)

1、要求乙個資料庫表中不包含已在其它表中已包含的非主鍵字段。

2、如果能夠被推導出來,就不應該單獨的設計乙個欄位來存放(能盡量外來鍵join就用外來鍵join)。

3、很多時候,我們為了滿足第三正規化往往會把一張表分成多張表。

mysql優化的一般步驟:

通過show status命令了解各種sql的執行頻率

定位執行效率較低的sql語句-(重點select)

通過explain分析低效率的sql語句的執**況

explain使用舉例

explain select *

from emp where ename=「wsrcla」

會產生如下資訊:

select_type: 表示查詢的型別。

table: 輸出結果集的表

type

: 表示表的連線型別

possible_keys: 表示查詢時,可能使用的索引

key: 表示實際使用的索引

key_len: 索引欄位的長度

rows: 掃瞄出的行數(估算的行數)

extra: 執**況的描述和說明

explain資訊詳解

1

.id select識別符。這是select的查詢序列號

2. select_type 

primary : 子查詢中最外層查詢

subquery : 子查詢內層第乙個select,結果不依賴於外部查詢

dependent subquery: 子查詢內層第乙個select,依賴於外部查詢

union : union語句中第二個select開始後面所有select,

******: 簡單的 select 查詢,不使用 union 及子查詢

union : union 中的第二個或隨後的 select 查詢,不依賴於外部查詢的結果集

3. table : 顯示這一步所訪問資料庫中表名稱

4. type : 對錶訪問方式

all: select * from emp \g 完整的表掃瞄 通常不好

select * from (select * from emp where empno =

1) a ;

system: 表僅有一行(

=系統表)。這是const聯接型別的乙個特

const: 表最多有乙個匹配行

5. possible_keys : 該查詢可以利用的索引,如果沒有任何索引顯示 null

6. key : mysql 從 possible_keys 所選擇使用索引

7. rows : 估算出結果集行數

8. extra查詢細節資訊

no tables : query語句中使用from dual 或不含任何from子句

using filesort : 當query中包含 order by 操作,而且無法利用索引完成排序,

impossible where noticed after reading const tables: mysql query optimizer 通過收集統計資訊不可能存在結果

using temporary: 某些操作必須使用臨時表,常見 group by ; order by

using where: 不用讀取表中所有資訊,僅通過索引就可以獲取所需資料;

字段型別轉換導致不用索引,如字串型別的不用引號,數字型別的用引號等,這有可能會用不到索引導致全表掃瞄

mysql 不支援函式轉換,所以字段前面不能加函式,否則這將用不到索引

不要在字段前面加減運算

字串比較長的可以考慮索引一部份減少索引檔案大小,提高寫入效率

like % 在前面用不到索引

根據聯合索引的第二個及以後的字段單獨查詢用不到索引

.不要使用 select *;會查詢全表的資料影響查詢效率

排序請盡量使用公升序

or 的查詢盡量用 union 代替(innodb)

復合索引高選擇性的字段排在前面

order by / groupby 字段包括在索引當中減少排序,效率會更高

sql 編寫時還需要特別注意一下幾點:

盡量規避大事務的 sql,大事務的 sql 會影響資料庫的併發效能及主從同步

分頁語句 limit 的問題

刪除表所有記錄請用 truncate,不要用 delete

不讓 mysql 幹多餘的事情,如計算

輸寫 sql 帶欄位,以防止後面表變更帶來的問題,效能也是比較優的 ( 涉及到資料字典解析,請自行查詢資料)

在 innodb上用 select count(*),因為 innodb 會儲存統計資訊

慎用 oder by rand()

delete和truncate的區別:

delete是dml,執行delete操作時,每次從表中刪除一行,並且同時將該行的的刪除操作記錄在redo和undo表空間中以便進行回滾(rollback)和重做操作,但要注意表空間要足夠大,需要手動提交(commit)操作才能生效,可以通過rollback撤消操作

truncate會刪除表中所有記錄,並且將重新設定高水線和所有的索引,預設情況下將空間釋放到minextents個extent,除非使用reuse storage,。不會記錄日誌,所以執行速度很快,但不能通過rollback撤消操作(如果一不小心把乙個表truncate掉,也是可以恢復的,只是不能通過rollback來恢復)

drop> truncate > delete

水平分割:

大資料量的表,我們在提供檢索的時候,應該根據業務的需求,找到表的標準,並在檢索頁面約束使用者的檢索方式,而且要配合分頁

垂直分割:

把某個表的某些字段,這些字段,在查詢時候並不關係,但是資料量很大,我們建議將這些字段放到乙個表中,從而提高效率

1. 優化索引、sql 語句、分析慢查詢

2. 設計表的時候嚴格根據資料庫的設計正規化來設計資料庫

3. 使用快取,把經常訪問到的資料而且不需要經常變化的資料放在快取中,能節約磁碟io

4. 優化硬體;採用ssd,使用磁碟佇列技術(raid0,raid1,rdid5)等;

5. 採用mysql 內部自帶的表分割槽技術,把資料分層不同的檔案,能夠提高磁碟的讀取效率

6. 垂直分表;把一些不經常讀的資料放在一張表裡,節約磁碟i/o

7. 主從分離讀寫;採用主從複製把資料庫的讀操作和寫入操作分離開來

8. 分庫分表分機器(資料量特別大),主要的的原理就是資料路由

9. 選擇合適的表引擎,引數上的優化

10. 進行架構級別的快取,靜態化和分布式

11. 不採用全文索引

1、儲存引擎選擇:如果資料表需要事務處理,應該考慮使用innodb,因為它完全符合acid特性。如果不需要事務處理,使用預設儲存引擎myisam是比較明智的

2、分表分庫,主從。

3、對查詢進行優化,要盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引

4、應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄

5、應盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃瞄

6、應盡量避免在 where 子句中使用 or 來連線條件,如果乙個欄位有索引,乙個字段沒有索引,將導致引擎放棄使用索引而進行全表掃瞄

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

8、對於多張大資料量(這裡幾百條就算大了)的表join,要先分頁再join,否則邏輯讀會很高,效能很差。

參考原址來自於此

mysql資料庫的優化

先學習一下mysql的相關優化問題,主要是從提高mysql資料庫伺服器的效能的思路進行考慮,主要包含以下8個方面的優化 1 選取最適用的字段屬性 2 使用連線 join 來代替子查詢 sub queries 3 使用聯合 union 來代替手動建立的臨時表 4 事務 5 鎖定表 6 使用外來鍵 7 ...

Mysql 資料庫的優化

1 儲存引擎選擇 如果資料表需要事務處理,應該考慮使用 innodb,因為它完全符合 acid 特性。如果不需要事務處理,使用預設儲存引擎 myisam 是比較明智的 2 分表分庫,主從。3 對查詢進行優化,要盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索 引4 ...

MySQL資料庫的優化

索引能大大提高查詢速度,同時卻會降低更新表的速度,如對表進行insert update和delete。因為更新表時,mysql不僅要儲存資料,還要儲存一下索引檔案。建立索引會占用磁碟空間的索引檔案。索引適用於不經常修改的字段,並且表越大建立索引的效果越明顯。1mobile為索引字段,name為非索引...