Mysql 千萬級資料量插入和查詢應該怎麼優化
關於插入:
巨集觀上:建二個表,其中一個表不建主鍵,不鍵索引。只記錄,到了晚上,在把這個表的記錄匯入 有主鍵有索引的表裡。方法的目的,二表,一表為插入最優化,另一表為查詢最優化。
微觀上:以下是涉及到插入表格的查詢的5種改進方法:
一、使用LOAD DATA INFILE從文字下載資料這將比使用插入語句快20倍。二、使用多個值表的 INSERT 語句,可以大大縮減客戶端與資料庫之間的連線、語法分析等消耗,使得效率比分開執行的單個 INSERT 語句快很多,相關的命令我們會在 SQL 優化詳細介紹。如果多值的 INSERT是往一個非空的資料表裡增加記錄,也可以通過調整 bulk_insert_buffer_size
insert本身的多個value:
INSERT INTO table (field1,field2,field3) VALUES ('a',"b","c"), ('a',"b","c"),('a',"b","c");
在my.cnf中新增如下語句,將insert語句的長度設為最大。
Max_allowed_packet=1M
Net_buffer_length=2k
檢視bulk_insert_buffer_size的值。mysql> SHOW VARIABLES;
+———————————+—————————————-+
| Variable_name | Value |
+———————————+—————————————-+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| automatic_sp_privileges | ON |
| back_log | 50 |
| basedir | /usr/local/mysql/ |
| binlog_cache_size | 32768 |
| bulk_insert_buffer_size | 8388608 |
三、可以對myisam表並行插入Concurrent_insert系統變數可以被設定用於修改concurrent-insert處理。該變數預設設定為1。如果concurrent_insert被設定為0,並行插入就被禁用。如果該變數被設定為2,在表的末端可以並行插入,即便該表的某些行已經被刪除。四、使用插入延遲如果你的客戶不能或無需等待插入完成的時候,這招很有用。當你使用MySQL儲存,並定期執行需要很長時間才能完成的SELECT和UPDATE語句的時候,你會發現這種情況很常見。當客戶使用插入延遲,伺服器立刻返回,如果表沒有被其他執行緒呼叫,則行會列隊等待被插入。使用插入延遲的另一個好處就是從多個客戶插入的情況會被繫結並記錄在同一個block中。這將比處理多個獨立的插入要快得多。
五、插入之前將表鎖定(只針對非事務處理型的表)
這將提高資料庫效能,因為索引緩衝區只是在所有的插入語句完成後才對磁碟進行一次重新整理。通常情況下,有多少個插入語句就會有多少次索引緩衝區重新整理。如果你可以用一個插入語句實現所有行的插入,則無需使用顯式鎖定語句。要想更快地對事務型表插入,你應該使用START TRANSACTION和COMMIT語句,而不是LOCK
TABLES語句。
關於查詢:一些網上找到的思路,把數字型的分出來,在吧字串型別的分離出去,再按時間分割,比如1個月1個數據分割槽,超過1年的移到老的資料表
統計時,先把統計類資料計算好,放入單獨的統計表中,再來新資料,再統計表上加上新資料