一、Overview I.在資料庫層面優化 1. 表結構是否合理 1.1 表欄位是否的數據類型是否正確; 1.2 根據應用系統的工作類型(例如OLAP/OLTP系統),每個表是否有合適的欄位數量,比如執行頻繁更新操作的應用通常使用更多的表,每個表更少的欄位;分析大量數據的應用通常使用更少的表,每個表 ...
一、Overview
I.在資料庫層面優化
表結構是否合理
1.1 表欄位是否的數據類型是否正確;
1.2 根據應用系統的工作類型(例如OLAP/OLTP系統),每個表是否有合適的欄位數量,比如執行頻繁更新操作的應用通常使用更多的表,每個表更少的欄位;分析大量數據的應用通常使用更少的表,每個表更多的欄位。資料庫範式設計和反範式設計。是否使用正確的索引,以使查詢高效
是否使用正確的存儲引擎,利用存儲引擎的長處和特性。比如事務型存儲引擎InnoDB和非事務型引擎MyISAM
每張表是否使用的正確的行/記錄格式,這個選擇依賴於存儲引擎。壓縮表使用更少的存儲空間,讀寫數據使用更少的磁碟IO。壓縮表可應用於InnoDB和只讀性的MyISAM。
應用是否使用正確的鎖策略。例如使用共用鎖,可以併發地執行資料庫操作;使用排他鎖,關鍵的操作獲得最高執行優先順序。InnoDB處理大量的鎖問題,而不用認為參與。
物理記憶體是否大小合適地分配給了緩存。頻繁訪問的數據量過大,導致物理記憶體超載和分頁。
II.在硬體層面優化
磁碟查詢。目前的磁碟,平均查詢時間在10ms以下,即一秒100次查詢。這個查詢時間很難對單表優化,優化方式是將數據分佈到不止一個磁碟上。
磁碟讀寫。目前的磁碟,傳輸速率在10-20MB/s。優化方式是並行地從多個磁碟讀取數據。
CPU cycles
記憶體尺寸範圍
III.平衡可移植性和性能
語法/*! */
,指定版本的sql執行裡面的關鍵字
二、優化SQL語句
優化insert
1.1 插入多條記錄時,使用多個values的單個insert語句
INSERT INTO yourtable VALUES (1,2), (5,5), ...;
1.2 使用LOAD DATA …從文件載入到資料庫,這通常是insert語句執行速度的20倍
1.3 利用列欄位的預設值,只有在插入的值與預設值不同時,再明確地指定插入的值
1.4 針對InnoDB的優化:插入前臨時關閉autocommit、unique_checks(要保證插入的數據唯一索引欄位值不重覆)優化update:更新速度取決於更新的數據量和更新的索引的數量,索引欄位的數據沒有改變,索引也不會更新
2.1 和select優化類似
2.2 一次更新多條數據,比一次更新一次數據更快優化delete
3.1 MyISAM表,刪除單條數據記錄和索引的數量線性相關;為了更快刪除,增加key_buffer_size的鍵緩存
3.2 MyISAM表,刪除所有的數據記錄的情況,TRUNCATE TABLE tbl_name比DELETE FROM tbl_name快優化select
以上內容翻譯整理來自MySQL手冊,如有不當之處,請多指教