數據庫 --- 索引、觸發器、事務(存儲引擎)

一、數據庫  -----   按照數據結構來組織、存儲和管理數據的倉庫

  主要特點:

    • 實現數據共享;

    • 減少數據的冗餘度;

    • 數據的獨立性;

    • 數據實現集中控制;

    • 數據一致性和可維護性,以確保數據的安全性和可靠性;

    • 故障恢復。

二、其他相關

1、索引:作用於表中的某列,並將其進行排序,有助於快速地進行查詢。

    索引是對數據庫表中一個或多個列的值進行排序的數據結構,是用於提高在數據庫表中訪問數據的速度的數據庫對象。其實索引相當於一本書的目錄,如果沒有索引,要想在數據庫中查找某一特定的值就需要遍歷整個數據庫表,但是有了索引之後就可以在索引當中查找,有助於更快地獲取信息;

    索引可分爲聚集索引和非聚集索引;對於 聚集索引:是按照數據存放的物理位置爲順序的;而 非聚集索引中,表數據存儲順序與索引順序無關;一張表上只能創建一個聚集索引,因爲真實數據的物理順序只可能是一種;如果一張表沒有聚集索引,那麼它被稱爲“堆集”,這樣的表中的數據行沒有特定的順序,所有的新行將被添加到表的末尾位置。

    一條索引記錄中包含的基本信息有:鍵值(定義索引時指定的所有字段的值)+邏輯指針(指向數據頁或另一索引頁);根據數據庫的功能,可以在數據庫設計器中創建三種索引

  • (1)唯一索引 :不允許其中任何兩行具有相同索引值的索引;

        當現有數據中存在重複的鍵值時,大多數數據庫不允許將新創建的唯一索引與表一起保存。數據庫還可能防止添加將在表中創建重複鍵值的新數據。

使用語句爲:

CREATE UNIQUE INDEX 索引名稱
ON 表名稱 (列名稱,如果爲多個列用逗號隔開)

    對於一個簡單索引的創建,只需將唯一索引中的UNIQUE去掉就可以了;

  • (2)主鍵索引

    數據庫表經常有一列或多列組合,其值唯一標識表中的每一行,該列稱爲表的主鍵

    在數據庫關係圖中爲表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對數據的快速訪問;

  • (3)聚集索引

    在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數據訪問速度。

    雖然說建立索引的目的是加快對錶中記錄的查找排序,但是爲表設置索引要付出代價的:一是增加了數據庫的存儲空間,二是在插入和修改數據時要花費較多的時間(因爲索引也要隨之變動)。

       數據庫索引就是爲了提高表的搜索效率而對某些字段中的值建立的目錄 ;其各有優缺點:


    1)優點:創建索引可以大大提高系統的性能

    • 通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性;

    • 可以大大加快數據的檢索速度,這也是創建索引的最主要的原因;

    • 可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義;

    • 在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間;

    • 通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。

    

    2)缺點:

  • 創建索引和維護索引要耗費時間,這種時間隨着數據量的增加而增加;

  • 索引需要佔物理空間,除了數據表佔數據空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大;

  • 當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。


    因此,對於索引的使用和建立,應該視情況而定,比如對於那些查詢次數很少或者數據值也比較少的列就不必要建立索引,因爲不僅不能提高多少查詢速度,反而會耗費一定的空間和降低系統的維護程度。

    語法格式如下:

create or replace index index_name
on emp(empno)
tablespace tablespace_name;

2、觸發器:是數據庫在進行某種操作之前或之後進行的操作。

(1)觸發器是一種特殊類型的存儲過程,它在指定的表中的數據進行變化的時候自動生效觸發器是一個特殊的事務單元可以引用其他表中的列執行特殊的業務規則或數據邏輯關係

        當出現錯誤時,可以執行rollback transaction操作將整個觸發器以及觸發它的T-SQL語句一併回滾(不需顯示聲明begin transaction);喚醒調用觸發器以響應INSERT、UPDATE 或 DELETE 語句。觸發器可以查詢其它表,並可以包含複雜的Transact-SQL語句。將觸發器和觸發它的語句作爲可在觸發器內回滾的單個事務對待。如果檢測到嚴重錯誤(例如,磁盤空間不足),則整個事務即自動回滾,即撤銷。

(2)觸發器類型【兩種】:

       AFTER觸發器:  這種觸發器將在數據變動(insert、update、delete動作)完成以後才觸發。

對變動的數據進行檢查,如果發現錯誤,則拒絕或回滾變動的數據;

       INSTEAD OF觸發器:   這種觸發器將在數據變動以前被觸發,並取代變動數據的操作(insert、update、delete操作),轉而去執行觸發器定義的操作;

      在建立觸發器時,還必須指定觸發操作:insert、update、delete操作,至少指定一種,也可指定多種;


 (3) 創建觸發器:

CREATE TRIGGER trigger_name//觸發器名稱
ON { table | view }//在其上執行的表或視圖
[ WITH ENCRYPTION ]//可防止觸發器作爲SQL Server的一部分發布
{
    { 
        { FOR | AFTER | INSTEAD OF } //觸發器類別,決定是after還是instead of
        { [ INSERT ][,] [ DELETE ][,] [ UPDATE ] }//指定激發觸發器的關鍵字
            
            [ WITH APPEND ]
            [ NOT FOR REPLICATION ]//表示當複製進程更改觸發器所涉及的表時,不應執行該觸發器
            AS//觸發器要執行的操作
            [ { IF UPDATE ( column )//測試在指定的列上進行的 INSERT 或 UPDATE 操作,不能用於 DELETE 操作。可以指定多列。
            [ { AND | OR } UPDATE ( column ) ]
            [ ...n ]
            | IF ( COLUMNS_UPDATED(){bitwise_operator//位運算符} updated_bitmask )//測試是否插入或更新了提及的列,僅用於UPDATE和INSERT觸發器中
            {comparison_operator//比較運算符}column_bitmask [ ...n ]
        } ]
        sql_statement [ ...n ]//SQL Server不支持在觸發器中包含所有的create語句、DROP語句等
    }
}

3、事務:是一個或一組邏輯單元,由多個SQL語句組成,可以對數據庫上的對象進行操作。

    (1)事務(Database Transaction) ,是指作爲單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過將一組相關操作組合爲一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程序更加可靠。

    (2)相關屬性

       ①原子性(Atomicity):事務中的所有元素作爲一個整體提交或回滾,事務的個元素是不可分的,事務是一個完整操作。
         ②一致性(Consistemcy):事物完成時,數據必須是一致的,也就是說,和事物開始之前,數據存儲中的數據處於一致狀態。
保證數據的無損
         ③隔離性(Isolation):對數據進行修改的多個事務是彼此隔離的。這表明事務必須是
獨立的,不應該以任何方式以來於或影響其他事務。
         ④持久性(Durability):事務完成之後,它對於系統的
影響是永久的,該修改即使出現系統故障也將一直保留,真實的修改了數據庫。

(3)三種模型

  • 隱式事務是指每一條數據操作語句都自動地成爲一個事務,事務的開始是隱式的,事務的結束有明確的標記;

  • 顯式事務是指有顯式的開始和結束標記的事務,每個事務都有顯式的開始和結束標記;

  • 自動事務是系統自動默認的,開始和結束不用標記;

(4)使用事務的語句:

  • 開始事物:BEGIN  TRANSACTION

  • 提交事物:COMMIT  TRANSACTION

  • 回滾事務:ROLLBACK  TRANSACTION

(5)事務的保存點

  1.           SAVE  TRANSACTION  保存點名稱 ——自定義保存點的名稱和位置

  2.           ROLLBACK  TRANSACTION  保存點名稱 ——回滾到自定義的保存點

4、存儲引擎

(1)MySQL中的數據用各種不同的技術存儲在文件(或者內存)中,這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力,通過選擇不同的技術,能夠獲得額外的速度或者功能,從而改善應用的整體功能。這些不同的技術以及配套的相關功能在MySQL中被稱作存儲引擎(也稱作表類型)

        MySQL默認配置了許多不同的存儲引擎,可以預先設置或者在MySQL服務器中啓用。可以選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及需要數據結合什麼性能和功能的時候能提供最大的靈活性。

(2)常用的存儲引擎:

   I 、  MyISAM

  • 特性
    不支持事務:MyISAM存儲引擎不支持事務,所以對事務有要求的業務場景不能使用
    表級鎖定:其鎖定機制是表級索引,這雖然可以讓鎖定的實現成本很小但是也同時大大降低了其併發性能
    讀寫互相阻塞:不僅會在寫入的時候阻塞讀取,MyISAM還會在讀取的時候阻塞寫入,但讀本身並不會阻塞另外的讀
    只會緩存索引:MyISAM可以通過key_buffer緩存以大大提高訪問性能減少磁盤IO,但是這個緩存區只會緩存索引,而不會緩存數據

  • 適用場景
    不需要事務支持(不支持)
    併發相對較低(鎖定機制問題)
    數據修改相對較少(阻塞問題)
    以讀爲主
    數據一致性要求不是非常高

  • 最佳實踐
    儘量索引(緩存機制)
    調整讀寫優先級,根據實際需求確保重要操作更優先
    啓用延遲插入改善大批量寫入性能
    儘量順序操作讓insert數據都寫入到尾部,減少阻塞
    分解大的操作,降低單個操作的阻塞時間
    降低併發數,某些高併發場景通過應用來進行排隊機制
    對於相對靜態的數據,充分利用Query Cache可以極大的提高訪問效率
    MyISAM的Count只有在全表掃描的時候特別高效,帶有其他條件的count都需要進行實際的數據訪問

  II、   InnoDB

  • 特性
    具有較好的事務支持:支持4個事務隔離級別,支持多版本讀
    行級鎖定:通過索引實現,全表掃描仍然會是表鎖,注意間隙鎖的影響
    讀寫阻塞與事務隔離級別相關
    具有非常高效的緩存特性:能緩存索引,也能緩存數據
    整個表和主鍵以Cluster方式存儲,組成一顆平衡樹
    所有Secondary Index都會保存主鍵信息

  • 適用場景
    需要事務支持(具有較好的事務特性)
    行級鎖定對高併發有很好的適應能力,但需要確保查詢是通過索引完成
    數據更新較爲頻繁的場景
    數據一致性要求較高
    硬件設備內存較大,可以利用InnoDB較好的緩存能力來提高內存利用率,儘可能減少磁盤 IO

  • 最佳實踐
    主鍵儘可能小,避免給Secondary index帶來過大的空間負擔
    避免全表掃描,因爲會使用表鎖
    儘可能緩存所有的索引和數據,提高響應速度
    在大批量小插入的時候,儘量自己控制事務而不要使用autocommit自動提交
    合理設置innodb_flush_log_at_trx_commit參數值,不要過度追求安全性
    避免主鍵更新,因爲這會帶來大量的數據移動

   III、    NDBCluster

  • 特性
    分佈式:分佈式存儲引擎,可以由多個NDBCluster存儲引擎組成集羣分別存放整體數據的一部分
    支持事務:和Innodb一樣,支持事務

    可與mysqld不在一臺主機:可以和mysqld分開存在於獨立的主機上,然後通過網絡和mysqld通信交互
    內存需求量巨大:新版本索引以及被索引的數據必須存放在內存中,老版本所有數據和索引必須存在與內存中

  • 適用場景
    具有非常高的併發需求
    對單個請求的響應並不是非常的critical
    查詢簡單,過濾條件較爲固定,每次請求數據量較少,又不希望自己進行水平Sharding

  • 最佳實踐
    儘可能讓查詢簡單,避免數據的跨節點傳輸
    儘可能滿足SQL節點的計算性能,大一點的集羣SQL節點會明顯多餘Data節點
    在各節點之間儘可能使用萬兆網絡環境互聯,以減少數據在網絡層傳輸過程中的延時

    注:以上三個存儲引擎是目前相對主流的存儲引擎,還有其他類似如:Memory,Merge,CSV,Archive等存儲引擎的使用場景都相對較少。


    查看當前數據庫中各表的引擎

SHOW TABLE STATUS FROMDBname

    創建一個新表時,可以通過在CREATE語句中ENGINE或TYPE選項來告訴MySQL要創建什麼類型的表:

CREATE TABLE t (i INT) ENGINE = INNODB;
CREATE TABLE t (i INT) TYPE = MEMORY;

如果省略掉ENGINE或TYPE選項,默認的存儲引擎被使用。當MySQL被用MySQL配置嚮導安裝在Windows平臺上,InnoDB存儲引擎替代MyISAM存儲引擎作爲默認。當不可用的類型被指定時,自動用InnoDB表來替代。

使用ALTERTABLE語句,把表從一個類型轉到另一個類型

ALTER TABLE t ENGINE = MYISAM;
ALTER TABLE t TYPE = BDB;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章