20200325 資料庫 關於mysql的引擎

2021-10-04 10:09:10 字數 4011 閱讀 1750

innodb

mylsam

innodb與mylsam引擎原理

mysql中的資料用各種不同的技術儲存在檔案(或者記憶體)中。這些技術中的每一種技術都使用不同的儲存機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能

這些不同的技術以及配套的相關功能在mysql中被稱作儲存引擎(也稱作表型別)。mysql預設配置了許多不同的儲存引擎,可以預先設定或者在mysql伺服器中啟用。你可以選擇適用於伺服器、資料庫和**的儲存引擎,以便在選擇如何儲存你的資訊、如何檢索這些資訊以及你需要你的資料結合什麼效能和功能的時候為你提供最大的靈活性。

資料庫引擎是用於儲存、處理和保護資料的核心服務。利用資料庫引擎可控制訪問許可權並快速處理事務,從而滿足企業內大多數需要處理大量資料的應用程式的要求。 使用資料庫引擎建立用於聯機事務處理或聯機分析處理資料的關聯式資料庫。這包括建立用於儲存資料的表用於檢視、管理和保護資料安全的資料庫物件(如索引、檢視和儲存過程)。

修改配置檔案my.ini

在[mysqld]後面新增default-storage-engine=innodb,重啟服務,資料庫預設的引擎修改為innodb
在建立表的時候就可以指定

create table mytbl(   

id int primary key,

name varchar(50)

)type=myisam;

建表後更改

儲存引擎主要有: 1. myisam , 2. innodb, 3. memory, 4. blackhole, 5. csv, 6. performance_schema, 7. archive, 8. federated , 9 mrg_myisam但是我們主要分析常用的mylsam和innodb。

innodb是乙個事務型的儲存引擎,有行級鎖定和外來鍵約束

innodb引擎提供了對資料庫acid事務的支援,並且實現了sql標準的四種隔離級別,關於資料庫事務與其隔離級別的內容請見資料庫事務與其隔離級別這型別的文章。該引擎還提供了行級鎖和外來鍵約束,它的設計目標是處理大容量資料庫系統,它本身其實就是基於mysql後台的完整資料庫系統,mysql執行時innodb會在記憶體中建立緩衝池用於緩衝資料和索引。但是該引擎不支援fulltext型別的索引,而且它沒有儲存表的行數,當select count(*) from table時需要掃瞄全表。當需要使用資料庫事務時,該引擎當然是首選。由於鎖的粒度更小,寫操作不會鎖定全表,所以在併發較高時,使用innodb引擎會提公升效率。但是使用行級鎖也不是絕對的,如果在執行乙個sql語句時mysql不能確定要掃瞄的範圍,innodb表同樣會鎖全表。

適用場景

經常更新的表,適合處理多重併發的更新請求。

支援事務。

可以從災難中恢復(通過bin-log日誌等)

外來鍵約束。只有他支援外來鍵。

支援自動增加列屬性auto_increment

mysql官方對innodb的講解

1)innodb給mysql提供了具有提交、回滾和崩潰恢復能力的事務安全(acid相容)儲存引擎。

2)innodb鎖定在行級並且也在select語句提供乙個oracle風格一致的非鎖定讀,這些特色增加了多使用者部署和效能。沒有在innodb中擴大鎖定的需要,因為在innodb中行級鎖定適合非常小的空間。

3)innodb也支援foreign key強制。在sql查詢中,你可以自由地將innodb型別的表與其它mysql的表的型別混合起來,甚至在同乙個查詢中也可以混合。

4)innodb是為處理巨大資料量時的最大效能設計,它的cpu效率可能是任何其它基於磁碟的關聯式資料庫引擎所不能匹敵的。

5) innodb被用來在眾多需要高效能的大型資料庫站點上產生。

myiasm是mysql預設的引擎,但是它沒有提供對資料庫事務的支援,也不支援行級鎖和外來鍵,因此當insert(插入)或update(更新)資料時即寫操作需要鎖定整個表,效率便會低一些。

1)不支援事務的設計,但是並不代表著有事務操作的專案不能用myisam儲存引擎,可以在service層進行根據自己的業務需求進行相應的控制。

2)不支援外來鍵的表設計。

3)查詢速度很快,如果資料庫insert和update的操作比較多的話比較適用。

4)整天 對錶進行加鎖的場景。

5)myisam極度強調快速讀取操作。

6)myiasm中儲存了表的行數,於是select count(*) from table時只需要直接讀取已經儲存好的值而不需要進行全表掃瞄。如果表的讀操作遠遠多於寫操作且不需要資料庫事務的支援,那麼myiasm也是很好的選擇。

還有乙個缺點是

就是不能在表損壞後恢復資料。(是不能主動恢復

myiasm引擎的索引結構

myisam索引結構: myisam索引用的b+ tree來儲存資料,myisam索引的指標指向的是鍵值的位址,位址儲存的是資料

b+tree的資料域儲存的內容為實際資料的位址,也就是說它的索引和實際的資料是分開的,只不過是用索引指向了實際的資料,這種索引就是所謂的非聚集索引。

innodb引擎的索引結構

也是b+tree索引結構。innodb的索引檔案本身就是資料檔案,即b+tree的資料域儲存的就是實際的資料,這種索引就是聚集索引。這個索引的key就是資料表的主鍵,因此innodb表資料檔案本身就是主索引。

innodb的輔助索引資料域存儲的也是相應記錄主鍵的值而不是位址,所以當以輔助索引查詢時,會先根據輔助索引找到主鍵,再根據主鍵索引找到實際的資料。所以innodb不建議使用過長的主鍵,否則會使輔助索引變得過大。

建議使用自增的字段作為主鍵,這樣b+tree的每乙個結點都會被順序的填滿,而不會頻繁的**調整,會有效的提公升插入資料的效率。

上圖,可以看到葉節點包含了完整的資料記錄。這種索引叫做聚集索引。因為innodb的資料檔案本身要按主鍵聚集,所以innodb要求表必須有主鍵(myisam可以沒有),如果沒有顯式指定,則mysql系統會自動選擇乙個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則mysql自動為innodb表生成乙個隱含字段作為主鍵,這個字段長度為6個位元組,型別為長整形。

而且,與myisam索引的不同是innodb的輔助索引data域儲存相應記錄主鍵的值而不是位址。換句話說,innodb的所有輔助索引都引用主鍵作為data域。

為什麼說POSTGRESQL資料庫比MySQL強?

postgresql在很多方面都比mysql強,如複雜sql的執行 儲存過程 觸發器 索引。同時postgresql是多程序的,而mysql是執行緒的,雖然併發不高時,mysql處理速度快,但當併發高的時候,對於現在多核的單台機器上,mysql的總體處理效能不如postgresql,原因是mysql...

關於資料庫

在dao檔案下 第一步 public static void main string args 定義四個私有的全域性靜態變數 第二步 1.以增加一條新聞為例 增加一條新聞 param news return public boolean insertnews news news ps.close c...

關於資料庫

一 資料庫的基本操作 建立 creat database 資料庫名 避免重複資料庫 if not exists 資料庫名 檢視建庫語句 show creat database 資料庫名 查詢所有資料庫 show databases 使用 use 資料庫名 刪除資料庫 drop database 資料...