Verdant-Docs Documentation 发发发布布布 0.1
Total Page:16
File Type:pdf, Size:1020Kb
verdant-docs Documentation 发发发布布布 0.1 Verdant Yang 4月月月 02, 2017 Contents 1 说说说明明明 1 1.1 *º说明 .................................................1 2 目目目UUU 3 2.1 pn库 ..................................................3 2.2 LinuxÍ\ ................................................ 14 2.3 'pn .................................................. 14 2.4 v他 ................................................... 17 Bibliography 27 i ii CHAPTER 1 说明 这/*ºt理的f`笔记 ***ººº说说说明明明 èèèããã: • \者: • Z¢: • Github0@:https://github.com/verdantyang 1 verdant-docs Documentation, 发发发布布布 0.1 2 Chapter 1. 说说说明明明 CHAPTER 2 目U pppnnn库库库 sssûûûpppnnn库库库:Mysql、Oracle、SQLite KVpppnnn库库库:Memcached、Redis、Raik(Amazon) lll盘盘盘KVpppnnn库库库:SSDB(LevelDb) • LevelDB/U:X¨引Î 列列列bbbpppnnn库库库:HBase、BigTable、Cassandra、Hypertable • Cassandra/P2P的(无-á理节¹) 文文文cccpppnnn库库库:MongoDB、CouchDB 图图图pppnnn库库库:Neo4j 图pn库/持ACIDÄ则以Êê¨"引 fM¨P: 高'能MySQL 工w¨P: DBeaver MySQL官Q: http://dev.mysql.com/doc/ pn库内8月¥: http://mysql.taobao.org/monthly/ sssûûû型型型pppnnn库库库-XXX¨¨¨引引引ÎÎÎ pppnnn库库库事事事¡¡¡ ACIDhhh::: • 原P'(atomicity) • 一致'(consistency) 3 verdant-docs Documentation, 发发发布布布 0.1 • 隔»'(isolation) • 持E'(durability) 事事事¡¡¡§§§+++ 脏脏脏ûûû(((dirty read))): 1. 事¡T1更新了一L记U的内¹,F/v¡有Ф@Z的修9 2. 事¡T2û取更新后的L,6后T1gL回滚Í\,取消了刚M@Z的修9 3. 现(T2@û取的L1无效了 不不不可可可ÍÍÍ复复复ûûû(((nonrepeatable read))): 1. 事¡T1û取一L记U,'¥@事¡T2修9了T1刚Mû取的£一L记U 2. 6后T1È再!û取这L记U,发现与刚Mû取的结果不同 {{{ÏÏÏûûû(((phantom read))): 1. 事¡T1û取一a指定的WHEREP句@返回的结果Æ 2. 6后事¡T2新插e一L记U,这L记Up}á³T1@使(的查询a件 3. 6后T1È使(ø同的查询再!ùh进L检",d时t看0了事¡T2刚M插e的新L InnoDB和XtraDBX¨引Î通ÇMVCCã³了{Ïû的问题 MVCC(Multiversion Concurrency Control)/L§锁的一个变Í • ê(REPEATABLE READ和READ COMMITTED$*隔»§+下工\ • (很多Å况下避M了加锁Í\,因d开销更N • 实现了^;^的ûÍ\,写Í\_ê锁定Å要的L InnoDB 的MVCC/通Ç(ÏL记U后b保X$*隐Ï列实现的 • 这$*列,一个保X了L的创ú时间,一个保XL的Ç期时间(或 d时间) • X¨的不/实E的时间<,而/û统H,号(Ï开Ë一个新事¡H,号都会ê¨递增) 事¡的隔»§+,Χ+N0高依!:: 较N§+的隔»通8可以gL更高的v发,û统的开销_更N \ 脏û 不可Í复û {Ïû 备è READ UNCOMMITTED Yes Yes Yes - READ COMMITTED No Yes Yes - REPEATABLE READ No No Yes InnoDB默¤§+ SERIALIZABLE No No No 会(û取的Ï一Lpn上都加锁 ORACLEpn库 /持 READ COMMITTED 和 SERIALIZABLE 不/持 READ UNCOMMITTED 和 REPEATABLE READ 4 Chapter 2. 目目目UUU verdant-docs Documentation, 发发发布布布 0.1 事事事¡¡¡实实实现现现øøøsss 事¡日志/以追加的¹式实现的: X¨引Î(修9h的pn时ê需要修9v内X拷贝,再把该修9L:记U 0持E(l盘上的事¡日志-,而不(Ï!都将修9的pn,«持E0Á盘。 事¡pn库û统n遍都Ç(了 Write Ahead Log Ve sS事¡Ð¤时,先写ÍZ日志再修9u 分布式XA事¡©X¨引Χ+的ACID 可以iU0pn库Bb MySQL 服¡hB不¡理事¡,事¡/1下B的X¨引Î实现的(事¡标Æ/一个 64 比y的pW) MySQL Ð供了两Í事¡型的X¨引Î:InnoDB、NDB Cluster InnoDB (日志把随:I/O变成z序I/O(日志/¯b¹式写的) • 一旦日志安全写0Á盘,事¡1持E化了,s使变更还¡写0pn文件 • 如果发生了一些意外(例如5),InnoDB 可以Í放日志v且b复已ÏФ的事¡ 缓缓缓XXX&缓缓缓²²²``` 待eE """引引引 "引Ï少了服¡h需要kÏ的pnÏ,可.©服¡h避M排序和4时h(原理/排序) • /一'不}的pn不适合("引 • ê有S"引能覆盖查询结果时M能使("引 优优优¹¹¹:可以Ð高û取'能(检") :::¹¹¹:会MNpn的写e'能(增 9)、"引可能要`( 'Ï的X¨z间 MySQL-"引/(X¨引ÎB而不/服¡hB实现的 pnÆ图dba_segments可以查看"引`(z间 /一P6和;.P6都/通Ç"引实现的 Å能( "引-Z最左M缀9M的 LIKE 比较(不/持通M&开4的) """引引引pppnnn结结结构构构 B Tree(((B-Tree)))ssssssaaa多多多路路路查查查~~~树树树 @有叶P结¹M于同一B B+Treeøøø较较较于于于B-Tree:::有有有nõõõPPP树树树的的的结结结¹¹¹---+++有有有n***sss...码码码 B+树/一Í专è针ùÁ盘X¨而优化的N叉排 序树 树有几B1涉Ê几!Á盘¿问 è:链¥. 1-7 0pn< d1-d7的简U例P(¢r列h链¥A¸ë速按z序M历) B-Tree """引引引 MyISAM和InnoDB使(的/ B+Tree MyISAM 使(M缀压)eÏ少"引的'小(导致"引查~和倒序kÏ比较b) ;;;"""引引引::: 2.1. pppnnn库库库 5 verdant-docs Documentation, 发发发布布布 0.1 图 2.1: 图:B+Treepn结构 • MyISAM"引和pn/分开的(叶节¹的data域X>的/pn记U的0@) • InnoDBpn文件,«1/"引文件(叶节¹data域保X了完t的pn记U) 辅辅辅©©©"""引引引::: • MyISAM;"引要Bkey/一,辅©"引key可以Í复 • InnoDB辅©"引data域X¨ø应记U的;.<而不/0@ PPP666::: • 不能跳Ç"引-的列 • 不能Sq列的z序 • 如果查询-有某*列的范围查询,则v右¹@有列都无法使("引优化查~ HASH"""引引引通通通ÇÇÇÈÈÈ希希希hhh实实实现现现 • ê有精n9M"引@有列的查询M有H(不/持范围查询,无法(于排序) • Memory引Î默¤使(d"引(速¦^8ë) 使(:o:Ð高URLI长W&2的查询H率,可ú一È希列(插epn时M合触发h) v他"引:z间pn"引(R-Tree)需要使(GISø关函p进L、h文"引 pppnnn库库库"""引引引(((MySQL))) ZZZ簇簇簇"""引引引 的z序1/pn的i理X¨z序(一个h最多ê能有一个Z簇"引) 默¤使(;.úË,如果¡定I;.会使(一个^z"引 若h-无pn需要ZÆ,可使(一*和应(无s的ê增序列保Ápn的按序写e ù于 ^ê增IDZ;.的h,插e新L时可能导致u分Â('Ï的pnû¨) ^^^ZZZ簇簇簇"""引引引 的"引z序与pni理排列z序无s InnoDB二§"引(dZ簇"引外的)的叶P节¹-X¨的不/”L指针”,而/;.< """引引引 可以包+一个或多*列的< 6 Chapter 2. 目目目UUU verdant-docs Documentation, 发发发布布布 0.1 图 2.2: 图:Z簇"引与^Z簇"引(MySQL) 2.1. pppnnn库库库 7 verdant-docs Documentation, 发发发布布布 0.1 S不考Q排序和分Ä时,将选é'最高的列>(Mb通8/很}的 5.6KKKMMM不不不能能能跳跳跳ÇÇÇ"""引引引---的的的列列列(((MySQLêêê能能能高高高HHH000使使使((("""引引引的的的最最最左左左MMM缀缀缀列列列))) : 了 不 跳 Ç Ð " 引列,可以通ÇIN9MÐa件的@有pne使("引(不能滥() 5.6加加加eee了了了ICP(((Index Condition Pushdown)))"""引引引aaa件件件下下下¨¨¨ 原理:WHEREa件如U使("引 的$ÎServerB下¨0X¨引ÎB 功能:Î而可以跳Ç"引-的列、:范围查询右¹ 的列使("引 aaa件件件::: • &有WHEREP句,^P查询,^针ù多h的UPDATE/DELETEÍ\ • X¨引Î/持ICP,且û统Âpindex_condition_pushdownS开(默¤开) • "引不/ZÆ"引(InnoDB;.¿/Z簇"引),Z簇"引,«也不需要 P6:不/持分:h(5.7ã³了d问题) """引引引kkkÏÏÏ!!!式式式 '凑"引kÏ(Extra:Using index) ~c"引kÏ(Extra:Using index for group-by) øS于Oracle-的跳跃"引kÏ(Skip Index Scan) s不需要连续kÏ"引-得Ï一个CÄ,kÏ时Å考Q"引-的一è分 SMySQL(GROUP BY时发现不能á³'凑kÏ时,会尝试~ckÏ 如果松ckÏ也不能(,£H可能会(04时h或者文件排序 aaa件件件 • 查询(U一h上(5.5后可以(查询-¡有GROUP BY和DISTINCTa件) • GROUP BY指定的@有列/"引的一个最左M缀,v且¡有v它的列 • Z合函pê能使(MIN()和MAX(),v且指定的/同一列 还/持AVG()、SUM()、COUNT() • 如果查询-X(GROUP BY指定列外的"引v他è分,Å{以8Ï形式ú现 • "引-的列Å{"引t*pn列的<,而不/一个M缀"引(LIKE) sssûûû型型型pppnnn库库库-SQL调调调优优优 查查查询询询的的的生生生}}}hhh期期期:::::: 1. ΢7端0服¡h 2. 查询缓X 3. (服¡h上进Lã析和优化v生成执L¡划 4. (X¨引Î-进L查询 5. 将结果返回给¢7端(增Ï、逐e返回的Ç程) 查询指标(记0b日志-):Í应时间(服¡时间、排序时间)、kÏLp、返回Lp 8 Chapter 2. 目目目UUU verdant-docs Documentation, 发发发布布布 0.1 图 2.3: 图:pn库查询处理A程(MySQL) 2.1. pppnnn库库库 9 verdant-docs Documentation, 发发发布布布 0.1 ···取取取调调调优优优信ááooo EXPLAIN/通Ç0¡得0的结果,而SHOW STATUS则/实E的统¡结果 STATUS & PROFILE SHOW STATUS返回一些¡ph结果(统¡y首WÍ'写,可以结合WHEREP句) 语句:SHOW STATUS LIKE ‘%xx%’; • Handler*变Ï(于统¡句ÄÍ\ Handler_read_rnd_next/"引ûÍ\的!p • Select_*变Ï/y定{型的 SELECT查询的¡ph • Com*变Ï统¡了ÏÍ{型的 SQL 或 CAPI }令发wÇ的!p。 FLUSH STATUS; /*请zSTATUS¡ph*/ /*gLSQL语句*/ SHOW STATUS WHERE Variable_name LIKE 'Handler%' OR Variable_name LIKE 'Created%'; /*·取上aSQL涉Ê的Í\*/ SHOW PROFILE和和和SHOW PROFILES可可可(((eee分分分析析析SSSMMM会会会话话话---语语语句句句gggLLL的的的DDD源源源消消消耗耗耗ÅÅÅ况况况 profilingÂp默¤/0,需K¨开/(select @@profiling;查询,set profiling=1;开/) SHOW PROFILES; /*列ú最近gL的多a语句*/ SHOW PROFILE FOR QUERY n; /*nù应SHOW PROFILES输ú-的Query_ID*/ /*可以指定wS的分析y:如cpu、source*/ _可以使(INFORMATION_SCHEMA.PROFILING进L定6化的查询 例:·取某条查询各A程的gL时间和!p SET @query_id=1; SELECT STATE, SUM(DURATION) AS Total_R, ROUND( 100 * SUM(DURATION)/ (SELECT SUM(DURATION) FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=@query_id ),2) AS Pct_R, COUNT(*) AS Calls, SUM(DURATION)/ COUNT( *) AS "R/Call" FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=@query_id GROUPBY STATE ORDERBY Total_R DESC; XXX¨¨¨引引引ÎÎÎ统统统¡¡¡áááooo SHOW ENGINE INNODB MUTEX; 返回 InnoDB 互¥S的详Æáo Ï个互¥S都保¤@ã码中一个临L: 10 Chapter 2. 目目目UUU verdant-docs Documentation, 发发发布布布 0.1 SHOW ENGINE INNODB STATUS; 输úInnoDB内è的¡ph、统¡、事¡处理áo • SEMAPHORES á号Ïøsáo • TRANSACTIONS 事事事¡¡¡øøøsssáááooo(((包包包+++锁锁锁的的的范范范围围围))) • FILE I/O >:I/O辅©¿程的¶态 • BUFFER POOL AND MEMORY 缓²`Ê内X统¡áo Buffer pool sizeUM/u • LATEST DETECTED DEADLOCK S服¡h内有{锁时ú现 SHOW TABLE STATUS; 查询h的相sáo 例:SHOW TABLE STATUS LIKE ‘user’ G(_可查询INFORMATION_SCHEMA) gggLLL¡¡¡划划划 Oracle-使(set autotrace on MySQL使(EXPLAIN 5.6以Mê能ùSELECT语句使(,5.6后能ùUPDATE、INSERT进LãÊ 无法·取触发h、X¨Ç程ù结果的qÍ id select_type table type possible_keys key key_len ref rows Extra select_type • SIMPLE:简U的select(¡有union和P查询) • PRIMARY:最外b的select((有P查询的语句-,最外b的select查询1/primary) • DERIVED:包+( FROMP句的P查询-的 SELECT • SUBQUERY:包+( SELECT列h-的P查询-的 SELECT(不( FROMP句-) • UNION:union语句的,二个或者说/后b£一agL语句 type • null:意s@ MySQL 能(优化6段分ã查询语旬,(gL6段不(再¿问h或者"引 • const:能ù查询的Ðè分进L优化v将vlb成一个8Ï • eq_ref:"引查~,最多ê返回一a&合a件的记U 通8"引/PRIMARY KEY或UNIQUE • ref:"引查~(查~和kÏ的Í合S),它返回@有9MÐ*<的L 称:ref/因:"引要跟Ð*Â考<ø比较 这*Â考<或者/一个8p,或者/eê多h查询M一个h里的结果< • index_merge:h:使(了"引合v优化¹法 • range:查询-使(0了范围<(有P6的"引kÏ) • index:{<all,d了ê有"引树«kÏ(使("引kÏZ的排序) • all:ù于Ï*eê于HM的h的LÄ合,进L完t的hkÏ Î}0O依!/: 2.1. pppnnn库库库 11 verdant-docs Documentation, 发发发布布布 0.1 system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all key:选é使(的"引 key_len:«选-使("引的"引键长¦ ref:使(ê*列或8p与key一wÎh-选éL 列ú/通Ç8Ïconst,还/Ð*h的Ð*W段(如果/JOIN)eÇ滤的 rows:>:MySQLgL查询的Lp(p<越'越不},说明¡有(}"引) Extra:::该该该列列列包包包+++MySQLããã³³³查查查询询询的的的详详详ÆÆÆáááooo • Using index ê使("引树-的áo而不需要进一e搜"û取实E的Le检"h-áo • Using whereh明会û取实E的Le进L检" • Using temporary为了ã³查询,MySQL需要创ú一个临时he¹纳结果 • Using filesort使(文件排序(排序的内¹比较多) EXPLAIN PARTITION 会>:查询将¿问的分: 可(eÂ察优化h/&gL了分:Ç滤(针ù分:h) EXPLAIN EXTENDED 会令服¡h”逆向编译”gL¡划为一个 SELECT语句 再gLSHOW WARNINGS可查Í构的查询 SELECT BENCHMARK(!p, h达式); SQL{型的h达式需(引号括we • ê简U0返回服¡hgLh达式的时间(不涉Ê分析和优化的开销) • 多!gL同7的h达式会因:û统缓X}-而qÍ结果 优优优化化化KKK段段段 优优优化化化范范范围围围查查查询询询 W段设n=Ï避M使(null • MySQL会:null<û加"引 • Oracle-is null、is not null不会/("引 以下Í\&可以应("引:<、<=、=、>、>=、BETWEEN、IN、LIKE 不以 % 或 _ 开4 以下Í\&不使("引:<>、NOT IN、LIKE % 或 _ 开4 =Ï避M使(OR(可以(UNIONã替) 优优优化化化MAX、、、MIN COUNT()、MIN()、MAX() • "引和列^z,通8可以.©MySQL优化这{h达式 例如:要~0Ð一列的最小/'<,ê需要查询(BTree"引最左端的记U,MySQL可以直¥ ·取"引一L记U。(优化h生成gL¡划的时候1可以)(这一¹,(B-Tree "引-,优 化h会将这*h达式\为一个8pù待。 • 如果WHEREP句¡有使(0"引可能涉ÊhhkÏ 12 Chapter 2. 目目目UUU verdant-docs Documentation, 发发发布布布 0.1 例: SELECT MIN(actor_id) FROM actor WHERE first_name= 'penelope'; /*优化:*/ SELECT actor_id FROM actor USE INDEX(PRIMARY) WHERE first_name= 'penelope' LIMIT 1; 优优优化化化排排排序序序和和和分分分uuu MySQL有有有$$$ÍÍÍ排排排序序序算算算法法法 1. H将需要排序的W段取ú,使(排序:排序后再取pn({¿问$!pn) 2. 一!'将@需的Columnhè取ú,排序后直¥返回(sfilesort) • 查询-@有需要的列和ORDER BY的列;'小超Çmax_length_for_sort_dataW节 • 使(了BLOB或者 TEXT(s使不(OREDR BYP句-) MySQL有有有$$$ÍÍ͹¹¹式式式可可可以以以生生生成成成有有有序序序的的的结结结果果果::: 1. 通Ç排序Í\:sOrder By 2. 按"引z序kÏ,使("引eù结果Z排序: • "引的列z序和 ORDER BYP句的z序完h一致 • 且@有列的排序¹向都一7(倒序或c序,_可以使(8Ï) ù于很'的h直¥使(LIMIT可能H率很N,9:使(延时sT(ê查;.Î而使("引),例: SELECT film_id, description FROM film ORDERBY title LIMIT 50,5; /*优化:*/ SELECT film.film_id, film.description FROM film INNER JOIN (SELECT film_id FROM film ORDERBY title LIMIT 50,5) AS lim USING(film_id); 切切切分分分查查查询询询 分y! dpnã替一!hè d row_affected = 0 do { row_affected = do_query( "DELETE