本文目錄一覽:
數據庫(mysql)關鍵知識
Mysql是目前互聯網使用最廣的關係數據庫,關係數據庫的本質是將問題分解為多個分類然後通過關係來查詢。 一個經典的問題是用戶借書,三張表,一個用戶,一個書,一個借書的關係表。當需要查詢某個用戶借書情況或者是書被那些人借了,就用關係查詢來實現。
關係數據庫範式
來自英文Normal form,簡稱NF。要想設計—個好的關係,必須使關係滿足一定的約束條件,滿足這些規範的數據庫是簡潔的、結構明晰的,同時,不會發生插入(insert)、刪除(delete)和更新(update)操作異常。總共有六種範式:第一範式(1NF)、第二範式(2NF)、 第三範式 (3NF)、巴斯-科德範式(BCNF)、 第四範式 (4NF)和 第五範式 (5NF,又稱完美範式)。
1NF是指數據庫表的每一列都是不可分割的原子數據項。2NF必須滿足1NF,要求數據庫表中的每行記錄必須可以被唯一地區分。3NF在2NF基礎上,任何非主 屬性 不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)。BCNF是在3NF基礎上,任何非主屬性不能對主鍵子集依賴(在3NF基礎上消除對主碼子集的依賴), 滿足BCNF不再會有任何由於函數依賴導致的異常,但是我們還可能會遇到由於多值依賴導致的異常。4NF的定義很簡單:已經是BC範式,並且不包含多值依賴關係。5NF處理的是無損連接問題,這個範式基本沒有實際意義,因為無損連接很少出現,而且難以察覺。而域鍵範式試圖定義一個終極範式,該範式考慮所有的依賴和約束類型,但是實用價值也是最小的,只存在理論研究中。
Catalog和Schema
是數據庫對象命名空間中的層次,主要用來解決命名衝突的問題。從概念上說,一個數據庫系統包含多個Catalog,每個Catalog又包含多個Schema,而每個Schema又包含多個數據庫對象(表、視圖、字段等)。但是Mysql的數據庫名就是Schema,不支持Catalog。
Mysql的數據庫引擎主要有兩種MyISAM和InnoDB,MyISAM支持全文檢索,InnoDB支持事務。
SQL中的通配符‘%’代表任意字符出現任意次數。‘_’代表任意字符出現一次。SQL與正則表達式結合查詢一般用在WHERE table_name REGEXP ‘^12.34’。子查詢是從裡到外執行。
數據庫聯結(join)涉及到外鍵,外鍵是指一個表的列是另一個表的主鍵,那麼它就是外鍵。笛卡爾積聯結(不指定聯結條件時)生成的記錄條目是單純的第一個表的行乘以第二個表的列數。用得最多的是等值聯結也叫內部聯結。
高級聯結還有自連接,是指查詢中的兩張表是同一張表,它通常作為外部語句用來代替從相同表中檢索數據時使用的子查詢。自然聯結使每個列只返回一次。外部聯結是指聯結包含了那些在相關表中沒有關聯行的行。例如列出所有產品及其訂購數量,包括沒有人訂購的產品。LEFT OUTER JOIN指選擇左邊表的所有行。
組合查詢是指採用UNION等將兩個查詢結果取並集。
視圖是查看存儲在別處的數據的一種工具,它本身並不包含數據,因此表的數據修改了,視圖返回的數據也將隨之修改,因此如果使用了複雜或嵌套視圖會對性能有較大的影響。視圖的作用之一是隱藏複雜的SQL通常會涉及到聯結查詢。
存儲過程類似於批處理,包含了一條或多條SQL語句。語法:
CREATE PROCEDURE name()
BEGIN
SQL
END
————————-
CALL name()//來調用存儲過程
游標有DECLARE定義,游標與存儲過程是綁定的,存儲過程處理完成,游標就會消失。游標被打開後可以使用FETCH語句訪問每一行。
觸發器是在某個時間發生時自動執行某條SQL語句。語法:
CREATE TRIGGER name AFTER INSERT ON talbe_name FOR EACH ROW
事務處理可以維護數據庫的完整性,保證批量的操作要麼完全執行,要麼完全不執行。包括事務、回退、提交、保留點幾個關鍵術語。ROLLBACK只能在一個事務處理內使用。他不能回退CREATE和DROP操作。使用COMMIT保證事務提交。複雜的事務處理需要部分提交或回退,因此我們需要使用保留點SAVEPOINT。可以使用ROLLBACK TO savepoint_name。保留點越多越好。保留點在事務執行完成後自動釋放。
如何查看mysql數據庫的引擎
一般情況下,mysql會默認提供多種存儲引擎,你可以通過下面的查看:
看你的mysql現在已提供什麼存儲引擎:
mysql show engines;
看你的mysql當前默認的存儲引擎:
mysql show variables like ‘%storage_engine%’;
你要看某個表用了什麼引擎(在顯示結果里參數engine後面的就表示該表當前用的存儲引擎):
mysql show create table 表名;
MySQL數據庫引擎詳解
作為Java程序員,MySQL數據庫大家平時應該都沒少使用吧,對MySQL數據庫的引擎應該也有所了解,這篇文章就讓我詳細的說說MySQL數據庫的Innodb和MyIASM兩種引擎以及其索引結構。也來鞏固一下自己對這塊知識的掌握。
Innodb引擎
Innodb引擎提供了對數據庫ACID事務的支持,並且實現了SQL標準的四種隔離級別,關於數據庫事務與其隔離級別的內容請見數據庫事務與其隔
離級別這篇文章。該引擎還提供了行級鎖和外鍵約束,它的設計目標是處理大容量數據庫系統,它本身其實就是基於MySQL後台的完整數據庫系統,MySQL
運行時Innodb會在內存中建立緩衝池,用於緩衝數據和索引。但是該引擎不支持FULLTEXT類型的索引,而且它沒有保存表的行數,當SELECT
COUNT(*) FROM
TABLE時需要掃描全表。當需要使用數據庫事務時,該引擎當然是首選。由於鎖的粒度更小,寫操作不會鎖定全表,所以在並發較高時,使用Innodb引擎
會提升效率。但是使用行級鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表同樣會鎖全表。
MyIASM引擎
MyIASM是MySQL默認的引擎,但是它沒有提供對數據庫事務的支持,也不支持行級鎖和外鍵,因此當INSERT(插入)或UPDATE(更
新)數據時即寫操作需要鎖定整個表,效率便會低一些。不過和Innodb不同,MyIASM中存儲了表的行數,於是SELECT COUNT(*)
FROM
TABLE時只需要直接讀取已經保存好的值而不需要進行全表掃描。如果表的讀操作遠遠多於寫操作且不需要數據庫事務的支持,那麼MyIASM也是很好的選
擇。
兩種引擎的選擇
大尺寸的數據集趨向於選擇InnoDB引擎,因為它支持事務處理和故障恢復。數據庫的大小決定了故障恢復的時間長短,InnoDB可以利用事務日誌
進行數據恢復,這會比較快。主鍵查詢在InnoDB引擎下也會相當快,不過需要注意的是如果主鍵太長也會導致性能問題,關於這個問題我會在下文中講到。大
批的INSERT語句(在每個INSERT語句中寫入多行,批量插入)在MyISAM下會快一些,但是UPDATE語句在InnoDB下則會更快一些,尤
其是在並發量大的時候。
Index——索引
索引(Index)是幫助MySQL高效獲取數據的數據結構。MyIASM和Innodb都使用了樹這種數據結構做為索引,關於樹我也曾經寫過一篇文章樹是一種偉大的數據結構,只是自己的理解,有興趣的朋友可以去閱讀。下面我接着講這兩種引擎使用的索引結構,講到這裡,首先應該談一下B-Tree和B+Tree。
B-Tree和B+Tree
B+Tree是B-Tree的變種,那麼我就先講B-Tree吧,相信大家都知道紅黑樹,這是我前段時間學《算法》一書時,實現的一顆紅黑樹,大家
可以參考。其實紅黑樹類似2,3-查找樹,這種樹既有2叉結點又有3叉結點。B-Tree也與之類似,它的每個結點做多可以有d個分支(叉),d稱為B-
Tree的度,如下圖所示,它的每個結點可以有4個元素,5個分支,於是它的度為5。B-Tree中的元素是有序的,比如圖中元素7左邊的指針指向的結點
中的元素都小於7,而元素7和16之間的指針指向的結點中的元素都處於7和16之間,正是滿足這樣的關係,才能高效的查找:首先從根節點進行二分查找,找
到就返回對應的值,否則就進入相應的區間結點遞歸的查找,直到找到對應的元素或找到null指針,找到null指針則表示查找失敗。這個查找是十分高效
的,其時間複雜度為O(logN)(以d為底,當d很大時,樹的高度就很低),因為每次檢索最多只需要檢索樹高h個結點。
接下來就該講B+Tree了,它是B-Tree的變種,如下面兩張圖所示:
vcHLx/i85LLp0a/Qp8LKoaM8L3A+DQo8aDMgaWQ9″myisam引擎的索引結構”MyISAM引擎的索引結構
MyISAM引擎的索引結構為B+Tree,其中B+Tree的數據域存儲的內容為實際數據的地址,也就是說它的索引和實際的數據是分開的,只不過是用索引指向了實際的數據,這種索引就是所謂的非聚集索引。
Innodb引擎的索引結構
MyISAM引擎的索引結構同樣也是B+Tree,但是Innodb的索引文件本身就是數據文件,即B+Tree的數據域存儲的就是實際的數據,這種索引就是聚集索引。這個索引的key就是數據表的主鍵,因此InnoDB表數據文件本身就是主索引。
因為InnoDB的數據文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識數據記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含字段作為主鍵,這個字段長度為6個字節,類型為長整形。
並且和MyISAM不同,InnoDB的輔助索引數據域存儲的也是相應記錄主鍵的值而不是地址,所以當以輔助索引查找時,會先根據輔助索引找到主
鍵,再根據主鍵索引找到實際的數據。所以Innodb不建議使用過長的主鍵,否則會使輔助索引變得過大。建議使用自增的字段作為主鍵,這樣B+Tree的
每一個結點都會被順序的填滿,而不會頻繁的分裂調整,會有效的提升插入數據的效率。
如何查看MySQL的當前存儲引擎
查看MySQL當前存儲引擎的方法步驟:
查看當前表的默認存儲引擎,可以使用如下圖所示的命令。查詢之後,我們可以查看筆者這裡這個表默認的存儲引擎是:InnoDB.
如果我們想知道當前MySQL提供什麼存儲引擎,可以使用如下圖所示的命令。通過查詢我們知道,筆者所安裝的MySQL提供了9種不同的存儲引擎。
如果我們想要知道當前數據庫默認的是什麼存儲引擎,可以使用如下圖所示的命令。通過查詢我們知道,筆者所安裝的MySQL默認的存儲引擎是InnoDB。
給一個新建的表指定特定的存儲引擎。
修改一個已經存在表的存儲引擎,假設這裡我們想要修改“t1”表的存儲引擎。我們就可以按命令來操作。執行之後,我們的t1表的存儲引擎,就從默認的InnoDB變為了CSV.
什麼是MySQL存儲引擎?
MySQL 可能是最著名的 關係數據庫管理系統 (RDBMS),作為一款免費開源軟件開發,最初由 MYSQL AB 公司提供支持,但現在歸 Oracle 所有。
在 MySQL 中,用於表的“存儲引擎”決定了數據的處理方式。有幾種可用的存儲引擎,但最常用的是 InnoDB 和 MyISAM 。
在本文中,我們將了解它們的顯着特徵以及它們之間的主要區別。
在本教程中,您將學習:
在我們討論兩個主要 MySQL 存儲引擎之間的特性和區別之前,先來了解一下什麼是存儲引擎?
存儲引擎,也稱為“ 表處理程序 ”,基本上是解釋和管理與數據庫表的 SQL 查詢相關的操作的數據庫部分。
在最新版本的 MySQL 中,可以使用“ 可插拔 ”架構來組織和管理存儲引擎,存在多種存儲引擎,但最常用的兩個是 InnoDB 和 MyISAM 。
要獲得我們正在使用的數據庫中可用存儲引擎的列表,我們所要做的就是發出一個簡單的 SQL 查詢,因此我們需要做的第一件事就是打開一個 MySQL 交互式提示並使用數據庫用戶登錄及其密碼:
如果登錄成功,提示將變為mysql,在這裡,我們可以運行我們的 SQL 查詢來可視化可用的存儲引擎:
執行查詢後,我們應該獲得類似於以下內容的結果:
在上表中,作為查詢結果生成,我們可以通過查看Support每行列中的值輕鬆了解支持哪些存儲引擎,“YES”值表示存儲引擎可用,否則“NO”。相反,同一列中的“DEFAULT”值表示相應的引擎(在本例中為 InnoDB)是服務器使用的默認引擎。
“ Transactions ”和“ Savepoints ”列中存在的值分別表示存儲引擎是否支持事務和回滾。正如我們通過查看錶可以看到的,只有 InnoDB 引擎可以。
關於存儲引擎的信息存在於“ INFORMATION_SCHEMA ”數據庫的“ ENGINES ”表中,因此我們也可以發出標準的“SELECT”查詢來獲取我們需要的數據:
我們將獲得與上面看到的相同的結果。
讓我們看看兩個最常用的存儲引擎 InnoDB 和 MyISAM 之間的主要特性和區別是什麼。
正如我們已經說過的, InnoDB 是自 MySQL 以來的默認存儲引擎5.5。
此存儲引擎的一些主要功能如下:
對事務的支持提供了一種安全的方式來執行多個查詢以保持數據一致。
當多個修改數據的操作被執行並且我們想要確保它們只有在所有操作都成功並且沒有錯誤發生時才有效時,我們想要使用事務。
典型的處理方式是啟動事務並執行查詢:如果出現錯誤,則執行回滾,否則提交更改。
當使用 InnoDB 數據鎖定發生在行級別時,因此在事務期間鎖定的數據量是有限的。
InnoDB 有兩種類型的鎖:
一個共享鎖允許誰擁有它讀取該行的交易,而一個排它鎖允許交易執行其修改行的操作,所以要更新或刪除數據。
當一個事務在某行上獲得共享鎖,而另一個事務需要相同的鎖類型時,立即授予;但是,如果第二個事務在同一行上請求排他鎖,它將不得不等待。
如果第一個事務持有該行的排他鎖,則第二個事務將不得不等待該鎖被釋放以獲得共享鎖或排他鎖。
外鍵是一個非常重要的特性,因為它們可用於基於表之間的邏輯關係來強制執行數據完整性。想象一下,我們的數據庫中有三個表(假設它被稱為“testdb”):一個user包含現有用戶的job表,一個註冊所有可用作業的user_job表,以及一個用於表示用戶和用戶之間存在的多對多關係的表。作業(一個用戶可以有多個作業,多個作業可以與同一個用戶關聯)。
該user_job表就是所謂的連接表或關聯表,因為它的唯一目的是表示用戶-工作關聯。該表有兩列,一個叫user_id和其他job id。表中會存在兩個外鍵約束,強制執行以下規則:user_id列中的值只能引用表id列中的值,列中的user值job_id必須引用表id列中的現有值job.
這將強制執行完整性,因為僅允許現有用戶和作業的 ID 存在於關聯表中。刪除涉及表中一個或多個關聯的用戶或作業user_job也是不允許的,除非為相應的外鍵設置了CASCADE DELETE規則。在這種情況下,當刪除用戶或作業時,它們所涉及的關係也將被刪除。
MyISAM 曾經是默認的 MySQL 存儲引擎,但已被 InnoDB 取代。使用此引擎時,數據鎖定發生在表級別,因此執行操作時鎖定的數據更多。
與 InnoDB 不同,MyISAM 不支持事務回滾和提交,因此必須手動執行回滾。MyISAM 和 InnoDB 之間的另一個很大區別是前者不支持外鍵。MyISAM 更簡單,並且在對有限數據集進行讀取密集型操作時可能具有優勢(有爭議)。
在表上使用 MyISAM 時,會設置一個標誌,指示該表是否需要修復,例如在突然關閉之後。稍後可以使用適當的工具執行表修復。
如何知道特定表使用了什麼存儲引擎?我們所要做的就是發出一個簡單的查詢。
例如,要知道user我們在前面的例子中提到的表使用了什麼存儲引擎,我們將運行:
注意上面的查詢我們使用了G,為了讓查詢結果垂直顯示,優化空間。執行查詢後,我們將獲得以下結果:
在這種情況下,通過查看“Engine”列中存儲的值,我們可以清楚地看到該表使用的是“InnoDB”引擎。獲取相同信息的另一種方法是INFORMATION_SCHEMA.TABLES直接查詢表:
上面的查詢將只返回表使用的引擎:
如果我們稍微更改查詢,我們可以獲得數據庫中所有表名的列表以及它們使用的引擎:
如果我們要為一個表設置一個特定的存儲引擎,我們可以在創建時指定它。例如,假設我們正在創建job表,並且出於某種原因我們想要使用 MyISAM 存儲引擎。我們將發出以下 SQL 查詢:
相反,如果我們想要更改用於已存在表的存儲引擎,我們只需要使用ALTERSQL 語句。假設我們要將上一個示例中創建的“job”表所使用的存儲引擎更改為 InnoDB;我們會運行:
在本教程中,我們學習了什麼是數據庫存儲引擎,並且我們看到了兩個最常用的 MySQL 引擎的主要特性: InnoDB 和 MyISAM 。
我們看到了如何檢查哪些引擎可用、哪些引擎用於表以及如何使用 SQL 查詢設置和修改表引擎。
怎麼查看mysql數據庫的引擎
show engines; 查看所有引擎,包含默認的引擎 show variables like ‘%storage_engine%’; 查看當前引擎
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/236228.html