mysql设置表名字为占位符_这可能是把MySQL存储引擎讲解的最清楚的一篇文章了
存儲引擎是MySQL的組件,用于處理不同表類型的SQL操作。不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎,還可以獲得特定的功能。
使用哪一種引擎可以靈活選擇,一個數據庫中多個表可以使用不同引擎以滿足各種性能和實際需求,使用合適的存儲引擎,將會提高整個數據庫的性能 。
MySQL服務器使用可插拔的存儲引擎體系結構,可以從運行中的MySQL服務器加載或卸載存儲引擎。
一、查看存儲引擎
-- 查看支持的存儲引擎SHOW ENGINES-- 查看默認存儲引擎SHOW VARIABLES LIKE 'storage_engine--查看具體某一個表所使用的存儲引擎,這個默認存儲引擎被修改了!show create table tablename--準確查看某個數據庫中的某一表所使用的存儲引擎show table status like 'tablename'show table status from database where name="tablename"二、設置存儲引擎
-- 建表時指定存儲引擎。默認的就是INNODB,不需要設置CREATE TABLE t1 (i INT) ENGINE = INNODB;CREATE TABLE t2 (i INT) ENGINE = CSV;CREATE TABLE t3 (i INT) ENGINE = MEMORY;-- 修改存儲引擎ALTER TABLE t ENGINE = InnoDB;-- 修改默認存儲引擎,也可以在配置文件my.cnf中修改默認引擎SET default_storage_engine=NDBCLUSTER;默認情況下,每當CREATE TABLE或ALTER TABLE不能使用默認存儲引擎時,都會生成一個警告。為了防止在所需的引擎不可用時出現令人困惑的意外行為,可以啟用NO_ENGINE_SUBSTITUTION SQL模式。如果所需的引擎不可用,則此設置將產生錯誤而不是警告,并且不會創建或更改表
三、常用存儲引擎
1. InnoDB
InnoDB是MySQL5.7 默認的存儲引擎,主要特性有
- InnoDB存儲引擎維護自己的緩沖池,在訪問數據時將表和索引數據緩存在主內存中
- 支持事務
- 支持外鍵
- B-Tree索引
- 不支持集群
- 聚簇索引
- 行鎖
- 支持地理位置的數據類型和索引
2. MyISAM
每個MyISAM表存儲在磁盤上的三個文件中 。這些文件的名稱以表名開頭,并有一個擴展名來指示文件類型 。
.frm文件存儲表的格式。 .MYD (MYData) 文件存儲表的數據。 .MYI (MYIndex) 文件存儲索引。
MyISAM表具有以下特征
- 每個MyISAM表最大索引數是64,這可以通過重新編譯來改變。每個索引最大的列數是16
- 每個MyISAM表都支持一個AUTO_INCREMENT的內部列。當執行INSERT或者UPDATE操作的時候,MyISAM自動更新這個列,這使得AUTO_INCREMENT列更快。
- 當把刪除和更新及插入操作混合使用的時候,動態尺寸的行產生更少碎片。這要通過合并相鄰被刪除的塊,若下一個塊被刪除,就擴展到下一塊自動完成
- MyISAM支持并發插入
- 可以將數據文件和索引文件放在不同物理設備上的不同目錄中,以更快地使用數據目錄和索引目錄表選項來創建表
- BLOB和TEXT列可以被索引
- NULL被允許在索引的列中,這個值占每個鍵的0~1個字節
- 每個字符列可以有不同的字符集
- MyISAM 表使用 B-tree 索引
- MyISAM表的行最大限制為 (232)2 (1.844E+19)
- 大文件(達到63位文件長度)在支持大文件的文件系統和操作系統上被支持
- 鍵的最大長度為1000字節,這也可以通過重新編譯來改變,對于鍵長度超過250字節的情況,一個超過1024字節的鍵將被用上
- VARCHAR支持固定或動態記錄長度
- 表中VARCHAR和CHAR列的長度總和有可能達到64KB
- 任意長度的唯一約束
- All data values are stored with the low byte first. This makes the data machine and operating system independent.
- All numeric key values are stored with the high byte first to permit better index compression
todo:最后兩條沒搞懂啥意思
四、存儲引擎對比
五、數據的存儲
在整個數據庫體系結構中,我們可以使用不同的存儲引擎來存儲數據,而絕大多數存儲引擎都以二進制的形式存儲數據;這一節會介紹 InnoDB 中對數據是如何存儲的。
在 InnoDB 存儲引擎中,所有的數據都被邏輯地存放在表空間中,表空間(tablespace)是存儲引擎中最高的存儲邏輯單位,在表空間的下面又包括段(segment)、區(extent)、頁(page)
同一個數據庫實例的所有表空間都有相同的頁大小;默認情況下,表空間中的頁大小都為 16KB,當然也可以通過改變 innodb_page_size 選項對默認大小進行修改,需要注意的是不同的頁大小最終也會導致區大小的不同
1. 如何存儲表
MySQL 使用 InnoDB 存儲表時,會將表的定義和數據索引等信息分開存儲,其中前者存儲在 .frm 文件中,后者存儲在 .ibd 文件中,這一節就會對這兩種不同的文件分別進行介紹。
①. .frm 文件
無論在 MySQL 中選擇了哪個存儲引擎,所有的 MySQL 表都會在硬盤上創建一個 .frm 文件用來描述表的格式或者說定義;.frm 文件的格式在不同的平臺上都是相同的。
`CREATE TABLE test_frm(`` ``column1 CHAR(5),`` ``column2 INTEGER``);`當我們使用上面的代碼創建表時,會在磁盤上的 datadir 文件夾中生成一個 test_frm.frm 的文件,這個文件中就包含了表結構相關的信息:
②. .ibd 文件
InnoDB 中用于存儲數據的文件總共有兩個部分,一是系統表空間文件,包括 ibdata1、ibdata2 等文件,其中存儲了 InnoDB 系統信息和用戶數據庫表數據和索引,是所有表公用的。
當打開 innodb_file_per_table 選項時,.ibd 文件就是每一個表獨有的表空間,文件存儲了當前表的數據和相關的索引數據。
2. 如何存儲記錄
與現有的大多數存儲引擎一樣,InnoDB 使用頁作為磁盤管理的最小單位;數據在 InnoDB 存儲引擎中都是按行存儲的,每個 16KB 大小的頁中可以存放 2-7992 行的記錄。(至少是2條記錄,最多是7992條記錄)
當 InnoDB 存儲數據時,它可以使用不同的行格式進行存儲;MySQL 5.7 版本支持以下格式的行存儲方式:
Antelope 是 InnoDB 最開始支持的文件格式,它包含兩種行格式 Compact 和 Redundant,它最開始并沒有名字;Antelope 的名字是在新的文件格式 Barracuda 出現后才起的,Barracuda 的出現引入了兩種新的行格式 Compressed 和 Dynamic;InnoDB 對于文件格式都會向前兼容,而官方文檔中也對之后會出現的新文件格式預先定義好了名字:Cheetah、Dragon、Elk 等等。
兩種行記錄格式 Compact 和 Redundant 在磁盤上按照以下方式存儲:
Compact 和 Redundant 格式最大的不同就是記錄格式的第一個部分;在 Compact 中,行記錄的第一部分倒序存放了一行數據中列的長度(Length),而 Redundant 中存的是每一列的偏移量(Offset),從總體上上看,Compact 行記錄格式相比 Redundant 格式能夠減少 20% 的存儲空間。
3. 行溢出數據
當 InnoDB 使用 Compact 或者 Redundant 格式存儲極長的 VARCHAR 或者 BLOB 這類大對象時,我們并不會直接將所有的內容都存放在數據頁節點中,而是將行數據中的前 768 個字節存儲在數據頁中,后面會通過偏移量指向溢出頁。
但是當我們使用新的行記錄格式 Compressed 或者 Dynamic 時都只會在行記錄中保存 20 個字節的指針,實際的數據都會存放在溢出頁面中。
當然在實際存儲中,可能會對不同長度的 TEXT 和 BLOB 列進行優化,不過這就不是本文關注的重點了。
4. 數據頁結構
頁是 InnoDB 存儲引擎管理數據的最小磁盤單位,而 B-Tree 節點就是實際存放表中數據的頁面,我們在這里將要介紹頁是如何組織和存儲記錄的;首先,一個 InnoDB 頁有以下七個部分:
每一個頁中包含了兩對 header/trailer:內部的 Page Header/Page Directory 關心的是頁的狀態信息,而 Fil Header/Fil Trailer 關心的是記錄頁的頭信息。
在頁的頭部和尾部之間就是用戶記錄和空閑空間了,每一個數據頁中都包含 Infimum 和 Supremum 這兩個虛擬的記錄(可以理解為占位符),Infimum 記錄是比該頁中任何主鍵值都要小的值,Supremum 是該頁中的最大值:
User Records 就是整個頁面中真正用于存放行記錄的部分,而 Free Space 就是空余空間了,它是一個鏈表的數據結構,為了保證插入和刪除的效率,整個頁面并不會按照主鍵順序對所有記錄進行排序,它會自動從左側向右尋找空白節點進行插入,行記錄在物理存儲上并不是按照順序的,它們之間的順序是由 next_record 這一指針控制的。
B+ 樹在查找對應的記錄時,并不會直接從樹中找出對應的行記錄,它只能獲取記錄所在的頁,將整個頁加載到內存中,再通過 Page Directory 中存儲的稀疏索引和 n_owned、next_record 屬性取出對應的記錄,不過因為這一操作是在內存中進行的,所以通常會忽略這部分查找的耗時。
InnoDB 存儲引擎中對數據的存儲是一個非常復雜的話題,這一節中也只是對表、行記錄以及頁面的存儲進行一定的分析和介紹,雖然作者相信這部分知識對于大部分開發者已經足夠了,但是想要真正消化這部分內容還需要很多的努力和實踐。
Java程序員福利:我把2019近一年經歷過的Java崗位面試,和一些刷過的面試題都做成了PDF,PDF都是可以免費分享給大家的,關注私信我:【101】,免費領取!
總結
以上是生活随笔為你收集整理的mysql设置表名字为占位符_这可能是把MySQL存储引擎讲解的最清楚的一篇文章了的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: python单击url下载网页文件_使用
- 下一篇: 如何击败奥杜尔尤格萨隆0灯模式?
