1. 程式人生 > >資料庫的索引,統計,儲存,設計

資料庫的索引,統計,儲存,設計

索引:資料結構指向資料
MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取資料的資料結構。
                    提取句子主幹,就可以得到索引的本質:索引是一種資料結構。
索引:資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構就是索引

InnoDB的輔助索引data域儲存相應記錄主鍵的值而不是地址

MySQL自動為InnoDB表生成一個隱含欄位作為主鍵,這個欄位長度為6個位元組,型別為長整形。

MySQL的優化主要分為結構優化(Scheme optimization)和查詢優化(Query optimization)。
索引屬於結構優化

不建議建索引的情況(索引檔案本身要消耗儲存空間,同時索引會加重插入、刪除和修改記錄時的負擔,
                另外,MySQL在執行時也要消耗資源維護索引)
第一種情況是表記錄比較少
第二種選擇性較低(選擇性:不重複的索引值)

在使用InnoDB儲存引擎時,如果沒有特別的需要,請永遠使用一個與業務無關的自增欄位作為主鍵。(最好設定自增的欄位)

1.聚集索引不僅僅是一種單獨的索引型別,
    而且是一種儲存資料的方式。
    Innodb引擎的聚集索引實際上在同樣的結構中儲存了B-Tree索引和資料行。
    表有聚集索引時,它的資料行實際上儲存在索引的葉子上。注意是儲存引擎來實現索引
    
    
主鍵    唯一鍵 外來鍵  索引
A:主鍵一定是唯一鍵,但唯一鍵不一定是主鍵
B:b表的一個欄位是a表的主鍵,那麼b就是a的外來鍵 (b表的外來鍵,指向的就是 a表的主鍵)

主鍵:能夠唯一標識表中某一行的屬性或屬性組。
    一個表只能有一個主鍵,但可以有多個候選索引。
    主鍵常常與外來鍵構成參照完整性約束,防止出現數據不一致。
    主鍵可以保證記錄的唯一和主鍵域非空,資料庫管理系統對於主鍵自動生成唯一索引,所以主鍵也是一個特殊的索引。

外來鍵: 是用於建立和加強兩個表資料之間的連結的一列或多列。
    外來鍵約束主要用來維護兩個表之間資料的一致性。
    簡言之,表的外來鍵就是另一表的主鍵,外來鍵將兩表聯絡起來。
    一般情況下,要刪除一張表中的主鍵必須首先要確保其它表中的沒有相同外來鍵
    (即該表中的主鍵沒有一個外來鍵和它相關聯)。
索引:是用來快速地尋找那些具有特定值的記錄。
    主要是為了檢索的方便,是為了加快訪問速度, 按一定的規則建立的,一般起到排序作用。
    所謂唯一性索引,這種索引和前面的“普通索引”基本相同,但有一個區別:
    索引列的所有值都只能出現一次,即必須唯一。

主鍵一定是唯一性索引,唯一性索引並不一定就是主鍵。
 一個表中可以有多個唯一性索引,但只能有一個主鍵。
主鍵列不允許空值,而唯一性索引列允許空值。
主鍵可以被其他欄位作外來鍵引用,而索引不能作為外來鍵引用。

儲存過程具有效能上的優勢
缺點:儲存時將資料的一致性儲存在資料庫中時,對於版本控制、開發和部署、以及資料庫的遷移都會帶來很大的影響

MySQL資料型別:
    數值型別:
    日期和時間型別:
    字串型別:
    變數賦值

語法:SET 變數名 = 變數值 [,變數名= 變數值 ...]

使用者變數

使用者變數一般以@開頭

注意:濫用使用者變數會導致程式難以理解及管理


A:資料庫設計不應該針對整個系統,應該根據系統架構的元件劃分。(系統和結構提供重構性)

C:資料庫表的對映 一個表的所以非關鍵字都依賴關鍵字,關鍵字可以是一個屬性,也可以是多個屬性的集合,(關鍵字保證唯一性)
    (隨機字串作為表的關鍵字或者自增)
D:應針對所有表的主鍵和外來鍵建立索引,有針對性的(針對一些大資料量和常用檢索方式)
    建立組合屬性的索引,提高檢索效率。(資料量大,無索引會降低效能)

E:設計出的表要具有較好的使用性(使用性:查詢時是否需要關聯多張表且還需使用複雜的SQL技巧)

//規則1:表必須要有主鍵。
//規則2:一個欄位只表示一個含義。
//規則3:總是包含兩個日期欄位:gmt_create(建立日期),gmt_modified(修改日期),且這兩個欄位不應該包含有額外的業務邏輯。
//規則4:MySQL中,gmt_create、gmt_modified使用DATETIME型別。
//規則5:禁止使用複雜資料型別(陣列,自定義型別等)。
//規則6: MySQL中,附屬表拆分後,附屬表id與主表id保持一致。不允許在附屬表新增主鍵欄位。
//規則7: MySQL中,存在過期概念的表,在其設計之初就必須有過期機制,且有明確的過期時間。過期資料必須遷移至歷史表中。
//規則8: MySQL中,不再使用的表,必須通知DBA予以更名歸檔。
//規則9: MySQL中,線上表中若有不再使用的欄位,為保證資料完整,禁止刪除。
//規則10: MySQL中,禁止使用OCI驅動,全部使用THIN驅動。

thin 底層是通過tcp/ip協議實現的。oci是通過呼叫oci客戶端c動態庫實現的。
oci jdbc使用之前必須要安裝oci 的客戶端,所以我們通常會選擇thin驅動來連線oracle資料庫。
理論上oci jdbc驅動要優與thin的驅動。

innodb採用mvcc(多版本併發控制)來處理併發。
    mvcc只工作在read commited,repeatable read這兩種事務隔離級別上。
    
只有myisam支援全文檢索

注意事項:
A:field定義為Not NULL(它會使索引,索引統計更加複雜。可空列需要更多的儲存空間,
                    還需要mysql內部進行特殊處理,當可空列被索引時,每條記錄都需要一個格外的位元組。
                    即使要在表中儲存"沒有值"的欄位,考慮使用0,特殊欄位或者空字串來代替。)
B:datetime與timestamp能儲存同樣的資料:精確度為秒,但是timestamp使用的空間只有datetime的一半,
            還能儲存時區,擁有特殊的自動更新能力。但是timestamp儲存的時間範圍要比datetime要小得多。
            mysql能儲存的最細的時間粒度為秒
C:mysql支援多種別名
D:float與double型別支援使用標準的浮點運算進行近似計算。
    Decimal型別儲存精確的小數,在>=mysql5.0,mysql伺服器自身進行了decimal的運算,
    因為CPU不支援直接對它進行運算,所以慢一點。

E:mysql會把text與blob型別的列當成有實體的物件來進行儲存。
      他們有各自的資料型別家族(tinytext,smalltext,text,mediumtext,longtext; blob類似);
     mysql對blob與text列排序方式和其他型別有所不同,它不會按照字串的完整長度來排序。
      而只是按照max_sort_length規定的若干個位元組來進行排序。
      
F:採用enum來代替字串型別。mysql在內部把每個列舉值都儲存為整數。
    enum在內部是按照數字進行排序的,而不是按照字串。
    enum最不好的就是字串列表是固定的,新增和刪除必須使用alter table。

G:ip地址,一般會採用varchar(15)列來儲存。事實上,IP地址是個無符號的32位整數,而不是字串。
    mysql提供了inet_aton()和inet_nota()函式在證書與ip地址之間進行轉換。

myisam與innodb資料佈局:
    myisam索引樹(無論是主鍵索引還是非主鍵索引)葉子節點都是指向的資料行,
    而innodb中聚集索引,主鍵索引樹葉子節點就帶得有資料的內容,
        而非主鍵索引樹中葉子節點指向主鍵值,而不是資料的位置。

mysql有兩種產生排序結果的方式:使用檔案排序,或者掃描有序的索引。

myisam表有表級鎖;myisam表不支援事務,實際上,myisam並不保證單條命令完成;
            myisam只快取了mysql程序內部的索引,並儲存在鍵快取區內。
            OS快取了表的資料;行被緊密的儲存在一起,磁碟上的資料有很小的磁碟佔用和快速的全表掃描。
            
innodb支援事務和四種事務隔離級別;在mysql5.0中,只有innodb支援外來鍵;支援行級鎖與mvcc;
                        所有的innodb表都是按照主鍵聚集的;所有索引(出開主鍵)都是按主鍵引用行;
                        索引沒有使用字首壓縮,因此索引可能比myisam大很多;
                        資料轉載緩慢;阻塞auto_increment,
                        也就是用表級鎖來產生每個auto_increment。
                        
mysql效能
A:mysql提供了一個benchmark(int 迴圈次數,char* 表示式); 可以分析表示式執行所花時間。
B:mysql有兩種查詢日誌:普通日誌和慢速日誌。
普通日誌:記錄了Mysql執行的所有操作,無論這些操作執行成功與否。另外還包括一些事件,例如客戶端連線斷開的一些資訊,預設不開啟。
慢速日誌:慢日誌記錄執行時間過程和沒有使用索引的查詢語句,報錯select、update、delete以及insert語句,慢日誌只會記錄執行成功的語句。

MySQL高階特性:
    1.在mysql中,只有myisam儲存引擎支援全文索引。myisam全文索引是一種特殊的具有兩層結構的B樹。

  2.儲存引擎事務在儲存引擎內部被賦予acid屬性,分散式(XA)是一種高層次事務,它可以歷喲內部個兩段提交的方式將acid屬性擴充套件到儲存引擎外部,甚至資料庫外部。階段1:通知所有提交者準備提交 階段2:通知所有參與者進行真正提交。

  3.mysql 的字符集和校對規則有 4 個級別的預設設定:伺服器級、資料庫級、表級和欄位級。

ACID(Atomicity 原子性、要求每個事物中的所有操作要麼全部完成,要麼就像全部沒有發生一樣
Consistency 一致性、確保了任何事物都會使資料庫從一種合法的狀態變為另一種合法的狀態。
Isolation 隔離性、保證了併發執行多個事物對系統的狀態的影響和序列化執行多個事物對系統的狀態的影響是一樣的。隔離性是併發控制的主要目標。 通過併發控制的方法,一個未完成的事物的影響對其他事物是不可見的。
Durability 永續性:保證了一個事物一旦被提交以後,其狀態就保持不變,甚至是發生了主機斷電、奔潰、錯誤等。
)是一系列屬性。