九億條資料表的優化引出的資料庫思考

2022-01-16 07:18:30 字數 1462 閱讀 9832

基於主題和之前的經驗做了乙個導圖,分享於此

1.1 資料庫引擎及字符集的選擇

1.2 索引優化

1.2.1 需要join的表字段建立索引

1.2.2 基於業務分析在常用查詢條件上建立索引 ,where 、group、order by

1.2.3 根據資料離散程度建立索引:無重複資料字段建立唯一索引,否則建立普通索引

1.2.4 經常使用的字段建立索引,減少查詢時的表掃瞄

1.2.5 建立聯合索引時,注意索引建立的順序,需要排序的用在前面

1.3 sql語句優化

1.3.1 寫資料優化

1.3.1.1 可以同步提交盡量同步提交,減少資料庫的連線數

1.3.1.2 拆分大的事務,主線程只處理主邏輯,附屬邏輯放到mq中,通過服務處理

1.3.1.3 insert ,update 可能的情況盡量集合操作

1.3.2 查詢

1.3.2.1 避免複雜的join

1.3.2.2 select 僅需要的列

1.3.2.3 基於索引進行查詢,或者補充索引

1.3.2.4 基於查詢分析器,分析語句執行過程,優化索引

1.3.2.5 oracle 可以使用hint優化器

1.3.2.6 不要使用無法命中索引的寫法,如果!=,<>,or 等

1.4 系統層面

1.4.1 調整資料記憶體的佔用率,讓資料庫熱資料盡量儲存在記憶體中

1.5 資料庫架構層面

1.5.1 讀/寫分離

1.5.2 高可用集群

1.5.3 分片儲存

1.6 業務層面

1.6.1 限制訪問數量-比如秒殺:超過數量直接返回失敗。成功請求進入佇列處理,然後使用者在訂單中心檢視秒殺結果進行並付塊

1.6.2 將熱點資料預熱到快取中

1.7 資料結構調整

1.7.1 設計優化:適度冗餘,減少join

1.7.2 垂直拆分,將訪問頻率低大字段拆分到新錶中

1.7.3 水平拆分

1.7.3.1 存在大量歷史資料:可以基於時間講歷史資料歸檔

1.7.3.2 新系統:可以基於離散演算法拆分,比如id%

1.7.4 資料型別選擇

1.7.4.1 mysql下優先順序:數值型別 > 日期 > 二進位制 > 字元

1.7.4.2 長度(相對)固定用char,否則用varchar

1.7.4.3 精確度:decimal > float,儲存開銷則相反

1.7.4.4 留意char varchar nvarchar的區別

1.8 優化中的問題

1.8.1 優化後邏輯處理的複雜程度

1.8.2 資料庫維護複雜度增加

1.8.3 資料平滑遷移的複雜度

1.8.4 程式功能的修改量

附導圖:

資料庫 資料表的操作

資料表 是資料庫最重要的組成部分之一,資料是儲存在資料表中 資料表由行 row 和列 column 來組成 每個資料表中至少有一列,行可以有零行一行或者多行組成 建立表 create table if not exists tbl name 欄位名稱 字段型別 完整性約束條件 欄位名稱 字段型別 完...

MySQL 資料庫 資料表

1 檢視原始資料庫information schema中的表,並顯示出views表的字段結構屬性資訊 第一步 檢視所有的資料庫 show databases 如圖一 第二步 檢視information schema 內容 如圖二 第三步 檢視views 結構 如圖三 2 建立乙個offcn資料庫,並...

MySQL備份每個資料庫表中100條資料

如果是本地備份,不需要使用者名稱 密碼 mysqldump all databases where 1 1 limit 100 lock all tables g backup100.sql如果是遠端備份,需要主機名 使用者名稱和密碼 還需要使用者有reload許可權 mysqldump ugood...