<h1> 資料庫觀念 </h1> ## :pencil: 指令類型 ### 資料定義語言 DDL > 用來定義和管理資料庫**結構**的語言 > 包括建立(Create)、修改(Alter)和刪除(Drop、Truncate)資料庫物件 ### 資料操作語言 DML > 用來管理**資料**的語言。 > 包括查詢(SELECT)、新增(INSERT)、更新(UPDATE)、刪除(DELETE)和資料庫中的資料。 ### 資料控制語言 DCL >用於管理資料庫的**存取權限**和**安全性**。 >包括賦予使用者使用權限(GRANT)、取消使用者的使用權限(REVOKE)、完成交易作業(COMMIT)、 >將已變動的資料回復到交易開始的狀態(ROLLBACK) &nbsp; ## :pencil: 資料庫索引 ### 資料庫索引(Database Index) 1. 大部分的 DBSM 都會預設把主鍵(Primary Key / ID)加上索引 2. 使用Binary Search的方式搜尋 3. 索引是利用另一張表儲存索引資料,因此是使用空間換時間的做法 &nbsp; ### 索引結構(Index Architecture) * **叢集索引**(Clustered Index) 1. 一張資料表只會有一個叢集索引,通常就是主鍵欄位 2. 直接修改原本的資料表順序,將資料按照要索引的欄位排序 3. 範圍連續資料的時候效率非常好 4. 叢集索引會調整資料順序,所以它最大的特色就是實體的資料(physical data rows)跟索引表(index block/index table)中的順序會是一樣的。 * **非叢集**(Non-Clustered) 1. 在索引表中自己依照索引值建立排列 2. 非叢集索引的排列順序不會/無法影響到實際資料的排列順序 3. 通常會使用非叢集索引的會是在 JOIN, WHERE 或是 ORDER BY 使用的非主鍵欄位(non-primary key columns)。 4. 過多的索引欄位會造成寫入速度大幅下降、增加資料異動時的處理時間 &nbsp; ## :pencil: 刪除指令差異 (Drop、Truncate、Delete) ### 刪除方式 | 指令 | Drop | Truncate | Delete | | -------- | -------- | -------- | -------- | | 速度 | 最快 | 中間 | 最慢 | | 範圍 | 刪除整張表及結構,包含索引、觸發器| 只刪除資料 | 只刪除資料 | | Rollback | X | X | O | | 自增值重置 | - | O | X | | 方式 | 直接刪除 | 先複製表結構,將原本的表整張刪除 | 逐筆執行並寫入日誌,供Rollback使用 | &nbsp; ###### 參考文章 > https://medium.com/@jinghua.shih/rails-%E7%B6%B2%E7%AB%99%E6%95%88%E8%83%BD%E5%84%AA%E5%8C%96-%E4%BA%8C-%E8%B3%87%E6%96%99%E5%BA%AB%E7%B4%A2%E5%BC%95-database-index-bd89fa3757a [資料庫觀念](https://hackmd.io/@tian841224/HJu-wx7Cp)