iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 30
1
自我挑戰組

網頁服務開發之路系列 第 30

Day 30. 資料庫類型介紹與索引建立

Chap 1. DB Connection Pooling

DB pool

1.1. Why DB connection pooling

  1. 減少開銷:
    • 預建及保留連線
    • 減少 TCP 連線關閉 cost
  2. 限制連線數量
    • 限制連線數量
    • 預防大量連線影響 DB 服務

1.2. 線上如何作

  1. Java
  2. PHP

1.3. 常見問題

  1. Connection Poll 不足
    • 使用量增加
    • Slow query
    • 外部大量撈取資料

1.4. 建議

  1. 減少 DB Query
    • 使用 memcache
    • Cache everything, if you can
  2. 拆分 I S
    • Read Write split
  3. Pool
    • 大型需求, over tcp/ip 資源溝通, 都需要 pool

Note

  1. primary Key / Index / Unique差別
  2. 待釐清
    1. TCP/IP 意思
    2. JAVA Proxool 意思
    3. memcache
  3. 參考: (Connection Pool)介紹

Chap 2. 資料庫類型介紹與索引建立

2.1 資料庫類型簡介

  1. 關聯式資料庫 - MariaDB
    1. 歷史: 原本的 MySQL 被 Oracle 公司收買,怕 Oracle 把它變成付錢的軟體,因此開源社群 建立一個 MariaDB
    2. 與 MySQL 完全相容,包括API, 命令列
    3. 參考: i. 官網, ii. SQL Structure and Commands
  2. NoSQL 文件導向資料庫 - MongoDB
    1. 採用文件的儲存架構,因為是分散式資料庫,好處有 i. 高水平擴展性、高可用性,可用來處理大數據集的資料庫
    2. 資料體結構: Key, Value 組合的,與 Json格式完全相同
    3. 不須明確定義 Table 的 Column和其形態,即可直接寫入資料
    4. 參考:
      1. 官網
      2. Query and Projection Operatiors
      3. Update Operators
      4. Online Course M104P-MongoDB for Developers
  3. NoSQL 記憶體、鍵值資料庫 - Redis
    1. Redis: 將資料存在記憶體中,以提升讀取的效率
    2. 主要功能: 提供快取,而非完整的正規SQL官聯式資料庫替代品
    3. 好處: 豐富的資料形態操作,如: Hashs, Lists, Sets, Sorted Sets,內建覆寫(Replication)功能(資料備援方案)
    4. 參考:
      i. 官網
      ii. Commands學習
  4. 架構橫向(Scaling)發展 - Spider
    1. DB spider

2.2 MySQL 如何使用index來加速搜尋

  1. 為何要使用 Index
    1. 加快搜尋速度
  2. 如何選擇 Index - 重點
    1. column 形態: boolean, int, datetime,最好是這三種
    2. 建立於 join, where, having, group by, order by 的 column
    3. Index 對於每個 record 最好唯一,盡量不要使用某個大量重複的值的字段建立 index,如 性別(M/F),此點與第一點的 column 形態中 boolean 有矛盾
    4. 使用 「LIKE」參數時,若將萬用字元(%)置於關鍵詞後方,才可以使用到 index 如 city like '台%'
    5. 不要將每個 column 都作為 index,此舉將降低 insert, update, delete的效率
  3. 如何使用 Index in MySQL
    1. MySQL 會自動判別使用index,不需要特別指定
    2. 判別邏輯:
      1. 第一個會自動使用最左邊的 COL1 當作 index,SQL[select * from TABLE where COL1 = 1 and COL2 = 2]
      2. 第二個為指定 COL2 作為 index,SQL[select * from TABLE use INDEX(COL2) where COL1 = 1 and COL2 = 2]
    3. 如果有多column組合的index查詢單欄record,多欄index 最左邊的 column一定要出現在條件中,才會使用 index,例如 3個index(COL1, COL2, COL3)
      1. 會用到 index: [select * from TABLE where COL1 = 1] or [... where COL1 = 1 and COL2 = 2], or [... where COL1 = 1 and COL2 = 2 and COL3 = 3]
      2. 不會用到 index: [select * from TABLE where COL2 = 2] or [... where COL2 = 2 and COL3 = 3], or [... where COL3 = 3], or [... where COL3 = 3 and COL2 = 2]
    4. 重點: 程式開發過程,善加利用線上已存在的 index,注意SQL語法欄位值的呈現,即可避免建置過多的 index
  4. 參考
    1. How MySQL Uses Indexes
    2. Optimizing SELECT Statements
    3. Optimization and Indexes
  5. 資料效能議題
    1. 資料量大
    2. ODBC 連線數增加
    3. 常時間查詢複雜的SQL
    4. AP 大量異動資料
  6. 常見問題 & 作法
    • Q: 利用網站框架快速開發產生的SQL語法
      • A: 部分SQL有效能議題,開發時要注意與優化
    • Q: DB DeadLock 發生
      • A: 確認觸發 Lock 的相關功能,檢視流程上同時觸發的可能性,近形調整
    • Q: 大量新增、更新、刪除
      • A: 分批進行處理,加上 limit 與 sleep 讓 DB 分批處理
    • Q: 針對資料量大的 TABLE 頻繁計算筆數
      • A: i. 上班前 AP完成每日統計值 ii. 採 Cache機制,AP完成每日統計值產生至 Memory
    • Q: SQL語法避免多層的 join, subquery
      • A: 分段進行處理,準則: 避免超過 3秒以上長時間查詢
    • Q: Log 需求的 TABLE資料量成長快速
      • A: 針對不同需求,規劃合適的保留時間

Chap 3. 測試

  1. SQL 語言中的 DML語法,包含哪些?
  2. primary key 為 (autono, custno),以下的 SQL 語法是否使用到 index?
    select ID_NO from ORDER where CUSTNO = 131564 and CREATE_DATE >= '2016/05/14 16:47:58'
    
  3. 承上題,建議哪個 column 建立 index?
  4. SQL 查詢 statement,如果加入搜尋的條件,何種資料的形態速度最快?
  5. 要確保關聯式資料庫的實體完整性(Entity Integrity),須使用哪個 Key?
  6. NoSQL的特性?

上一篇
Day 29. 【資訊安全】資訊安全政策與基本概念
系列文
網頁服務開發之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
阿展展展
iT邦好手 1 級 ‧ 2020-01-24 05:00:49

恭喜完賽~!!
結果到SQL就卡關惹
天數不夠 想講得太多XDD

恭喜完賽 /images/emoticon/emoticon64.gif

我要留言

立即登入留言