Mysql優化

1.大量寫入記錄信息
保證數據非常快地寫入到數據庫中
insert into 表名 values (),(),(),();
以上一個insert語句可以同時寫入多條記錄信息,但是不要寫入太多
避免意外情況發生。
可以一次少寫一些,例如每次寫入1000條,這樣100萬的記錄信息,執行1000次insert語句就可以了。分批分時間把數據寫入到數據庫中。

以上設計寫入大量數據的方法損耗的時間:
寫入數據(1000條)----->爲1000條數據維護索引
寫入數據(1000條)----->爲第2個1000條數據維護索引

寫入數據(1000條)----->爲第1000個1000條數據維護索引

以上設計寫入100萬條記錄信息,時間主要都被“維護索引”給佔據了
如果做優化:就可以減少索引的維護,達到整體運行時間變少。
(索引維護不需要做1000次,就想做一次)
解決:
先把索引給停掉,專門把數據先寫入到數據庫中,最後在一次性維護索引
1.1 Myisam數據表
1)數據表中已經存在數據(索引已經存在一部分)
alter table 表名 disable keys;
大量寫入數據
alter table 表名 enable keys; //最後統一維護索引
2)數據表中沒有數據(索引內部沒有東西)
alter table 表名 drop primary key ,drop index 索引名稱(唯一/普通/全文);
大量寫入數據
alter table 表名 add primary key(id),(唯一/全文)index 索引名 (字段);
1.2 Innodb數據表
該存儲引擎支持“事務”
該特性使得我們可以一次性寫入大量sql語句
具體操作:
start transaction;
大量數據寫入(100萬條記錄信息 insert被執行1000次)
事務內部執行的insert的時候,數據還沒有寫入到數據庫
只有數據真實寫入到數據庫纔會執行“索引”維護
commit;
commit執行完畢後最後會自動維護一次“索引”;
2. 單表、多表查詢
數據庫操作有的時候設計到 連表查詢、子查詢操作。
複合查詢一般要涉及到多個數據表,
多個數據表一起做查詢好處:sql語句邏輯清晰、簡單
其中不妥當的地方是:消耗資源比較多、時間長
不利於數據表的併發處理,因爲需要長時間鎖住多個表
例如:
查詢每個品牌下商品的總數量(Goods/Brand)
Goods:id name bd_id
Brand: bd_id name
select b.bd_id,b.name,count(g.*) from Brand b join Goods g on b.bd_id=g.bd_id group by b.bd_id;
以上sql語句總運行時間是5s
但是業務要求是數據庫的併發性要高,就需要把”多個查詢” 變爲 “單表查詢”
步驟:
① select bd_id,count(*) from Goods group by bd_id; //查詢每個品牌的商品數量 //3s
② select bd_id,name from Brand; //3s
③ 在php通過邏輯代碼整合① 和 ② //1s
雖然總體時間變成7秒,但是每個表只要鎖定3秒,併發性高了

3.limit使用
數據分頁使用limit;
limit 偏移量,長度(每頁條數);
偏移量:(當前頁碼-1)*每頁條數

分頁實現:
每頁獲得10條信息:
limit 0,10;
limit 10,10;
limit 20,10;
limit 30,10;
limit 990,10; //第100頁
limit 9990,10; //第1000頁
limit 99990,10; //第10000頁
limit 999990,10; //第100000頁
limit 1499990,10; //第150000頁

limit 1500000,10; //第150001頁
select * from emp limit 1500000,10; //慢 1秒多時間
select * from emp where empno>1600001 limit 10; //快 0.00秒級
在這裏插入圖片描述
數據表目前有empno主鍵索引:
在這裏插入圖片描述
limit 偏移量,長度;運行時間較長:
在這裏插入圖片描述
單純運行limit 運行時間比較長,內部沒有使用索引,翻頁效果 之前頁碼的信息給獲得出來,但是“越”過去,因此比較浪費時間
現在對獲得相同頁碼信息的sql語句進行優化
由單純limit變爲 where 和 limit的組合:
執行速度明顯加快,因爲其有使用where條件字段的索引
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
4. order by null
強制不排序
有的sql語句在執行的時候,本身默認會有排序效果
但是有的時候我們的業務不需要排序效果,就可以進行強制限制,進而“節省默認排序”的資源。

group by 字段;
獲得的結果默認情況會根據”分組字段”進行排序:
在這裏插入圖片描述
order by null強制不排序,節省對應資源:
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章