iPhonex如何鑒別基帶 iphonex的基帶怎么分辨
2023-11-24
更新時間:2023-11-24 00:10:15作者:未知
一.mysql體系結(jié)構(gòu)和存儲引擎
1.1、數(shù)據(jù)庫和實例的區(qū)別
數(shù)據(jù)庫:物理操作系統(tǒng)或其他形式文件類型的集合。在mysql下數(shù)據(jù)庫文件可以是frm,myd,myi,ibd結(jié)尾的文件。
數(shù)據(jù)庫實例:由數(shù)據(jù)庫后臺進程/線程以及一個共享內(nèi)存區(qū)組成。數(shù)據(jù)庫實例才是真正用來操作數(shù)據(jù)庫文件的。
mysql數(shù)據(jù)庫是單進程多線程的程序,與sql server比較類似。也就是說,Mysql數(shù)據(jù)庫實例在系統(tǒng)上的表現(xiàn)就是一個進程。
1.2、mysql的體系結(jié)構(gòu)
mysql由連接池組件、管理服務(wù)和工具組件、sql接口組建、查詢分析器組件、優(yōu)化器組件、緩存組件、插件是存儲引擎、物理文件。
1.3、mysql存儲引擎
1.3.1、innodb存儲引擎,特點支持外鍵、行鎖、非鎖定讀(默認(rèn)情況下讀取不會產(chǎn)生鎖)、mysql-4.1開始支持每個innodb引擎的表單獨放到一個表空間里。innodb通過使用MVCC來獲取高并發(fā)性,并且實現(xiàn)sql標(biāo)準(zhǔn)的4種隔離級別,同時使用一種被稱成next-key locking的策略來避免換讀(phantom)現(xiàn)象。除此之外innodb引擎還提供了插入緩存(insert buffer)、二次寫(double write)、自適應(yīng)哈西索引(adaptive hash index)、預(yù)讀(read ahead)等高性能技術(shù)。
1.3.2、myisam存儲引擎,myisam特點是不支持事物,適合olap應(yīng)用,myisam表由MYD和MYI組成。mysql-5.0版本之前,myisam默認(rèn)支持的表大小為4G,從mysql-5.0以后,myisam默認(rèn)支持256T的表單數(shù)據(jù)。myisam只緩存索引數(shù)據(jù)。
1.3.3、NDB存儲引擎,特點是數(shù)據(jù)放在內(nèi)存中,mysql-5.1版本開始可以將非索引數(shù)據(jù)放到磁盤上。NDB之前的缺陷是join查詢是mysql數(shù)據(jù)庫層完成的,而不是存儲引擎完成的,復(fù)雜的join查詢需要巨大的網(wǎng)絡(luò)開銷,速度很慢。當(dāng)前mysql cluster7.2版本中已經(jīng)解決此問題,join查詢效率提高了70倍。
1.3.4、memeory存儲引擎,將數(shù)據(jù)放到內(nèi)存中,默認(rèn)使用hash索引,不支持text和blob類型,varchara是按照char的方式來存儲的。mysql數(shù)據(jù)庫使用memory存儲引擎作為臨時表還存儲中間結(jié)果集(intermediate result),如果中間集結(jié)果大于memorg表的容量設(shè)置,又或者中間結(jié)果集包含text和blog列類型字段,則mysql會把他們轉(zhuǎn)換到myisam存儲引擎表而放到磁盤上,會對查詢產(chǎn)生性能影響。
1.3.5、archive存儲引擎,壓縮能力較強,主要用于歸檔存儲。
1.3.6、federated存儲引擎,不存儲數(shù)據(jù),他指向一臺遠(yuǎn)程mysql數(shù)據(jù)庫上的表。
1.3.7、maria存儲引擎,myisam的后續(xù)版本,支持緩存數(shù)據(jù)和索引,行鎖設(shè)計,支持mvcc,支持事務(wù)和非事務(wù)安全的選項,以及更好的BLOG字符類型的處理性能。
1.3.8、其他存儲引擎,sphinx用于全文索引,infobright用于數(shù)據(jù)倉庫。
1.4連接Mysql
1.4.1、TCP/IP:基于網(wǎng)絡(luò)的連接,連接進行權(quán)限檢查。
1.4.2、命名管道和共享內(nèi)存:Windows系統(tǒng)上同一服務(wù)器上的兩進程可通過命名管道連接,需在配置文件中啟用--enable-named-pipe選項。
1.4.3、Unix套接字:客戶端與服務(wù)端位于同一服務(wù)器時才可使用,可以在my.cnf中指定-socket=/tmp/mysql.sock,連接時指定./mysql -S/tmp/mysql.sock。
二.InnoDB存儲引擎
2.2、innodb引擎架構(gòu)
InnoDB的多個內(nèi)存塊組成了內(nèi)存池,負(fù)責(zé)如下工作:
1).維護所有進程/線程需要訪問的多個內(nèi)部數(shù)據(jù)結(jié)構(gòu)。
2).緩存磁盤上的數(shù)據(jù),方便快速的讀取,并且在對磁盤文件的數(shù)據(jù)進行修改之前在這里緩存。
3).重做日志緩存。
后臺線程的主要作用是負(fù)責(zé)刷新內(nèi)存池中的數(shù)據(jù),保證緩沖池中的內(nèi)存緩存是最近的數(shù)據(jù),此外、將已經(jīng)修改的數(shù)據(jù)文件刷新到磁盤文件
2.2.1、后臺線程
innodb存儲引擎后臺有7個線程,—–4個IO線程(insert buffer thread,log thread,read thread,write thread),1個master thread,一個lock監(jiān)控線程,一個錯誤監(jiān)控線程。
2.2.2、內(nèi)存
innodb存儲引擎內(nèi)存由以下三個部分組成:緩沖池(buffer pool),重做日志緩存(redo log buffer),額外的內(nèi)存池(additional memory pool)。可以使用 show engine innodb status來查看innodb_buffer_pool的使用情況。
innodb_buffer_pool_size:具體看,緩沖池中的數(shù)據(jù)庫類型有:索引頁、數(shù)據(jù)庫頁、undo頁、插入緩存頁(insert buffer)、自適應(yīng)hash(adaptive hashindex)、innodb存儲的鎖信息(lock info)、數(shù)據(jù)字典信息(data dictionary)。
InnoDB工作方式:將數(shù)據(jù)文件按頁(每頁16K)讀入InnoDBbuffer pool,然后按最近最少使用算法(LRU)保留緩存數(shù)據(jù),最后通過一定頻率將臟頁刷新到文件。
2.3、master thread
2.3.1、master thread源碼分析
2.3.2、master thread的潛在問題
1、由于硬件的發(fā)展,現(xiàn)在的硬件性能已經(jīng)提高了很多,如果innodb每秒最大刷新100個臟頁,那么效率會很低,為了解決這個問題,innodb plugin提供了一個參數(shù)innodb_io_capacity,用來表示磁盤IO的吞吐量,默認(rèn)值是200,規(guī)則如下:在合并插入緩存時,合并插入緩存的數(shù)量為innodb_io_capacity的5%;在從緩沖區(qū)刷新臟頁時,啥新臟頁的數(shù)量為innodb_io_capacity。
2、關(guān)于innodb_max_dirty_pages_pct值的爭議,如果值過大,內(nèi)存也很大或者服務(wù)器壓力很大,那么效率很降低,如果設(shè)置的值過小,那么硬盤的壓力會增加,建議是在75-80.并且innodb plugin引進了innodb_adaptive_flushng(自適應(yīng)的刷新),該值影響每秒刷新臟頁的數(shù)量。
2.4、關(guān)鍵特性,為innodb提高性能的技術(shù)
2.4.1、插入緩存
當(dāng)一個表有非聚集索引時,對于非聚集索引的葉子節(jié)點的插入不是順序的,這時候需要離散的訪問非聚集索引頁,性能就在這里降低了,這是由于b+樹的原理導(dǎo)致的。插入緩存就是用來解決這個問題的。
對于非聚集索引的插入和更新操作,不是每一次都直接插入索引頁,而是先判斷插入的非聚集索引頁是否在緩存中,如果在就直接插入,如果不在就放入到一個插入緩沖區(qū)中,好似欺騙數(shù)據(jù)庫這個非聚集索引已經(jīng)插入到葉子節(jié)點了。然后再以一定的頻率插入緩存和非聚集索引頁字節(jié)點的合并操作。
插入緩存的使用需要滿足以下兩個條件(也就是非唯一的輔助索引):索引是輔助索引;索引不是唯一的。
2.4.2、兩次寫
兩次寫給innodb帶來的是可靠性,主要用來解決部分寫失敗(partial page write)。在應(yīng)用重做日之前,我們需要一個頁的副本,當(dāng)寫入失效發(fā)生時,先通過頁的副本來還原該頁,再進行重做,這就是doublewrite。
doublewrite有兩部分組成,一部分是內(nèi)存中的doublewrite buffer,大小為2M,另外一部分就是物理磁盤上的共享表空間中聯(lián)系的128個頁,即兩個區(qū),大小同樣為2M。當(dāng)緩沖池的張也刷新時,并不直接寫硬盤,而是回通過memcpy函數(shù)將臟頁先拷貝到內(nèi)存中的doublewrite buffer,之后通過doublewrite buffer再分兩次寫,每次寫入1M到共享表空間的物理磁盤上,然后馬上調(diào)用fsync函數(shù),同步磁盤。
2.4.3、自適應(yīng)哈西索引
由于innodb不支持hash索引,但是在某些情況下hash索引的效率很高,于是出現(xiàn)了 adaptive hash index功能,innodb存儲引擎會監(jiān)控對表上索引的查找,如果觀察到建立hash索引可以提高性能的時候,則自動建立hash索引。
2.5、啟動、關(guān)閉、恢復(fù)
innodb_fast_shutdown影響InnoDB表關(guān)閉。該參數(shù)有0、1、2三個參數(shù)。
0 MySQL關(guān)閉時 完成所有的full purge和merge insertbuffer操作
1默認(rèn)值 只將緩沖池內(nèi)的一些臟頁刷新至磁盤
2將日志都寫入日志文件不會有任何事務(wù)丟失但下次啟動時會進行recovery
innodb_force_recovery影響整個innodb存儲引擎的恢復(fù)狀況,該值默認(rèn)為0,表示當(dāng)需要恢復(fù)時,需要執(zhí)行所有的恢復(fù)操作,當(dāng)不能進行有效恢復(fù)時,如數(shù)據(jù)頁發(fā)生了corruption,mysql數(shù)據(jù)庫可能宕機,并把錯誤寫入錯誤日志中。
三.文件
3.1參數(shù)文件
Mysql實例可以不需要參數(shù)文件,這是所有的參數(shù)值取決于編譯Mysql時指定的默認(rèn)值和源代碼中指定參數(shù)的默認(rèn)值。其參數(shù)文件是Mysql.cnf。
3.1.1、什么是參數(shù)
參數(shù)是一個鍵/值對??梢允褂胹how variables like命令查看,也可以通過information_schema的GLOBAL_VARIABLES視圖來查找。
3.1.2、參數(shù)類型
參數(shù)文件分為兩類:動態(tài)參數(shù)和靜態(tài)參數(shù)。動態(tài)參數(shù)意味著你可以在Mysql實例運行中進行更改;靜態(tài)參數(shù)說明在整個實例生命周期內(nèi)都不得進行更改,好像是只讀的。對于動態(tài)參數(shù),又可以分為global和session關(guān)鍵字,表明該參數(shù)的修改是基于當(dāng)前會話還是真格實例的生命周期。有些動態(tài)參數(shù)只能在會話中進行修改,如autocommit;有些參數(shù)修改完后,在整個實例生命周期中都會生效,如binlog_cache_size;而有些參數(shù)既可以在會話又可以在整個實例的生命周期內(nèi)生效,如read_buffer_size。
3.2、日志文件
3.2.1、錯誤日志
錯誤日志對Mysql的啟動、運行、關(guān)閉過程進行了記錄。出現(xiàn)Mysql不能正常啟動時,第一個必須查找的文件應(yīng)該就是錯誤日志文件。使用show variables like ‘log_error’來定位文件。
3.2.2、慢查詢?nèi)罩?/p>
慢查詢能為SQL語句的優(yōu)化帶來很好的幫助。設(shè)定一個閥值,將運行時間超過該值的所有SQL語句都記錄到慢查詢?nèi)罩疚募?。用參?shù)long_query_time來設(shè)置。另一個參數(shù)log_queries_not_using_indexes,若運行的SQL語句沒有使用索引,則這條SQL語句會被記錄下來。
3.2.3、查詢?nèi)罩?/p>
查詢?nèi)罩居涗浟怂袑ysql請求的信息,不論這些請求是否得到正確的執(zhí)行。默認(rèn)文件名為:主機名.log。
3.2.4、二進制日志
二進制記錄了對數(shù)據(jù)庫執(zhí)行更改的所有操作,但是不包括SELECT和SHOW操作,還包括了執(zhí)行時間和更改操作時間。可用來恢復(fù)某些數(shù)據(jù),同時也可以用來復(fù)制同步遠(yuǎn)程數(shù)據(jù)庫。將binlog_format設(shè)置成row,可以支持事務(wù)隔離級別為READ COMMITTED,以獲得更好的并發(fā)性。在使用MIXED格式下,mysql采用STATEMENT格式進行二進制日志文件的記錄,但是有一些情況下會使用ROW格式,可能的情況如下:
1、表的存儲引擎為NDB,這個時候DML操作都會以ROW格式記錄。
2、使用了uuid()、user(),current_user(),found_rows(),row_count(),等不確定函數(shù)。
3、使用了insert delay語句
4、使用了用戶定于的函數(shù)(UDF)
5、使用了臨時表(temporary table)
注意:針對系統(tǒng)庫mysql里面的表發(fā)生變化的處理規(guī)則如下:
1、 如果采用insert,update,delete直接操作表,則日志根據(jù)binlog_format設(shè)定的格式記錄。
2、 如果使用grant,revoke,set password等DCL語句,那么無論如何都會使用SBR模式記錄。
3、 blockhole引擎不支持row格式,ndb引擎不支持statement格式。
3.3、套件字文件
Unix系統(tǒng)下本地連接Mysql可以采用Unix套接字方法,需要一個套接字文件,可以使用show variableslike ‘socket’查詢。
3.4、pid文件和表結(jié)構(gòu)定義文件
pid文件是實例啟動是記錄自己進程ID號的文件,表結(jié)構(gòu)定義文件是以frm為后綴名的文件,還可以用來存放視圖的定義。
3.5、innodb引擎文件
3.5.1、表空間文件
默認(rèn)表空間文件為ibdata1文件innodb_data_file_path存儲數(shù)據(jù),innodb_file_per_table可以按表分別產(chǎn)生一個表空間.db文件,但僅存該表的數(shù)據(jù)索引和插入緩沖等信息,其他信息如undo信息,系統(tǒng)事務(wù)信息,double write buffer等還是存放在默認(rèn)表空間(ibdata1或表空間組)里。
3.5.2、重做日志文件
redo log是在實例或者介質(zhì)失敗的時候,用來保證數(shù)據(jù)完整性。每個innodb存儲引擎至少有一個重做日志組,每個重做日志文件組下至少又2個重做日志文件,如默認(rèn)的ib_logfile0、ib_logfile1.為了得到更高的可靠性,你可以設(shè)置多個重做鏡像日志組。
因為重做日志條目先被寫到日志緩沖中,然后根據(jù)一定條件刷新到磁盤重做日志文件中。與redo log相關(guān)的就是innodb_flush_log_at_trx_commit的值,對innodb的性能影響很大。他有0,1,2三個值,0代表提交事務(wù)時,并不同步寫redo log,而是等master threas每秒寫。1代表commit的時候就將redo log緩存寫入磁盤,2代表commit的時候?qū)edo log緩存異步的寫入磁盤。