一.發展史
1.文件存儲(所有的內容都存在文件中)
2.單文件存儲(key-value)(存儲在多個文件中,會有一張存地址的表key-對應的磁盤路徑,查找速度回相對快)
3.層次數據(key-value)
key1 | parent:k2 child:K3 |
key2 | …… |
key3 | …… |
4.網狀數據庫
在層次數據庫的基礎中(上圖)行數據如果超過16K,數據庫就會自動創建溢出桶,溢出桶超過16K,溢出桶也會創建溢出桶,形成網狀數據庫。
故:設計數據庫時儘量計算一下所有列加在一起的長度儘量不要超過16K
此問題也不用考慮,DBA可以通過工具進行碎片整理,將溢出的桶整理,將同一個行數據儘量保持在同一個主桶中
二.性能(索引)
1.B+索引一般用於唯一索引(主鍵等)
目前會要求數據庫內存大點是爲了存儲索引內容(目前索引會將索引對應的字段存入到索引體系中)
故:索引字段儘量不要太長(會增加存儲索引的內容,從而佔用數據庫內存)
索引儘量用整型,其次浮點型、再其次是varchar型
2.varchar型索引優化
例如:A表的varchar字段:UUID
需要添加一個字段CRC(32)【此字段存儲UUID字段轉換成CRC(32)int類型的字段】
查詢語句的寫法
select 字段 from 表
where CRC(32) =? 【因爲數據量相當大是,CRC(32) 會有重複(即使UUID是不重複的),故UUID字段查詢條件還是要加入,但是因爲先過濾了CRC(32),UUID過濾之後,重複的數據量就會很少,檢索速度也會很高】
and UUID = ?
3.組合索引
例如:索引A 組合了A、B、C三個字段
數據庫後臺操作時,實際會添加三個索引
index(A)
index(A、B)
index(A、B、C)
故:如果創建了A、B、C的組合索引,再搜索A或者A、B或者ABC的時候索引會起作用,搜索BC索引不起作用
索引會遵循左墜索引原則(具體可以查看一下,不同的數據庫原則會不太一樣,mysql遵循此原則)
三.發展趨勢
SQL語言:是非存儲性語言
只是一個報表語語言、表示層語言
SQL語言本身就會降低數據的處理速度
nosql,就是不通過sql語音,直接操作數據庫,速度回相對比較高
Habse:表示層語言 phinx
hadoop:表示層語言Hive