mysql 表ful mysql優化 一

2021-10-19 18:36:12 字數 3693 閱讀 9541

優化:

一、表設計優化。

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...