学习一门数据库系统首先得了解它的架构,明白它的架构原理对于后期的分析问题和性能调优都有很大的帮助,接下来就通过分析架构图来认识它。
目录
概述
架构图
总结
架构图
1.连接管理与安全验证
每个客户端都会建立一个与服务器连接的线程,服务器会有一个线程池来管理这些连接;如果客户端需要连接到MYSQL数据库还需要进行验证,包括用户名、密码、主机信息等。
2.解析器
解析器的作用主要是分析查询语句,最终生成解析树;首先解析器会对查询语句的语法进行分析,分析语法是否有问题。还有解析器会查询缓存,如果在缓存中有对应的语句,就返回查询结果不进行接下来的优化执行操作。前提是缓存中的数据没有被修改,当然如果被修改了也会被清出缓存。
在有的书籍中会把查询缓存放在解析之前,难道不需要判断语法是否有错误吗?如果有知道的麻烦帮忙解惑。
3.优化器
优化器的作用主要是对查询语句进行优化操作,包括选择合适的索引,数据的读取方式,包括获取查询的开销信息,统计信息等,这也是为什么图中会有优化器指向存储引擎的箭头。之前在别的文章没有看到优化器跟存储引擎之间的关系,在这里我个人的理解是因为优化器需要通过存储引擎获取查询的大致数据和统计信息。
4.执行器
执行器包括执行查询语句,返回查询结果,生成执行计划包括与存储引擎的一些处理操作。
存储引擎
1.锁的种类
锁的由来是为了解决并发控制,对于一个查询语句为了不让查询的数据被其它语句所更改就需要将数据附加锁,我们比较熟悉的锁有共享锁和排他锁。
2.锁的粒度
任何一种操作都需要消耗资源,附加锁同样也会消耗资源,同样的一个查询如果我们锁定的资源越少那么并发就越高同时资源消耗越大,反之并发低消耗越小。
表锁(table lock)
表锁是MYSQL里面资源消耗最小的锁,只需要在查询对应的表上附加锁就可以了。一个SQL语句首先需要获得锁,首先查询语句会判断表上面是否存在锁,如果表上面有排他锁那么查询语句就会等待,所以查询语句只需要获取一次锁就可以了,不需要再往下一层去判断是否存在行锁,锁资源消耗低。同时如果有一个排他锁附加在该表上面其它的语句都需要等待改锁释放,系统的并发度很低。
行锁(row lock)
行锁与表锁刚好相反,一个update语句首先它会判断对应的表是否存在排他锁,如果不存在接下来会判断对应的更新记录上面是否存在锁,如果不存在附加排他锁。行锁的获取锁资源方面消耗比表锁更多,但是由于它只在对应的记录行上面添加锁,不影响对应表的其它记录行,系统的并发度比表锁要高。
死锁
在一个高并发的系统中,由于锁和事务的存在往往会有死锁的情况发生。举个简单的死锁的例子,假如两个事务同时执行。
事务1
START TRANSACTION;
UPDATE USER SET NAME='张三' WHERE ID=1
等待5秒
UPDATE USER SET NAME='李四' WHERE ID=2
COMMIT;
事务2
START TRANSACTION;
UPDATE USER SET NAME='张三' WHERE ID=2
等待5秒
UPDATE USER SET NAME='李四' WHERE ID=1
COMMIT;
由于两个事务在更新第一天语句的时候都锁定了对应的行记录,当进行第二天更新语句的时候由于对应的记录行已经被锁定需要等待,陷入了死循环,这就是常见的死锁的情况。
3.事务
mysql和其它的数据库产品有一个很大的不同就是事务由存储引擎所决定,例如MYISAM,MEMORY,ARCHIVE都不支持事务,事务就是为了解决一组查询要么全部执行成功,要么全部执行失败。
mysql事务默认是采取自动提交的模式,除非显示开始一个事务
SHOW VARIABLES LIKE 'AUTOCOMMIT';
修改自动提交模式,0=OFF,1=ON
注意:修改自动提交对非事务类型的表是无效的,因为它们本身就没有提交和回滚的概念,还有一些命令是会强制自动提交的,比如DLL命令、lock tables等。
SET AUTOCOMMIT=OFF
或
SET AUTOCOMMIT=0
大家可能比较熟悉的就是事务的ACID特性:原子性,一致性,隔离性,持久性。
原子性:事务是不可分割的最小工作单元,整个事务要么全部提交要么全部回滚失败。
一致性:数据库总是从一个一致性状态转换到另一个一致性的状态。
隔离性: 一个事务所做的更改在最终提交之前其它事务是不可见的。
持久性:事务一旦提交所做的修改就会永久保存在数据库中,即使系统崩溃,数据也不会丢失。
隔离级别
隔离级别是用来规定一个事务所做的更改,通常会默认系统使用哪一种隔离级别,通常隔离级别越高系统的并发就越低,系统开销也越大,mysql有四种隔离级别分别是:
未提交读(READ UNCOMMITTED):未提交读隔离级别也叫读脏,就是事务可以读取其它事务未提交的数据。
提交读(READ COMMITTED):在其它数据库系统比如SQL Server默认的隔离级别就是提交读,已提交读隔离级别就是在事务未提交之前所做的修改其它事务是不可见的。
可重复读(REPEATABLE READ):保证同一个事务中的多次相同的查询的结果是一致的,比如一个事务一开始查询了一条记录然后过了几秒钟又执行了相同的查询,保证两次查询的结果是相同的,可重复读也是mysql的默认隔离级别,。
可串行化(SERIALIZABLE):可串行化就是保证读取的范围内没有新的数据插入,比如事务第一次查询得到某个范围的数据,第二次查询也同样得到了相同范围的数据,中间没有新的数据插入到该范围中。
查询系统默认隔离级别、当前回话隔离级别
select @@global.tx_isolation,@@tx_isolation;
分别设置系统和回话当前隔离级别为可提交读
/*设置系统当前隔离级别*/
SET global transaction isolation level read committed;
/*设置回话当前隔离级别*/
SET SESSION transaction isolation LEVEL read committed;
注意:在同一个事务中避免出现混合存储引擎的表,比如混合了事务和非事务的表,正常提交不会有影响,如果出现了回滚操作,非事务的表的修改就无法回滚这样就会导致数据库处于不一致的状态,一旦出现这种情况将很难修复,所以表选择合适存储引擎很重要。
隐式和显示锁定
所谓的隐式锁定就是系统自动加锁而不是认为的添加锁,INNODB采用两段锁定协议,在事务的执行过程中随时执行锁定,在执行commit或者rollback的时候所有的锁才同时释放
显示锁定就是人为的添加锁,比如lock tables或者unlock tables,显示锁定是基于服务器层的设定和存储引擎无关,就是不管你的表是myisam还是innodb都可以显示添加lock tables,但是myisam本身就是lock tables所以再显示添加也多此一举。
注意:避免在事务中使用lock tables
存储
存储这块知识放在后面单独讲解
总结
对于mysql的体系结构每个人的理解可能会有所不同,上图是根据自己的理解绘制的不是官方标准的体系结构,仅供参考。

MySQL在數據庫和編程中的地位非常重要,它是一個開源的關係型數據庫管理系統,廣泛應用於各種應用場景。 1)MySQL提供高效的數據存儲、組織和檢索功能,支持Web、移動和企業級系統。 2)它使用客戶端-服務器架構,支持多種存儲引擎和索引優化。 3)基本用法包括創建表和插入數據,高級用法涉及多表JOIN和復雜查詢。 4)常見問題如SQL語法錯誤和性能問題可以通過EXPLAIN命令和慢查詢日誌調試。 5)性能優化方法包括合理使用索引、優化查詢和使用緩存,最佳實踐包括使用事務和PreparedStatemen

MySQL適合小型和大型企業。 1)小型企業可使用MySQL進行基本數據管理,如存儲客戶信息。 2)大型企業可利用MySQL處理海量數據和復雜業務邏輯,優化查詢性能和事務處理。

InnoDB通過Next-KeyLocking機制有效防止幻讀。 1)Next-KeyLocking結合行鎖和間隙鎖,鎖定記錄及其間隙,防止新記錄插入。 2)在實際應用中,通過優化查詢和調整隔離級別,可以減少鎖競爭,提高並發性能。

MySQL不是一門編程語言,但其查詢語言SQL具備編程語言的特性:1.SQL支持條件判斷、循環和變量操作;2.通過存儲過程、觸發器和函數,用戶可以在數據庫中執行複雜邏輯操作。

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

MySQL是一個開源的關係型數據庫管理系統,適用於數據存儲、管理、查詢和安全。 1.它支持多種操作系統,廣泛應用於Web應用等領域。 2.通過客戶端-服務器架構和不同存儲引擎,MySQL高效處理數據。 3.基本用法包括創建數據庫和表,插入、查詢和更新數據。 4.高級用法涉及復雜查詢和存儲過程。 5.常見錯誤可通過EXPLAIN語句調試。 6.性能優化包括合理使用索引和優化查詢語句。

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

InnoDB的鎖機制包括共享鎖、排他鎖、意向鎖、記錄鎖、間隙鎖和下一個鍵鎖。 1.共享鎖允許事務讀取數據而不阻止其他事務讀取。 2.排他鎖阻止其他事務讀取和修改數據。 3.意向鎖優化鎖效率。 4.記錄鎖鎖定索引記錄。 5.間隙鎖鎖定索引記錄間隙。 6.下一個鍵鎖是記錄鎖和間隙鎖的組合,確保數據一致性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

WebStorm Mac版
好用的JavaScript開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。