1. 程式人生 > >MySQL的資料庫優化

MySQL的資料庫優化

一. 優化查詢效率

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,否則邏輯讀會很高, 效能很差。

二.資料庫的優化

1.優化索引、SQL 語句、分析慢查詢; 2.設計表的時候嚴格根據資料庫的設計正規化來設計資料庫; 3.使用快取,把經常訪問到的資料而且不需要經常變化的資料放在快取中,能節約磁碟 IO 4.優化硬體;採用 SSD,使用磁碟佇列技術(RAID0,RAID1,RDID5)等 5.採用 MySQL 內部自帶的表分割槽技術,把資料分層不同的檔案,能夠提高磁碟的讀取效率; 6.垂直分表;把一些不經常讀的資料放在一張表裡,節約磁碟 I/O; 7.主從分離讀寫;採用主從複製把資料庫的讀操作和寫入操作分離開來; 8.分庫分表分機器(資料量特別大),主要的的原理就是資料路由; 9.選擇合適的表引擎,引數上的優化 10.進行架構級別的快取,靜態化和分散式; 11.不採用全文索引; 12.採用更快的儲存方式,例如 NoSQL 儲存經常訪問的資料**。

三.如何對查詢命令進行優化?

a. 應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索。 b. 應儘量避免在 where 子句中對欄位進行 null 值判斷,避免使用!=或<>操作符,避免使用 or 連線條件,或在 where 子句中使用引數、對欄位進行表示式或函式操作,否則會導致權標掃描 c. 不要在 where 子句中的“=”左邊進行函式、算術運算或其他表示式運算,否則系統將可能無 法正確使用索引。 d. 使用索引欄位作為條件時,如果該索引是複合索引,那麼必須使用到該索引中的第一個欄位作為 條件時才能保證系統使用該索引,否則該索引將不會被使用。 e. 很多時候可考慮用 exists 代替 in。 f. 儘量使用數字型欄位。 g. 儘可能的使用 varchar/nvarchar 代替 char/nchar。 h. 任何地方都不要使用 select from t ,用具體的欄位列表代替“”,不要返回用不到的任何欄位。 i. 儘量使用表變數來代替臨時表。 j. 避免頻繁建立和刪除臨時表,以減少系統表資源的消耗。 感恩於心,回報於行。 面試寶典系列-Python k. 儘量避免使用遊標,因為遊標的效率較差。 l. 在所有的儲存過程和觸發器的開始處設定 SET NOCOUNT ON ,在結束時設定 SET NOCOUNT OFF。 m. 儘量避免大事務操作,提高系統併發能力。 n. 儘量避免向客戶端返回大資料量,若資料量過大,應該考慮相應需求是否合理。