優化:
一、表設計優化。
1、適當的反正規化。正規化化的更新操作通常比反正規化化要快,正規化化設計的缺點是通常需要關聯。反正規化的優點:避免關聯,避免了隨機i/o,能使用更有效的索引策略。
2、合適的索引。
3、大字段用垂直拆分。
4、大表用水平拆分。
5、拋棄外來鍵。
6、合適的資料型別。
二、sql語句優化。
1、查詢欄位中只返回需要的字段。特別是大字段內容。
2、只返回需要的資料記錄。本來只需要一條資料,結果你返回10萬條資料。
3、使用索引高效查詢。不要讓索引失效。
4、三、配置優化。
1、2、
3、四、檢視執行計畫。
1、2、
3、五、定位慢查詢和故障解決。
1、2、
3、一、sql語句優化。
(1)使用limit對查詢結果的記錄進行限定。
(2)避免select *,將需要查詢的字段列出來,只返回需要的資料字段,減少不必要的資料。
優點:1、減少資料在網路上傳輸開銷。
2、減少伺服器資料處理開銷。
3、減少客戶端記憶體占用。
4、字段變更時提前發現問題,減少程式bug。
5、如果訪問的所有字段剛好在乙個索引裡面,則可以使用純索引訪問提高效能。
缺點:增加編碼工作量
由於會增加一些編碼工作量,所以一般需求通過開發規範來要求程式設計師這麼做,否則等專案上線後再整改工作量更大。
如果你的查詢表中有大字段或內容較多的字段,如備註資訊、檔案內容等等,那在查詢表時一定要注意這方面的問題,否則可能會帶來嚴重的效能問題。如果表經常要查詢並且請求大內容欄位的概率很低,我們可以採用分表處理,將乙個大表分拆成兩個一對一的關係表,將不常用的大內容字段放在一張單獨的表中,即表的垂直拆分。
(3)使用連線(join)來代替子查詢。
(4)拆分大的delete或insert語句。
二、選擇合適的資料型別。
(1)使用可存下資料的最小的資料型別,整型 < date,time < char,varchar < blob
(2)使用簡單的資料型別,整型比字元處理開銷更小,因為字串的比較更複雜。如,int型別儲存時間型別,bigint型別轉ip函式
(3)使用合理的字段屬性長度,固定長度的表會更快。使用enum、char而不是varchar。
(4)盡可能使用not null定義字段。
(5)盡量少用text,非用不可最好分表
三、選擇合適的索引列。
(1)查詢頻繁的列,在where,group by,order by,on從句**現的列
(2)where條件中,>=,between,in,以及like 字串+萬用字元(%)出現的列
(3)長度小的列,索引字段越小越好,因為資料庫的儲存單位是頁,一頁中能存下的資料越多越好
(4)離散度大(不同的值多)的列,放在聯合索引前面。檢視離散度,通過統計不同的列值來實現,count越大,離散程度越高:
mysql> select count(distinct column_name) from table_name;
四、使用命令分析。
(1)show檢視狀態
1.顯示狀態資訊
mysql> show [session|global] status like '%status_name%';
session(預設):取出當前視窗的執行
global:從mysql啟動到現在
(a)檢視查詢次數(插入次數com_insert、修改次數com_insert、刪除次數com_delete)
mysql> show status like 'com_select';
(b)檢視連線數(登入次數)
mysql> show status like 'connections';
(c)資料庫執行時間
mysql> show status like 'uptime';
(d)檢視慢查詢次數
mysql> show status like 'slow_queries';
(e)檢視索引使用的情況:
mysql> show status like 'handler_read%';
handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數。
handler_read_rnd_next:這個值越高,說明查詢低效。
2.顯示系統變數
mysql> show variables like '%variables_name%';
3.顯示innodb儲存引擎的狀態
mysql> show engine innodb status;
(2)explain分析查詢
mysql> explain select column_name from table_name;
explain查詢sql執行計畫,各列含義:
table:表名;
type:連線的型別
-const:主鍵、索引;
-eq_reg:主鍵、索引的範圍查詢;
-ref:連線的查詢(join)
-range:索引的範圍查詢;
-index:索引的掃瞄;
-all:全表掃瞄;
possible_keys:可能用到的索引;
key:實際使用的索引;
key_len:索引的長度,越短越好;
ref:索引的哪一列被使用了,常數較好;
rows:mysql認為必須檢查的用來返回請求資料的行數;
extra:using filesort、using temporary(常出現在使用order by時)時需要優化。
-using filesort 額外排序。看到這個的時候,查詢就需要優化了
-using temporary 使用了臨時表。看到這個的時候,也需要優化
(3)profiling分析sql語句
1.開啟profile。檢視當前sql執行時間
mysql> set profiling=on;
mysql> show profiles;
2.檢視所有使用者的當前連線。包括執行狀態、是否鎖表等
mysql> show processlist;
(4)procedure analyse()取得建議
通過分析select查詢結果對現有的表的每一列給出優化的建議
mysql> select column_name from table_name procedure analyse();
(5)optimize table**閒置的資料庫空間
mysql> optimize table table_name;
對於myisam表,當表上的資料行被刪除時,所佔據的磁碟空間並沒有立即被**,使用命令後這些空間將被**,並且對磁碟上的資料行進行重排(注意:是磁碟上,而非資料庫)。
對於innodb表,optimize table被對映到alter table上,這會重建表。重建操作能更新索引統計資料並釋放成簇索引中的未使用的空間。
只需在批量刪除資料行之後,或定期(每週一次或每月一次)進行一次資料表優化操作即可,只對那些特定的表執行。
(6)repair table修復被破壞的表
mysql> repair table table_name;
(7)check table檢查表是否有錯誤
mysql> check table table_name;
五、定位慢查詢
六、分割槽
七、配置優化
mysql 調優 Mysql調優
表設計 1 禁止使用外來鍵 2 多表中的相同列,必須保證列定義一致 3 國內表預設使用innodb,表字符集預設使用gbk,國際預設使用utf8的表 4 表必須包含gmt create和gmt modified欄位,即表必須包含記錄建立時間和修改時間的字段 5 單錶一到兩年內資料量超過500w或資料...
mysql回表慢sql SQL慢查詢常用優化方法
先建立測試表並使用儲存過程插入測試資料 create table cif student id varchar 40 not null,name varchar 40 default null,age varchar 40 default null,class id varchar 40 defau...
Mysql使用Merge引擎分表 方式及優缺點
merge 是sql語句的一種。具體來說,merge語句會檢查原資料表記錄和目標表記錄。如果記錄在原資料表和目標表中均存在,則目標表中的記錄將被原資料表中的記錄所更新 執行update操作 如果目標表中不存在的某 些 記錄,在原資料表中存在,則原資料表的這 些 記錄將被插入到目標表中 執行inser...