MySQL優化

1、SQL語句優化

(1)使用limit對查詢結果的記錄進行限定
(2)避免select *,將須要查找的字段列出來
(3)使用鏈接(join)來代替子查詢
(4)拆分大的delete或insert語句html

2、選擇合適的數據類型

(1)使用可存下數據的最小的數據類型,整型 < date,time < char,varchar < blob
(2)使用簡單的數據類型,整型比字符處理開銷更小,由於字符串的比較更復雜。如,int類型存儲時間類型,bigint類型轉ip函數
(3)使用合理的字段屬性長度,固定長度的表會更快。使用enum、char而不是varchar
(4)儘量使用not null定義字段
(5)儘可能少用text,非用不可最好分表mysql

3、選擇合適的索引列

(1)查詢頻繁的列,在where,group by,order by,on從句中出現的列
(2)where條件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出現的列
(3)長度小的列,索引字段越小越好,由於數據庫的存儲單位是頁,一頁中能存下的數據越多越好
(4)離散度大(不一樣的值多)的列,放在聯合索引前面。查看離散度,經過統計不一樣的列值來實現,count越大,離散程度越高:sql

mysql> SELECT COUNT(DISTINCT column_name) FROM table_name;

4、使用命令分析

(1)SHOW查看狀態
1.顯示狀態信息數據庫

mysql> SHOW [SESSION|GLOBAL] STATUS LIKE '%Status_name%';

session(默認):取出當前窗口的執行
global:從mysql啓動到如今
(a)查看查詢次數(插入次數com_insert、修改次數com_insert、刪除次數com_delete)session

mysql> SHOW STATUS LIKE 'com_select';

(b)查看鏈接數(登陸次數)函數

mysql> SHOW STATUS LIKE 'connections';

(c)數據庫運行時間post

mysql> SHOW STATUS LIKE 'uptime';

(d)查看慢查詢次數優化

mysql> SHOW STATUS LIKE 'slow_queries';

(e)查看索引使用的狀況:spa

mysql> SHOW STATUS LIKE 'handler_read%';

handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數。
handler_read_rnd_next:這個值越高,說明查詢低效。
2.顯示系統變量code

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;

5、定位慢查詢

MySQL慢查詢

6、分區

MySQL分區和分表

7、配置優化

MySQL配置優化

查看更多:
MySQL各存儲引擎
MySQL鎖詳解
MySQL事務
MySQL索引類型

相關文章
相關標籤/搜索