【正文】
acquires the necessary the table operation module is ready to proceed with its specific task and will issue a number of requests to the Abstracted Storage Engine Module for lowlevel operations such as inserting or updating a record, retrieving the records based on a key value, or performing an operation on the table level, such as repairing it or updating the index statistics.The Abstracted Storage Engine Module will automatically translate the calls to the corresponding methods of the specific Storage Engine Module via object other words, when dealing with a Storage Engine object, the caller thinks it isthe caller does not need to be aware of the exact object type of the Storage Engine object.As the query or mand is being processed, the corresponding module may send parts of the result set to the client as they bee available. It may also send warnings or an error message. If an error message is issued, both the client and the server will understand that the query or mand has failed and take the appropriate measures. The client will not accept any more result set, warning, or error message data for the given query, while the server will always transfer control to the Connection Thread after issuing an error. Note that since MySQL does not use exceptions for reasons of implementation stability and portability, all calls on all levels must be checked for errors with the appropriate transfer of control in the case of failure.If the lowlevel module has made a modification to the data in some way and if the binary update logging is enabled, the module will be responsible for asking the Logging Module to log the update event to the binary update log, sometimes known as the replication log, or, among MySQL developers and power users, the binlog.Once the task is pleted, the execution flow returns to the Connection Thread,which performs the necessary cleanup and waits for another query or mand from the client. The session continues until the client issues the Quit mand.In addition to interacting with regular clients, a server may receive a mand from a replication slave to continuously read its binary update log. This mand will be handled by the Replication Master Module.If the server is configured as a replication slave, the Initialization Module will call the Replication Slave Module, which in turn will start two threads, called the SQL Thread and the I/O thread. They take care of propagating updates that happened on the master to the slave. It is possible for the same server to be configured as both a master and a slave.Network munication with a client goes through the Client/Server Protocol Module,which is responsible for packaging the data in the proper format, and depending on the connection settings, pressing it. The Client/Server Protocol Module in turn uses the LowLevel Network I/O module, which is responsible for sending and receiving the data on the socket level in a crossplatform portable way. It is also responsible for encrypting the data using the OpenSSL library calls if the connection options are set appropriately.MySQL歷史MySQL的歷史可以追溯到1979年,當(dāng)時(shí),工作為一個(gè)小panycalled TCX,蒙蒂維德紐創(chuàng)建一個(gè)報(bào)告工具,用BASIC語(yǔ)言編寫(xiě),運(yùn)行4 Mhzputer上具有16 KB的RAM。隨著時(shí)間的推移,在C重寫(xiě)工具移植到運(yùn)行在Unix。這還只是一個(gè)低級(jí)別的存儲(chǔ)引擎與報(bào)告前端。該工具被稱(chēng)為的名字Unireg。小的計(jì)算資源的不利條件下工作,也許是他的上帝賜予的天賦基礎(chǔ)上,蒙蒂開(kāi)發(fā)自然非常有效的寫(xiě)代碼的習(xí)慣和能力。他還開(kāi)發(fā)了,或者也許是有天賦的,從一開(kāi)始就異常敏銳的眼光有用使其在未來(lái)的發(fā)展提前多的細(xì)節(jié),未來(lái)的發(fā)展將是什么,不知道什么需要做的代碼。除了上述TcX公司是一家很小的公司和蒙蒂的業(yè)主之一,他有很多的說(shuō)發(fā)生了什么事他的代碼。雖然有也許是一個(gè)很好的程序員有與蒙蒂的才華和能力,有許多原因,很少去執(zhí)行他們的代碼超過(guò)20年左右。蒙蒂的工作,才干和代碼所有權(quán)MySQL的奇跡可以建立提供了基礎(chǔ)。在20世紀(jì)90年代的一段時(shí)間,TcX公司客戶(hù)開(kāi)始推動(dòng)他們的數(shù)據(jù)的SQL接口。幾種可能性進(jìn)行了審議。他試圖借用mSQL的代碼的SQL語(yǔ)句組成部分,將與他的低級(jí)別的存儲(chǔ)引擎。這并不能很好的工作。隨后趕來(lái)的經(jīng)典之舉,帶動(dòng)一個(gè)有才華的程序員:“我已經(jīng)受夠了這些工具的,別人寫(xiě)的,不工作!我寫(xiě)我自己的!“因此,在5月的1996年版本的MySQL 。首次公開(kāi)發(fā)布只提供了二進(jìn)制分發(fā)用于Solaris。一個(gè)月后,被釋放源和Linux二進(jìn)制。在未來(lái)兩年中,MySQL移植到其他操作系統(tǒng)的一些功能集逐漸增加。 MySQL是一種特殊的許可下發(fā)布的,那些誰(shuí)是不是重新分配它與他們的軟件允許商業(yè)使用。特別許可證可用于那些誰(shuí)想要用他們的產(chǎn)品捆綁銷(xiāo)售。此外,商業(yè)支持,也被售出。這提供了的TCX一些收入證明MySQL的進(jìn)一步發(fā)展,雖然其獨(dú)創(chuàng)的目的已經(jīng)達(dá)成了。在此期間。它支持一個(gè)體面的SQL語(yǔ)言的子集,有可能由一個(gè)人寫(xiě)了很多更復(fù)雜的,比我們預(yù)期的優(yōu)化,速度極快,所以人們可以編寫(xiě)一個(gè)客戶(hù)端在幾乎任何現(xiàn)有編程語(yǔ)言的。但是,它仍然缺乏支持事務(wù),子查詢(xún),外鍵,存儲(chǔ)過(guò)程和意見(jiàn)。只發(fā)生在表級(jí)鎖定,在某些情況下可能會(huì)慢下來(lái)嘎然而止。有些程序員無(wú)法得到解決其局限性仍然認(rèn)為這是一個(gè)玩具,而其他人更樂(lè)意拋售他們的Oracle或SQL Server支持的MySQL,并處理在他們的代碼中的局限性換取改善性能和許可成本節(jié)約。大約19992000名為MySQL AB公司成立一個(gè)獨(dú)立的公司。它聘請(qǐng)一些開(kāi)發(fā)商建立了合作關(guān)系,與Sleepycat Berkeley DB的數(shù)據(jù)文件提供一個(gè)SQL接口。由于Berkeley DB的事務(wù)處理能力,這將使MySQL支持的交易,準(zhǔn)備整合的Berkeley DB。雖然MySQL的開(kāi)發(fā)人員不可能所有的怪癖Berkeley DB的接口和Berkeley DB表從來(lái)沒(méi)有穩(wěn)定,MySQL源代碼成為鉤子添加任何類(lèi)型的存儲(chǔ)引擎,包括配備事務(wù)。,如α,并宣布2004年6月公測(cè)。,它增加了一些顯著的改進(jìn)。也許最重要的是子查詢(xún),許多用戶(hù)期待已久的功能??臻g索引支持添加到MyISAM存儲(chǔ)引擎。 Unicode支持實(shí)施。客戶(hù)機(jī)/服務(wù)器協(xié)議,看到了一些變化。它是由更安全的攻擊,并支持預(yù)處理語(yǔ)句的。 alpha版本的同時(shí),工作進(jìn)展的又一發(fā)展分支:,這將增加存儲(chǔ)過(guò)程,服務(wù)器端游標(biāo),觸發(fā)器,視圖,XA事務(wù),查詢(xún)優(yōu)化器的顯著改善,和其他一些功能。,如果在上面的所有新功能,他們加入,他們不得不處理與存儲(chǔ)的程序,作出決定創(chuàng)建一個(gè)單獨(dú)的開(kāi)發(fā)分支。 。對(duì)于而這創(chuàng)造了相當(dāng)有點(diǎn)混亂,有兩個(gè)分支在alpha階段。(2004年10月),以及混亂得到解決。,其中新增了多項(xiàng)改進(jìn),其中一些表數(shù)據(jù)分區(qū),基于行的復(fù)制,事件調(diào)度器,插件API和標(biāo)準(zhǔn)化,有利于整合新的存儲(chǔ)引擎和其他插件。在這一點(diǎn)上,MySQL是正在積極開(kāi)發(fā)。,應(yīng)該很快趨于穩(wěn)定。,在這一點(diǎn)上。MySQL的架構(gòu)很大一部分,它沒(méi)有做一些偉大的系統(tǒng)在將來(lái)成為其中的一部分,而是要解決一些非常具體的問(wèn)題。然而,它寫(xiě)的這么好,有足夠的洞察力,它達(dá)到的地步,有足夠的質(zhì)量件組裝一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器。核心模塊在本節(jié)中我進(jìn)行了嘗試識(shí)別系統(tǒng)中的核心模塊。然而,讓我添加一個(gè)聲明。相反,他們傾向于認(rèn)為,文件,目錄類(lèi),結(jié)構(gòu)和功能。這是更常聽(tīng)到的“發(fā)生這種情況在mi_open()”聽(tīng)到“這發(fā)生在MyISAM存儲(chǔ)引擎級(jí)別?!盡ySQL開(kāi)發(fā)者知道代碼,以便他們能夠認(rèn)為概念的功能,結(jié)構(gòu),上水平和類(lèi)。他們可能會(huì)發(fā)現(xiàn)本節(jié)中的抽象,而沒(méi)用。然而,這將有助于一個(gè)人思維模塊和經(jīng)理。關(guān)于MySQL的,我用的術(shù)語(yǔ)“模塊”,而松散。不像通常會(huì)調(diào)用一個(gè)模塊,在許多情況下,它是不是你可以很容易地拔出并更換另一個(gè)實(shí)施。從一個(gè)模塊的代碼可能會(huì)被分散在多個(gè)文件中,你經(jīng)常會(huì)發(fā)現(xiàn)從幾個(gè)不同的模塊在同一個(gè)文件的代碼。這是特別真實(shí)的較舊的代碼。新的代碼往往更好,以適應(yīng)模塊的格局。因此,在我們的定義中,一個(gè)模塊是一段代碼,以某種方式,在邏輯上屬于一起,并執(zhí)行某些關(guān)鍵的功能在用戶(hù)身份驗(yàn)證模塊在命令行上,分配全局內(nèi)存緩沖器,初始化的全局變量和結(jié)構(gòu),負(fù)載的訪問(wèn)控制表,并進(jìn)行了一些其他初始化任務(wù)。一旦初始化工作完成后,初始化模塊通過(guò)控制連接管理器,開(kāi)始監(jiān)聽(tīng)來(lái)自客戶(hù)端的連接,在一個(gè)循環(huán)中。當(dāng)客戶(hù)端連接到數(shù)據(jù)庫(kù)服務(wù)器,連接管理器進(jìn)行了一些低級(jí)別的網(wǎng)絡(luò)協(xié)議任務(wù),然后通過(guò)控制線程管理器,這反過(guò)來(lái)又提供了一個(gè)線程來(lái)處理連接(從現(xiàn)在開(kāi)始將被稱(chēng)為作為連接螺紋)。連接螺紋可能會(huì)被重新創(chuàng)建,或從線程緩存中檢索,并叫到現(xiàn)役。一旦連接螺紋接收控制,它首先調(diào)用用戶(hù)認(rèn)證模塊。憑據(jù)連接的用戶(hù)進(jìn)行驗(yàn)證,客戶(hù)端現(xiàn)在可以發(fā)出請(qǐng)求。連接螺紋請(qǐng)求數(shù)據(jù)傳遞到指揮調(diào)度??梢匀菁{一些請(qǐng)求,命令,在MySQL的代碼術(shù)語(yǔ)稱(chēng)為直接由指揮調(diào)度,而更復(fù)雜的需要被重定向到另一個(gè)模塊。一個(gè)典型的命令請(qǐng)求服務(wù)器運(yùn)行一個(gè)查詢(xún),更改活動(dòng)數(shù)據(jù)庫(kù),狀態(tài)報(bào)告,發(fā)送連續(xù)的轉(zhuǎn)儲(chǔ)復(fù)制更新,關(guān)閉連接,或進(jìn)行一些其他操作。在MySQL服務(wù)器術(shù)語(yǔ)中,有兩種類(lèi)型的客戶(hù)端請(qǐng)求的查詢(xún)和命令。查詢(xún)是任何東西,通過(guò)解析器去。命令是一個(gè)請(qǐng)求,該請(qǐng)求可以被執(zhí)行,而無(wú)需調(diào)用解析器。MySQL的內(nèi)部的背景下,我們將使用術(shù)語(yǔ)查詢(xún)。因此,不僅一個(gè)SELECT也DELETE或INSERT在我們的術(shù)語(yǔ)將被稱(chēng)為一個(gè)查詢(xún)。有時(shí)也被稱(chēng)為什么,我們將調(diào)用查詢(xún)的SQL語(yǔ)句。如果啟用了日志記錄完整的查詢(xún),指揮調(diào)度會(huì)要求派遣前登錄查詢(xún)或命令的純文本格式的日志記錄模塊。因此,在完整的日志記錄配置所有的查詢(xún)將被記錄下來(lái),即使是那些沒(méi)有語(yǔ)法上是正確的,將永遠(yuǎn)不會(huì)被執(zhí)行,立即返回一個(gè)錯(cuò)誤。指揮調(diào)度轉(zhuǎn)發(fā)查詢(xún)分析器通過(guò)查詢(xún)緩存模塊。查詢(xún)緩存模塊檢查查詢(xún)是否類(lèi)型可以被緩存,執(zhí)行短路,在這一點(diǎn)上,緩存結(jié)果返回給用戶(hù),連接螺紋接收控制,現(xiàn)在已經(jīng)準(zhǔn)備好處理另一個(gè)命令。如果查詢(xún)緩存模塊報(bào)告小組,查詢(xún)分析器,這將使得決定如