日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql优化三

發布時間:2023/12/10 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql优化三 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

相對高并發一樣,速度都是優化出來的,在高并發處理的時候,通常采用的是redis緩存,全文搜索引擎,數據庫本身優化,sql優化,磁盤優化

看如下圖:

所以可以得出的思想就是:

這個優化法則歸納為5個層次:
1、 減少數據訪問(減少磁盤訪問)
2、 返回更少數據(減少網絡傳輸或磁盤訪問)
3、 減少交互次數(減少網絡傳輸)
4、 減少服務器CPU開銷(減少CPU及內存開銷)
5、 利用更多資源(增加資源)

1、減少數據訪問
  1.1、創建并使用正確的索引
數據庫索引的原理非常簡單,但在復雜的表中真正能正確使用索引的人很少,即使是專業的DBA也不一定能完全做到最優。
索引會大大增加表記錄的DML(INSERT,UPDATE,DELETE)開銷,正確的索引可以讓性能提升100,1000倍以上,不合理的索引也可能會讓性能下降100倍,因此在一個表中創建什么樣的索引需要平衡各種業務需求。
索引常見問題:
索引有哪些種類?
  常見的索引有B-TREE索引、位圖索引、全文索引,位圖索引一般用于數據倉庫應用,全文索引由于使用較少,這里不深入介紹。B-TREE索引包括很多擴展類型,如組合索引、反向索引、函數索引等等,以下是B-TREE索引的簡單介紹:
B-TREE索引也稱為平衡樹索引(Balance Tree),它是一種按字段排好序的樹形目錄結構,主要用于提升查詢性能和唯一約束支持。B-TREE索引的內容包括根節點、分支節點、葉子節點。
葉子節點內容:索引字段內容+表記錄ROWID
  根節點,分支節點內容:當一個數據塊中不能放下所有索引字段數據時,就會形成樹形的根節點或分支節點,根節點與分支節點保存了索引樹的順序及各層級間的引用關系。
一個普通的BTREE索引結構示意圖如下所示:


1.2、只通過索引訪問數據
  有些時候,我們只是訪問表中的幾個字段,并且字段內容較少,我們可以為這幾個字段單獨建立一個組合索引,這樣就可以直接只通過訪問索引就能得到數據,一般索引占用的磁盤空間比表小很多,所以這種方式可以大大減少磁盤IO開銷。
如:select id,name from company where type='2';
如果這個SQL經常使用,我們可以在type,id,name上創建組合索引
create index my_comb_index on company(type,id,name);
  有了這個組合索引后,SQL就可以直接通過my_comb_index索引返回數據,不需要訪問company表。
還是拿字典舉例:有一個需求,需要查詢一本漢語字典中所有漢字的個數,如果我們的字典沒有目錄索引,那我們只能從字典內容里一個一個字計數,最后返回結果。如果我們有一個拼音目錄,那就可以只訪問拼音目錄的漢字進行計數。如果一本字典有1000頁,拼音目錄有20頁,那我們的數據訪問成本相當于全表訪問的50分之一。
切記,性能優化是無止境的,當性能可以滿足需求時即可,不要過度優化。在實際數據庫中我們不可能把每個SQL請求的字段都建在索引里,所以這種只通過索引訪問數據的方法一般只用于核心應用,也就是那種對核心表訪問量最高且查詢字段數據量很少的查詢。

1.3、優化SQL執行計劃
  SQL執行計劃是關系型數據庫最核心的技術之一,它表示SQL執行時的數據訪問算法。由于業務需求越來越復雜,表數據量也越來越大,程序員越來越懶惰,SQL也需要支持非常復雜的業務邏輯,但SQL的性能還需要提高,因此,優秀的關系型數據庫除了需要支持復雜的SQL語法及更多函數外,還需要有一套優秀的算法庫來提高SQL性能。
目前ORACLE有SQL執行計劃的算法約300種,而且一直在增加,所以SQL執行計劃是一個非常復雜的課題,一個普通DBA能掌握50種就很不錯了,就算是資深DBA也不可能把每個執行計劃的算法描述清楚。雖然有這么多種算法,但并不表示我們無法優化執行計劃,因為我們常用的SQL執行計劃算法也就十幾個,如果一個程序員能把這十幾個算法搞清楚,那就掌握了80%的SQL執行計劃調優知識。
由于篇幅的原因,SQL執行計劃需要專題介紹,在這里就不多說了。

2、返回更少的數據
2.1、數據分頁處理
  一般數據分頁方式有:
  2.1.1、客戶端(應用程序或瀏覽器)分頁
  將數據從應用服務器全部下載到本地應用程序或瀏覽器,在應用程序或瀏覽器內部通過本地代碼進行分頁處理
  優點:編碼簡單,減少客戶端與應用服務器網絡交互次數
  缺點:首次交互時間長,占用客戶端內存
  適應場景:客戶端與應用服務器網絡延時較大,但要求后續操作流暢,如手機GPRS,超遠程訪問(跨國)等等。
  2.1.2、應用服務器分頁
  將數據從數據庫服務器全部下載到應用服務器,在應用服務器內部再進行數據篩選。以下是一個應用服務器端Java程序分頁的示例:
  List list=executeQuery(“select * from employee order by id”);
  Int count= list.size();
  List subList= list.subList(10, 20);

  優點:編碼簡單,只需要一次SQL交互,總數據與分頁數據差不多時性能較好。
  缺點:總數據量較多時性能較差。
  適應場景:數據庫系統不支持分頁處理,數據量較小并且可控。

2.1.3、數據庫SQL分頁
  采用數據庫SQL分頁需要兩次SQL完成
  一個SQL計算總數量
  一個SQL返回分頁后的數據
優點:性能好
缺點:編碼復雜,各種數據庫語法不同,需要兩次SQL交互。

oracle數據庫一般采用rownum來進行分頁,常用分頁語法有如下兩種:

直接通過rownum分頁:
select * from (
select a.*,rownum rn from
(select * from product a where company_id=? order by status) a
where rownum<=20)
where rn>10;
數據訪問開銷=索引IO+索引全部記錄結果對應的表數據IO

采用rowid分頁語法
優化原理是通過純索引找出分頁記錄的ROWID,再通過ROWID回表返回數據,要求內層查詢和排序字段全在索引里。
create index myindex on product(company_id,status);

select b.* from (
select * from (
select a.*,rownum rn from
(select rowid rid,status from product a where company_id=? order by status) a
where rownum<=20)
where rn>10) a, product b
where a.rid=b.rowid;
數據訪問開銷=索引IO+索引分頁結果對應的表數據IO

實例:
一個公司產品有1000條記錄,要分頁取其中20個產品,假設訪問公司索引需要50個IO,2條記錄需要1個表數據IO。
那么按第一種ROWNUM分頁寫法,需要550(50+1000/2)個IO,按第二種ROWID分頁寫法,只需要60個IO(50+20/2);

2.2、只返回需要的字段
通過去除不必要的返回字段可以提高性能,例:
調整前:select * from product where company_id=?;
調整后:select id,name from product where company_id=?;

優點:
1、減少數據在網絡上傳輸開銷
2、減少服務器數據處理開銷
3、減少客戶端內存占用
4、字段變更時提前發現問題,減少程序BUG
5、如果訪問的所有字段剛好在一個索引里面,則可以使用純索引訪問提高性能。
缺點:增加編碼工作量
由于會增加一些編碼工作量,所以一般需求通過開發規范來要求程序員這么做,否則等項目上線后再整改工作量更大。
如果你的查詢表中有大字段或內容較多的字段,如備注信息、文件內容等等,那在查詢表時一定要注意這方面的問題,否則可能會帶來嚴重的性能問題。如果表經常要查詢并且請求大內容字段的概率很低,我們可以采用分表處理,將一個大表分拆成兩個一對一的關系表,將不常用的大內容字段放在一張單獨的表中。如一張存儲上傳文件的表:
T_FILE(ID,FILE_NAME,FILE_SIZE,FILE_TYPE,FILE_CONTENT)
我們可以分拆成兩張一對一的關系表:
T_FILE(ID,FILE_NAME,FILE_SIZE,FILE_TYPE)
T_FILECONTENT(ID, FILE_CONTENT)
通過這種分拆,可以大大提少T_FILE表的單條記錄及總大小,這樣在查詢T_FILE時性能會更好,當需要查詢FILE_CONTENT字段內容時再訪問T_FILECONTENT表。

3、減少交互次數
3.1、batch DML
  數據庫訪問框架一般都提供了批量提交的接口,jdbc支持batch的提交處理方法,當你一次性要往一個表中插入1000萬條數據時,如果采用普通的executeUpdate處理,那么和服務器交互次數為1000萬次,按每秒鐘可以向數據庫服務器提交10000次估算,要完成所有工作需要1000秒。如果采用批量提交模式,1000條提交一次,那么和服務器交互次數為1萬次,交互次數大大減少。采用batch操作一般不會減少很多數據庫服務器的物理IO,但是會大大減少客戶端與服務端的交互次數,從而減少了多次發起的網絡延時開銷,同時也會降低數據庫的CPU開銷。
3.2 緩存概念

  通過redis等內存工具將數據庫緩存到內存中

3.3 全文搜索 es

  可以將數據進行導入es中進行緩存,然后查詢只是在es中查詢,可以減少對數據庫的交互

?這個是很早之前總結的,一直在有道云筆記上,希望大家拍磚.

?

轉載于:https://www.cnblogs.com/xiufengchen/p/10350369.html

總結

以上是生活随笔為你收集整理的mysql优化三的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。