mysql 優化(大數據導入、where條件順序、 information_schema )

當數據量較大時,如上百萬甚至上千萬記錄時,向MySQL數據庫中導入數據一般是一個比較費時的過程。一般能夠採起如下方法來加速這一過程: 數據庫

1、對於Myisam類型的表,能夠經過如下方式快速的導入大量的數據。
ALTER TABLE tblname DISABLE KEYS;
loading the data
ALTER TABLE tblname ENABLE KEYS;
這兩個命令用來打開或者關閉Myisam表非惟一索引的更新。在導入大量的數據到一個非空的Myisam表時,經過設置這兩個命令,能夠提升導入的效率。對於導入大量數據到一個空的Myisam表,默認就是先導入數據而後才建立索引的,因此不用進行設置。 大數據

2、對於Innodb類型的表,有如下幾種方式能夠提升導入的效率:
①由於Innodb類型的表是按照主鍵的順序保存的,因此將導入的數據按照主鍵的順序排列,能夠有效的提升導入數據的效率。若是Innodb表沒有主鍵,那麼系統會默認建立一個內部列做爲主鍵,因此若是能夠給表建立一個主鍵,將能夠利用這個優點提升導入數據的效率。 spa

②在導入數據前執行SET UNIQUE_CHECKS=0,關閉惟一性校驗,在導入結束後執行SET UNIQUE_CHECKS=1,恢復惟一性校驗,能夠提升導入的效率。 orm

③若是應用使用自動提交的方式,建議在導入前執行SET AUTOCOMMIT=0,關閉自動提交,導入結束後再執行SET AUTOCOMMIT=1,打開自動提交,也能夠提升導入的效率。 索引

WHERE子句後面的條件順序對大數據量表的查詢會產生直接的影響。如:
Select * from zl_yhjbqk where dy_dj = '1KV如下' and xh_bz=1
Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV如下'
以上兩個SQL中dy_dj(電壓等級)及xh_bz(銷戶標誌)兩個字段都沒進行索引,因此執行的時候都是全表掃描,第一條SQL的dy_dj = '1KV如下'條件在記錄集內比率爲99%,而xh_bz=1的比率只爲0.5%,在進行第一條SQL的時候99%條記錄都進行dy_dj及xh_bz的比較,而在進行第二條SQL的時候0.5%條記錄都進行dy_dj及xh_bz的比較,以此能夠得出第二條SQL的CPU佔用率明顯比第一條低。
io

若是想知道MySQL數據庫中每一個表佔用的空間、表記錄的行數的話,能夠打開MySQL的 information_schema 數據庫。在該庫中有一個 TABLES 表,這個表主要字段分別是: form

TABLE_SCHEMA : 數據庫名
TABLE_NAME:表名
ENGINE:所使用的存儲引擎
TABLES_ROWS:記錄數
DATA_LENGTH:數據大小
INDEX_LENGTH:索引大小 效率

其餘字段請參考MySQL的手冊,咱們只須要了解這幾個就足夠了。 方法

因此要知道一個表佔用空間的大小,那就至關因而 數據大小 + 索引大小 便可。 數據

SQL:

SELECT TABLE_NAME,DATA_LENGTH+INDEX_LENGTH,TABLE_ROWS FROM TABLES WHERE TABLE_SCHEMA='數據庫名' AND TABLE_NAME='表名'

相關文章
相關標籤/搜索