锘??xml version="1.0" encoding="utf-8" standalone="yes"?> www.bitsCN.com
use mysql
GRANT ALL PRIVILEGES ON *.* TO root@finapp IDENTIFIED BY "123"
grant all privieges on database.table to user@IpOrName identified by "password"
]]>
杞澆璇風暀鍚?br>
1. 綆浠?/strong>
鍦╓eb搴旂敤紼嬪簭浣撶郴鏋舵瀯涓紝鏁版嵁鎸佷箙灞傦紙閫氬父鏄竴涓叧緋繪暟鎹簱錛夋槸鍏抽敭鐨勬牳蹇冮儴鍒嗭紝瀹冨緋葷粺鐨勬ц兘鏈夐潪甯擱噸瑕佺殑褰卞搷銆侻ySQL鏄洰鍓嶄嬌鐢ㄦ渶澶氱殑寮婧愭暟鎹簱錛屼絾鏄疢ySQL鏁版嵁搴撶殑榛樿璁劇疆鎬ц兘闈炲父鐨勫樊錛屼粎浠呮槸涓涓帺鍏鋒暟鎹簱銆傚洜姝ゅ湪浜у搧涓嬌鐢∕ySQL鏁版嵁搴撳繀欏昏繘琛屽繀瑕佺殑浼樺寲銆?br>浼樺寲鏄竴涓鏉傜殑浠誨姟錛屾湰鏂囨弿榪癕ySQL鐩稿叧鐨勬暟鎹簱璁捐鍜屾煡璇紭鍖栵紝鏈嶅姟鍣ㄧ浼樺寲錛屽瓨鍌ㄥ紩鎿庝紭鍖栥?br>
2. 鏁版嵁搴撹璁″拰鏌ヨ浼樺寲
鍦∕ySQL Server鎬ц兘璋冧紭涓紝棣栧厛瑕佽冭檻鐨勫氨鏄疍atabase Schema璁捐錛岃繖涓鐐規槸闈炲父閲嶈鐨勩備竴涓碂緋曠殑Schema璁捐鍗充嬌鍦ㄦц兘璋冧紭鐨凪ySQL Server涓婅繍琛岋紝涔熶細琛ㄧ幇鍑哄緢宸殑鎬ц兘錛涘拰Schema鐩鎬技錛屾煡璇㈣鍙ョ殑璁捐涔熶細褰卞搷MySQL鐨勬ц兘錛屽簲璇ラ伩鍏嶅啓鍑轟綆鏁堢殑SQL鏌ヨ銆傝繖涓鑺傚皢璇︾粏璁ㄨ榪欎袱鏂歸潰鐨勪紭鍖栥?br>
2.1 Schema Design
Schema鐨勪紭鍖栧彇鍐充簬灝嗚榪愯浠涔堟牱鐨剄uery錛屼笉鍚岀殑query浼氭湁涓嶅悓鐨凷chema浼樺寲鏂規銆?.2鑺傚皢浠嬬粛Query Design鐨勪紭鍖栥係chema璁捐鍚屾牱鍙楀埌棰勬湡鏁版嵁闆嗗ぇ灝忕殑褰卞搷銆係chema璁捐鏃朵富瑕佽冭檻錛氭爣鍑嗗寲錛屾暟鎹被鍨嬶紝绱㈠紩銆?br>
2.1.1 鏍囧噯鍖?/font>
鏍囧噯鍖栨槸鍦ㄦ暟鎹簱涓粍緇囨暟鎹殑榪囩▼銆傚叾涓寘鎷紝鏍規嵁璁捐瑙勫垯鍒涘緩琛ㄥ茍鍦ㄨ繖浜涜〃闂村緩绔嬪叧緋伙紱閫氳繃鍙栨秷鍐椾綑搴︿笌涓嶄竴鑷寸浉鍏蟲э紝璇ヨ璁¤鍒欏彲浠ュ悓鏃朵繚鎶ゆ暟鎹茍鎻愰珮鏁版嵁鐨勭伒媧繪с傞氬父鏁版嵁搴撴爣鍑嗗寲鏄鏁版嵁搴撹璁$鍚堟煇涓綰у埆鐨勮寖寮忥紝閫氬父婊¤凍絎笁鑼冨紡鍗沖彲銆備篃鏈夌鍥涜寖寮忥紙涔熺О涓?Boyce Codd鑼冨紡錛孊CNF)錛変笌絎簲鑼冨紡瀛樺湪錛屼絾鏄湪瀹為檯璁捐涓緢灝戣冭檻銆傚拷瑙嗚繖浜涜鍒欏彲鑳戒嬌寰楁暟鎹簱鐨勮璁′笉澶畬緹庯紝浣嗚繖涓嶅簲褰卞搷鍔熻兘銆?br>鏍囧噯鍖栫殑鐗圭偣錛?br>
1) 鎵鏈夌殑“瀵硅薄”閮藉湪瀹冭嚜宸辯殑table涓紝娌℃湁鍐椾綑銆?br>2) 鏁版嵁搴撻氬父鐢盓-R鍥劇敓鎴愩?br>3) 綆媧侊紝鏇存柊灞炴ч氬父鍙渶瑕佹洿鏂板緢灝戠殑璁板綍銆?br>4) Join鎿嶄綔姣旇緝鑰楁椂銆?br>5) Select錛宻ort浼樺寲鎺柦姣旇緝灝戙?br>6) 閫傜敤浜嶰LTP搴旂敤銆?br>
闈炴爣鍑嗗寲鐨勭壒鐐癸細
1) 鍦ㄤ竴寮犺〃涓瓨鍌ㄥ緢澶氭暟鎹紝鏁版嵁鍐椾綑銆?br>2) 鏇存柊鏁版嵁寮閿寰堝ぇ錛屾洿鏂頒竴涓睘鎬у彲鑳戒細鏇存柊寰堝琛紝寰堝璁板綍銆?br>3) 鍦ㄥ垹闄ゆ暟鎹槸鏈夊彲鑳戒涪澶辨暟鎹?br>4) Select錛宱rder鏈夊緢澶氫紭鍖栫殑閫夋嫨銆?br>5) 閫傜敤浜嶥SS搴旂敤銆?br>
鏍囧噯鍖栧拰闈炴爣鍑嗗寲閮芥湁鍚勮嚜鐨勪紭緙虹偣錛岄氬父鍦ㄤ竴涓暟鎹簱璁捐涓彲浠ユ販鍚堜嬌鐢紝涓閮ㄥ垎琛ㄦ牸鏍囧噯鍖栵紝涓閮ㄥ垎琛ㄦ牸淇濈暀涓浜涘啑浣欐暟鎹細
1) 瀵筄LTP浣跨敤鏍囧噯鍖栵紝瀵笵SS浣跨敤闈炴爣鍑嗗寲
2.1.2 鏁版嵁綾誨瀷
2) 浣跨敤鐗╁寲瑙嗗浘銆侻ySQL涓嶇洿鎺ユ敮鎸佽鏁版嵁搴撶壒鎬э紝浣嗘槸鍙互鐢∕yISAM琛ㄤ唬鏇褲?br>3) 鍐椾綑涓浜涙暟鎹湪琛ㄦ牸涓紝渚嬪灝唕ef_id鍜宯ame瀛樺湪鍚屼竴寮犺〃涓備絾鏄娉ㄦ剰鏇存柊闂銆?br>4) 瀵逛簬涓浜涚畝鍗曠殑瀵硅薄錛岀洿鎺ヤ嬌鐢╲alue浣滀負寤恒備緥濡侷P address絳?br>5) Reference by PRIMARY/UNIQUE KEY銆侻ySQL鍙互浼樺寲榪欑鎿嶄綔錛屼緥濡傦細
鏈鍩烘湰鐨勪紭鍖栦箣涓灝辨槸浣胯〃鍦ㄧ鐩樹笂鍗犳嵁鐨勭┖闂村敖鍙兘灝忋傝繖鑳藉甫鏉ユц兘闈炲父澶х殑鎻愬崌錛屽洜涓烘暟鎹皬錛岀鐩樿鍏ヨ緝蹇紝騫朵笖鍦ㄦ煡璇㈣繃紼嬩腑琛ㄥ唴瀹硅澶勭悊鎵鍗犵敤鐨勫唴瀛樻洿灝戙傚悓鏃訛紝鍦ㄦ洿灝忕殑鍒椾笂寤虹儲寮曪紝绱㈠紩涔熶細鍗犵敤鏇村皯鐨勮祫婧愩?br>鍙互浣跨敤涓嬮潰鐨勬妧鏈彲浠ヤ嬌琛ㄧ殑鎬ц兘鏇村ソ騫朵笖浣垮瓨鍌ㄧ┖闂存渶灝忥細
1) 浣跨敤姝g‘鍚堥傜殑綾誨瀷錛屼笉瑕佸皢鏁板瓧瀛樺偍涓哄瓧絎︿覆銆?br>2) 灝藉彲鑳藉湴浣跨敤鏈鏈夋晥(鏈灝?鐨勬暟鎹被鍨嬨侻ySQL鏈夊緢澶氳妭鐪佺鐩樼┖闂村拰鍐呭瓨鐨勪笓涓氬寲綾誨瀷銆?br>3) 灝藉彲鑳戒嬌鐢ㄨ緝灝忕殑鏁存暟綾誨瀷浣胯〃鏇村皬銆備緥濡傦紝MEDIUMINT緇忓父姣擨NT濂戒竴浜涳紝鍥犱負MEDIUMINT鍒椾嬌鐢ㄧ殑絀洪棿瑕佸皯25%銆?br>4) 濡傛灉鍙兘錛屽0鏄庡垪涓篘OT NULL銆傚畠浣夸換浣曚簨鎯呮洿蹇屼笖姣忓垪鍙互鑺傜渷涓浣嶃傛敞鎰忓鏋滃湪搴旂敤紼嬪簭涓‘瀹為渶瑕丯ULL錛屽簲璇ユ鏃犵枒闂嬌鐢ㄥ畠錛屽彧鏄伩鍏?榛樿鍦板湪鎵鏈夊垪涓婃湁瀹冦?br>5) 瀵逛簬MyISAM琛紝濡傛灉娌℃湁浠諱綍鍙橀暱鍒?VARCHAR銆乀EXT鎴朆LOB鍒?錛屼嬌鐢ㄥ浐瀹氬昂瀵哥殑璁板綍鏍煎紡銆傝繖姣旇緝蹇絾鏄笉騫稿湴鍙兘浼氭氮璐逛竴浜涚┖闂淬傚嵆浣夸綘宸茬粡鐢–REATE閫夐」璁¬ARCHAR鍒?span class=hilite1>ROW_FORMAT=fixed錛屼篃鍙互鎻愮ず鎯充嬌鐢ㄥ浐瀹氶暱搴︾殑琛屻?br>6) 浣跨敤sample character set錛屼緥濡俵atin1銆傚敖閲忓皯浣跨敤utf-8錛屽洜涓簎tf-8鍗犵敤鐨勭┖闂存槸latin1鐨?鍊嶃傚彲浠ュ湪涓嶉渶瑕佷嬌鐢╱tf-8鐨勫瓧孌典笂闈嬌鐢╨atin1錛屼緥濡俶ail錛寀rl絳夈?br>
2.1.3 绱㈠紩
鎵鏈塎ySQL鍒楃被鍨嬪彲浠ヨ绱㈠紩銆傚鐩稿叧鍒椾嬌鐢ㄧ儲寮曟槸鎻愰珮SELECT鎿嶄綔鎬ц兘鐨勬渶浣抽斿緞銆備嬌鐢ㄧ儲寮曞簲璇ユ敞鎰忎互涓嬪嚑鐐癸細
1) MySQL鍙細浣跨敤鍓嶇紑錛屼緥濡俴ey(a, b) …where b=5 灝嗕嬌鐢ㄤ笉鍒扮儲寮曘?br>2) 瑕侀夋嫨鎬х殑浣跨敤绱㈠紩銆傚湪鍙樺寲寰堝皯鐨勫垪涓婁嬌鐢ㄧ儲寮曞茍涓嶆槸寰堝ソ錛屼緥濡傛у埆鍒椼?br>3) 鍦║nique鍒椾笂瀹氫箟Unique index銆?br>4) 閬垮厤寤虹珛浣跨敤涓嶅埌鐨勭儲寮曘?br>5) 鍦˙tree index涓紙InnoDB浣跨敤Btree錛夛紝鍙互鍦ㄩ渶瑕佹帓搴忕殑鍒椾笂寤虹珛绱㈠紩銆?br>6) 閬垮厤閲嶅鐨勭儲寮曘?br>7) 閬垮厤鍦ㄥ凡鏈夌儲寮曠殑鍓嶇紑涓婂緩绔嬬儲寮曘備緥濡傦細濡傛灉瀛樺湪index錛坅錛宐錛夊垯鍘繪帀index錛坅錛夈?br>8) 鎺у埗鍗曚釜绱㈠紩鐨勯暱搴︺備嬌鐢╧ey錛坣ame錛?錛夛級鍦ㄦ暟鎹殑鍓嶉潰鍑犱釜瀛楃寤虹珛绱㈠紩銆?br>9) 瓚婃槸鐭殑閿艱秺濂斤紝鏈濂戒嬌鐢╥nteger銆?br>10) 鍦ㄦ煡璇腑瑕佷嬌鐢ㄥ埌绱㈠紩錛堜嬌鐢╡xplain鏌ョ湅錛夛紝鍙互鍑忓皯璇葷鐩樼殑嬈℃暟錛屽姞閫熻鍙栨暟鎹?br>11) 鐩歌繎鐨勯敭鍊兼瘮闅忔満濂姐侫uto_increment灝辨瘮uuid濂姐?br>12) Optimize table鍙互鍘嬬緝鍜屾帓搴廼ndex錛屾敞鎰忎笉瑕侀綣佽繍琛屻?br>13) Analyze table鍙互鏇存柊鏁版嵁銆?br>
2.2 Designing queries
鏌ヨ璇彞鐨勪紭鍖栨槸涓涓狢ase by case鐨勯棶棰橈紝涓嶅悓鐨剆ql鏈変笉鍚岀殑浼樺寲鏂規錛屽湪榪欓噷鎴戝彧鍒楀嚭涓浜涢氱敤鐨勬妧宸с?br>
1) 鍦ㄦ湁index鐨勬儏鍐典笅錛屽敖閲忎繚璇佹煡璇嬌鐢ㄤ簡姝g‘鐨刬ndex銆傚彲浠ヤ嬌鐢‥XPLAIN select …鏌ョ湅緇撴灉錛屽垎鏋愭煡璇€?br>2) 鏌ヨ鏃朵嬌鐢ㄥ尮閰嶇殑綾誨瀷銆備緥濡俿elect * from a where id=5錛?濡傛灉榪欓噷id鏄瓧絎︾被鍨嬶紝鍚屾椂鏈塱ndex錛岃繖鏉℃煡璇㈠垯浣跨敤涓嶅埌index錛屼細鍋氬叏琛ㄦ壂鎻忥紝閫熷害浼氬緢鎱€傛紜殑搴旇鏄?… where id=”5” 錛屽姞涓婂紩鍙瘋〃鏄庣被鍨嬫槸瀛楃銆?br>3) 浣跨敤--log-slow-queries –long-query-time=2鏌ョ湅鏌ヨ姣旇緝鎱㈢殑璇彞銆傜劧鍚庝嬌鐢╡xplain鍒嗘瀽鏌ヨ錛屽仛鍑轟紭鍖栥?br>
3. 鏈嶅姟鍣ㄧ浼樺寲
3.1 MySQL瀹夎
MySQL鏈夊緢澶氬彂琛岀増鏈紝鏈濂戒嬌鐢∕ySQL AB鍙戝竷鐨勪簩榪涘埗鐗堟湰銆備篃鍙互涓嬭澆婧愪唬鐮佽繘琛岀紪璇戝畨瑁咃紝浣嗘槸緙栬瘧鍣ㄥ拰綾誨簱鐨勪竴浜沚ug鍙兘浼氫嬌緙栬瘧瀹屾垚鐨凪ySQL瀛樺湪娼滃湪鐨勯棶棰樸?br>濡傛灉瀹夎MySQL鐨勬湇鍔″櫒浣跨敤鐨勬槸Intel鍏徃鐨勫鐞嗗櫒錛屽彲浠ヤ嬌鐢╥ntel c++緙栬瘧鐨勭増鏈紝鍦↙inux World2005鐨勪竴綃嘝PT涓彁鍒幫紝浣跨敤intel C++緙栬瘧鍣ㄧ紪璇戠殑MySQL鏌ヨ閫熷害姣旀甯哥増鏈揩30%宸﹀彸銆侷ntel c++緙栬瘧鐗堟湰鍙互鍦∕ySQL瀹樻柟緗戠珯涓嬭澆銆?br>
3.2 鏈嶅姟鍣ㄨ緗紭鍖?/font>
MySQL榛樿鐨勮緗ц兘寰堝樊錛屾墍浠ヨ鍋氫竴浜涘弬鏁扮殑璋冩暣銆傝繖涓鑺備粙緇嶄竴浜涢氱敤鐨勫弬鏁拌皟鏁達紝涓嶆秹鍙婂叿浣撶殑瀛樺偍寮曟搸錛堜富瑕佹寚MyISAM錛孖nnoDB錛岀浉鍏充紭鍖栧湪4涓粙緇嶏級銆?br>
--character-set錛氬鏋滄槸鍗曚竴璇█浣跨敤綆鍗曠殑character set渚嬪latin1銆傚敖閲忓皯鐢║tf-8錛寀tf-8鍗犵敤絀洪棿杈冨銆?br>--memlock錛氶攣瀹歁ySQL鍙兘榪愯鍦ㄥ唴瀛樹腑錛岄伩鍏峴wapping錛屼絾鏄鏋滃唴瀛樹笉澶熸椂鏈夊彲鑳藉嚭鐜伴敊璇?br>--max_allowed_packet錛氳瓚沖澶э紝浠ラ傚簲姣旇緝澶х殑SQL鏌ヨ錛屽鎬ц兘娌℃湁澶ぇ褰卞搷錛屼富瑕佹槸閬垮厤鍑虹幇packet閿欒銆?br>--max_connections錛歴erver鍏佽鐨勬渶澶ц繛鎺ャ傚お澶х殑璇濅細鍑虹幇out of memory銆?br>--table_cache錛歁ySQL鍦ㄥ悓涓鏃墮棿淇濇寔鎵撳紑鐨則able鐨勬暟閲忋傛墦寮table寮閿姣旇緝澶с備竴鑸緗負512銆?br>--query_cache_size錛?鐢ㄤ簬緙撳瓨鏌ヨ鐨勫唴瀛樺ぇ灝忋?br>--datadir錛歮ysql瀛樻斁鏁版嵁鐨勬牴鐩綍錛屽拰瀹夎鏂囦歡鍒嗗紑鍦ㄤ笉鍚岀殑紓佺洏鍙互鎻愰珮涓鐐規ц兘銆?br>
4. 瀛樺偍寮曟搸浼樺寲
MySQL鏀寔涓嶅悓鐨勫瓨鍌ㄥ紩鎿庯紝涓昏浣跨敤鐨勬湁MyISAM鍜孖nnoDB銆?br>
4.1 MyISAM
MyISAM綆$悊闈炰簨鍔¤〃銆傚畠鎻愪緵楂橀熷瓨鍌ㄥ拰媯绱紝浠ュ強鍏ㄦ枃鎼滅儲鑳藉姏銆侻yISAM鍦ㄦ墍鏈塎ySQL閰嶇疆閲岃鏀寔錛屽畠鏄粯璁ょ殑瀛樺偍寮曟搸錛岄櫎闈為厤緗甅ySQL榛樿浣跨敤鍙﹀涓涓紩鎿庛?br>
4.1.1 MyISAM鐗規?/font>
4.1.1.1 MyISAM Properties
1) 涓嶆敮鎸佷簨鍔★紝瀹曟満浼氱牬鍧忚〃
4.1.1.2 Typical MyISAM usages
2) 浣跨敤杈冨皬鐨勫唴瀛樺拰紓佺洏絀洪棿
3) 鍩轟簬琛ㄧ殑閿侊紝騫跺彂鏇存柊鏁版嵁浼氬嚭鐜頒弗閲嶆ц兘闂
4) MySQL鍙紦瀛業ndex錛屾暟鎹敱OS緙撳瓨
1) 鏃ュ織緋葷粺
4.1.2 MyISAM浼樺寲瑕佺偣
2) 鍙鎴栬呯粷澶ч儴鍒嗘槸璇繪搷浣滅殑搴旂敤
3) 鍏ㄨ〃鎵弿
4) 鎵歸噺瀵煎叆鏁版嵁
5) 娌℃湁浜嬪姟鐨勪綆騫跺彂璇?鍐?br>
1) 澹版槑鍒椾負NOT NULL錛屽彲浠ュ噺灝戠鐩樺瓨鍌ㄣ?br>2) 浣跨敤optimize table鍋氱鐗囨暣鐞嗭紝鍥炴敹絀洪棽絀洪棿銆傛敞鎰忎粎浠呭湪闈炲父澶х殑鏁版嵁鍙樺寲鍚庤繍琛屻?br>3) Deleting/updating/adding澶ч噺鏁版嵁鐨勬椂鍊欑姝嬌鐢╥ndex銆備嬌鐢ˋLTER TABLE t DISABLE KEYS銆?br>4) 璁劇疆myisam_max_[extra]_sort_file_size瓚沖澶э紝鍙互鏄捐憲鎻愰珮repair table鐨勯熷害銆?br>
4.1.3 MyISAM Table Locks
1) 閬垮厤騫跺彂insert錛寀pdate銆?br>2) 鍙互浣跨敤insert delayed錛屼絾鏄湁鍙兘涓㈠け鏁版嵁銆?br>3) 浼樺寲鏌ヨ璇彞銆?br>4) 姘村鉤鍒嗗尯銆?br>5) 鍨傜洿鍒嗗尯銆?br>6) 濡傛灉閮戒笉璧蜂綔鐢紝浣跨敤InnoDB銆?br>
4.1.4 MyISAM Key Cache
1) 璁劇疆key_buffer_size variable銆侻yISAN鏈涓昏鐨刢ache璁劇疆錛岀敤浜庣紦瀛楳yISAM琛ㄦ牸鐨刬ndex鏁版嵁錛岃鍙傛暟鍙MyISAM鏈夊獎鍝嶃傞氬父鍦ㄥ彧浣跨敤MyISAM鐨凷erver涓緗?5-33%鐨勫唴瀛樺ぇ灝忋?br>2) 鍙互浣跨敤鍑犱釜涓嶅悓鐨凨ey Caches錛堝涓浜沨ot data錛夈?br>
a) SET GLOBAL test.key_buffer_size=512*1024;
2) Preload index鍒癈ache涓彲浠ユ彁楂樻煡璇㈤熷害銆傚洜涓簆reloading index鏄『搴忕殑錛屾墍浠ラ潪甯稿揩銆?br>
b) CACHE INDEX t1.i1, t2.i1, t3 IN test;a) LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVES錛?br>
4.2 InnoDB
InnoDB緇橫ySQL鎻愪緵浜嗗叿鏈夋彁浜わ紝鍥炴粴鍜屽穿婧冩仮澶嶈兘鍔涚殑浜嬪姟瀹夊叏錛圓CID鍏煎錛夊瓨鍌ㄥ紩鎿庛侷nnoDB鎻愪緵row level lock錛屽茍涓斾篃鍦⊿ELECT璇彞鎻愪緵涓涓狾racle椋庢牸涓鑷寸殑闈為攣瀹氳銆傝繖浜涚壒鑹插鍔犱簡澶氱敤鎴烽儴緗插拰鎬ц兘銆傛病鏈夊湪InnoDB涓墿澶ч攣瀹氱殑闇瑕侊紝鍥犱負鍦↖nnoDB涓璻ow level lock閫傚悎闈炲父灝忕殑絀洪棿銆侷nnoDB涔熸敮鎸丗OREIGN KEY綰︽潫銆傚湪SQL鏌ヨ涓紝浣犲彲浠ヨ嚜鐢卞湴灝咺nnoDB綾誨瀷鐨勮〃涓庡叾瀹僊ySQL鐨勮〃鐨勭被鍨嬫販鍚堣搗鏉ワ紝鐢氳嚦鍦ㄥ悓涓涓煡璇腑涔熷彲浠ユ販鍚堛?br>InnoDB鏄負鍦ㄥ鐞嗗法澶ф暟鎹噺鏃惰幏寰楁渶澶фц兘鑰岃璁$殑銆傚畠鐨凜PU浣跨敤鏁堢巼闈炲父楂樸?br>InnoDB瀛樺偍寮曟搸宸茬粡瀹屽叏涓嶮ySQL鏈嶅姟鍣ㄦ暣鍚堬紝InnoDB瀛樺偍寮曟搸涓哄湪鍐呭瓨涓紦瀛樻暟鎹拰绱㈠紩鑰岀淮鎸佸畠鑷繁鐨勭紦鍐叉睜銆?InnoDB瀛樺偍瀹冪殑琛紗绱㈠紩鍦ㄤ竴涓〃絀洪棿涓紝琛ㄧ┖闂村彲浠ュ寘鍚暟涓枃浠訛紙鎴栧師濮嬬鐩樺垎鍖猴級銆傝繖涓嶮yISAM琛ㄤ笉鍚岋紝姣斿鍦∕yISAM琛ㄤ腑姣忎釜琛ㄨ瀛樺湪鍒嗙鐨勬枃浠朵腑銆侷nnoDB 琛ㄥ彲浠ユ槸浠諱綍澶у皬錛屽嵆浣垮湪鏂囦歡灝哄琚檺鍒朵負2GB鐨勬搷浣滅郴緇熶笂銆?br>璁稿闇瑕侀珮鎬ц兘鐨勫ぇ鍨嬫暟鎹簱绔欑偣涓婁嬌鐢ㄤ簡InnoDB寮曟搸銆傝憲鍚嶇殑Internet鏂伴椈绔欑偣Slashdot.org榪愯鍦↖nnoDB涓娿?Mytrix, Inc.鍦↖nnoDB涓婂瓨鍌ㄨ秴榪?TB鐨勬暟鎹紝榪樻湁涓浜涘叾瀹冪珯鐐瑰湪InnoDB涓婂鐞嗗鉤鍧囨瘡縐?00嬈℃彃鍏?鏇存柊鐨勮礋鑽楓?br>4.2.1 InnoDB鐗規?/font>
4.2.1.1 InnoDB Properties
1) 鏀寔浜嬪姟錛孉CID錛屽閿?br>2) Row level locks銆?
4.2.1.2 InnoDB Good For
3) 鏀寔涓嶅悓鐨勯殧紱葷駭鍒?br>4) 鍜孧yISAM鐩告瘮闇瑕佽緝澶氱殑鍐呭瓨鍜岀鐩樼┖闂淬?br>5) 娌℃湁閿帇緙┿?br>6) 鏁版嵁鍜岀儲寮曢兘緙撳瓨鍦ㄥ唴瀛榟ash琛ㄤ腑銆?br>
1) 闇瑕佷簨鍔$殑搴旂敤銆?br>2) 楂樺茍鍙戠殑搴旂敤銆?br>3) 鑷姩鎭㈠銆?br>4) 杈冨揩閫熺殑鍩轟簬涓婚敭鐨勬搷浣溿?br>
4.2.2 InnoDB浼樺寲瑕佺偣
1) 灝介噺浣跨敤short錛宨nteger鐨勪富閿?br>2) Load/Insert鏁版嵁鏃舵寜涓婚敭欏哄簭銆傚鏋滄暟鎹病鏈夋寜涓婚敭鎺掑簭錛屽厛鎺掑簭鐒跺悗鍐嶈繘琛屾暟鎹簱鎿嶄綔銆?br>3) 鍦↙oad鏁版嵁鏄負璁劇疆SET UNIQUE_CHECKS=0錛孲ET FOREIGN_KEY_CHECKS=0錛屽彲浠ラ伩鍏嶅閿拰鍞竴鎬х害鏉熸鏌ョ殑寮閿銆?br>4) 浣跨敤prefix keys銆傚洜涓篒nnoDB娌℃湁key鍘嬬緝鍔熻兘銆?br>
4.2.3 InnoDB鏈嶅姟鍣ㄧ璁懼畾
innodb_buffer_pool_size錛氳繖鏄疘nnoDB鏈閲嶈鐨勮緗紝瀵笽nnoDB鎬ц兘鏈夊喅瀹氭х殑褰卞搷銆傞粯璁ょ殑璁劇疆鍙湁8M錛屾墍浠ラ粯璁ょ殑鏁版嵁搴撹緗笅闈nnoDB鎬ц兘寰堝樊銆傚湪鍙湁InnoDB瀛樺偍寮曟搸鐨勬暟鎹簱鏈嶅姟鍣ㄤ笂闈紝鍙互璁劇疆60-80%鐨勫唴瀛樸傛洿綺劇‘涓鐐癸紝鍦ㄥ唴瀛樺閲忓厑璁哥殑鎯呭喌涓嬮潰璁劇疆姣擨nnoDB tablespaces澶?0%鐨勫唴瀛樺ぇ灝忋?br>
5. 緙撳瓨
innodb_data_file_path錛氭寚瀹氳〃鏁版嵁鍜岀儲寮曞瓨鍌ㄧ殑絀洪棿錛屽彲浠ユ槸涓涓垨鑰呭涓枃浠躲傛渶鍚庝竴涓暟鎹枃浠跺繀欏繪槸鑷姩鎵╁厖鐨勶紝涔熷彧鏈夋渶鍚庝竴涓枃浠跺厑璁歌嚜鍔ㄦ墿鍏呫傝繖鏍鳳紝褰撶┖闂寸敤瀹屽悗錛岃嚜鍔ㄦ墿鍏呮暟鎹枃浠跺氨浼氳嚜鍔ㄥ闀匡紙浠?MB涓哄崟浣嶏級浠ュ綰抽澶栫殑鏁版嵁銆備緥濡傦細 innodb_data_file_path=/disk1/ibdata1:900M;/disk2/ibdata2:50M:autoextend涓や釜鏁版嵁鏂囦歡鏀懼湪涓嶅悓鐨勭鐩樹笂銆傛暟鎹鍏堟斁鍦╥bdata1涓紝褰撹揪鍒?00M浠ュ悗錛屾暟鎹氨鏀懼湪ibdata2涓備竴鏃﹁揪鍒?0MB錛宨bdata2灝嗕互8MB涓哄崟浣嶈嚜鍔ㄥ闀褲傚鏋滅鐩樻弧浜嗭紝闇瑕佸湪鍙﹀鐨勭鐩樹笂闈㈠鍔犱竴涓暟鎹枃浠躲?br>
innodb_data_home_dir錛氭斁緗〃絀洪棿鏁版嵁鐨勭洰褰曪紝榛樿鍦╩ysql鐨勬暟鎹洰褰曪紝璁劇疆鍒板拰MySQL瀹夎鏂囦歡涓嶅悓鐨勫垎鍖哄彲浠ユ彁楂樻ц兘銆?br>
innodb_log_file_size錛氳鍙傛暟鍐沖畾浜唕ecovery speed銆傚お澶х殑璇漴ecovery灝變細姣旇緝鎱紝澶皬浜嗗獎鍝嶆煡璇㈡ц兘錛屼竴鑸彇256M鍙互鍏奸【鎬ц兘鍜宺ecovery鐨勯熷害
銆?br>innodb_log_buffer_size錛氱鐩橀熷害鏄緢鎱㈢殑錛岀洿鎺ュ皢log鍐欓亾紓佺洏浼氬獎鍝岻nnoDB鐨勬ц兘錛岃鍙傛暟璁懼畾浜唋og buffer鐨勫ぇ灝忥紝涓鑸?M銆傚鏋滄湁澶х殑blob鎿嶄綔錛屽彲浠ラ傚綋澧炲ぇ銆?br>
innodb_flush_logs_at_trx_commit=2錛?璇ュ弬鏁拌瀹氫簡浜嬪姟鎻愪氦鏃跺唴瀛樹腑log淇℃伅鐨勫鐞嗐?br>
1) =1鏃訛紝鍦ㄦ瘡涓簨鍔℃彁浜ゆ椂錛屾棩蹇楃紦鍐茶鍐欏埌鏃ュ織鏂囦歡錛屽鏃ュ織鏂囦歡鍋氬埌紓佺洏鎿嶄綔鐨勫埛鏂般俆ruly ACID銆傞熷害鎱€?br>2) =2鏃訛紝鍦ㄦ瘡涓簨鍔℃彁浜ゆ椂錛屾棩蹇楃紦鍐茶鍐欏埌鏂囦歡錛屼絾涓嶅鏃ュ織鏂囦歡鍋氬埌紓佺洏鎿嶄綔鐨勫埛鏂般傚彧鏈夋搷浣滅郴緇熷穿婧冩垨鎺夌數鎵嶄細鍒犻櫎鏈鍚庝竴縐掔殑浜嬪姟錛屼笉鐒朵笉浼氫涪澶變簨鍔°?br>3) =0鏃訛紝 鏃ュ織緙撳啿姣忕涓嬈″湴琚啓鍒版棩蹇楁枃浠訛紝騫朵笖瀵規棩蹇楁枃浠跺仛鍒扮鐩樻搷浣滅殑鍒鋒柊銆備換浣昺ysqld榪涚▼鐨勫穿婧冧細鍒犻櫎宕╂簝鍓嶆渶鍚庝竴縐掔殑浜嬪姟
innodb_file_per_table錛氬彲浠ュ瓨鍌ㄦ瘡涓狪nnoDB琛ㄥ拰瀹冪殑绱㈠紩鍦ㄥ畠鑷繁鐨勬枃浠朵腑銆?br>
transaction-isolation=READ-COMITTED: 濡傛灉搴旂敤紼嬪簭鍙互榪愯鍦≧EAD-COMMITED闅旂綰у埆錛屽仛姝よ瀹氫細鏈変竴瀹氱殑鎬ц兘鎻愬崌銆?br>
innodb_flush_method錛?璁劇疆InnoDB鍚屾IO鐨勬柟寮忥細
1) Default – 浣跨敤fsync錛堬級銆?br>2) O_SYNC 浠ync妯″紡鎵撳紑鏂囦歡錛岄氬父姣旇緝鎱€?br>3) O_DIRECT錛屽湪Linux涓婁嬌鐢―irect IO銆傚彲浠ユ樉钁楁彁楂橀熷害錛岀壒鍒槸鍦≧AID緋葷粺涓娿傞伩鍏嶉澶栫殑鏁版嵁澶嶅埗鍜宒ouble buffering錛坢ysql buffering 鍜孫S buffering錛夈?br>
innodb_thread_concurrency錛?InnoDB kernel鏈澶х殑綰跨▼鏁般?br>
1) 鏈灝戣緗負(num_disks+num_cpus)*2銆?br>2) 鍙互閫氳繃璁劇疆鎴?000鏉ョ姝㈣繖涓檺鍒?br>
緙撳瓨鏈夊緢澶氱錛屼負搴旂敤紼嬪簭鍔犱笂閫傚綋鐨勭紦瀛樼瓥鐣ヤ細鏄捐憲鎻愰珮搴旂敤紼嬪簭鐨勬ц兘銆傜敱浜庡簲鐢ㄧ紦瀛樻槸涓涓瘮杈冨ぇ鐨勮瘽棰橈紝鎵浠ヨ繖涓閮ㄥ垎榪橀渶瑕佽繘涓姝ヨ皟鐮斻?
6. Reference
1) http://www.mysqlperformanceblog.com/
2) Advanced MySQL Performance Optimization, Peter Zaitsev, Tobias Asplund, MySQL Users Conference 2005
3) Improving MySQL Server Performance with Intel C++ Compiler錛孭eter Zaitsev錛孡inux World 2005
4) MySQL Performance Optimization, Peter Zaitsev, Percona Ltd, OPEN SOURCE DATABASE CONFERENCE 2006
5) MySQL Server Settings Tuning, Peter Zaitsev, co-founder, Percona Ltd, 2007
6) MySQL Reference Manual
]]>
緙栬瘧HelloWorld綾?br>
2 public native void displayHelloWorld();
3
4 public native void printxx(String str);
5
6 static {
7 System.loadLibrary("hello");
8 // System.load("hello");
9 }
10
11 public static void main(String[] args) {
12 HelloWorld hw = new HelloWorld();
13 hw.displayHelloWorld();
14 for (int i = 0;; ++i) {
15 hw
16 .printxx("wo kaowo kaowo kaowo kaowo kaowo kaowo kaowo kaowo kaowo kaowo kao");
17 if (i % 1000 == 0) {
18 try {
19 Thread.sleep(10);
20 } catch (InterruptedException e) {
21 }
22 }
23 }
24 }
25 }
瀵圭紪璇戝畬鐨刢lass鎵ц
javah HelloWorld
2 #include <jni.h>
3 /* Header for class HelloWorld */
4
5 #ifndef _Included_HelloWorld
6 #define _Included_HelloWorld
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 /*
11 * Class: HelloWorld
12 * Method: displayHelloWorld
13 * Signature: ()V
14 */
15 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
16 (JNIEnv *, jobject);
17
18 /*
19 * Class: HelloWorld
20 * Method: printxx
21 * Signature: (Ljava/lang/String;)V
22 */
23 JNIEXPORT void JNICALL Java_HelloWorld_printxx
24 (JNIEnv *, jobject, jstring);
25
26 #ifdef __cplusplus
27 }
28 #endif
29 #endif
30
緙栬瘧
cl -I%java_home%\include -I%java_home%\include\win32 -LDHelloWorld.c -Fehello.dll
2 #include "HelloWorld.h"
3 #include <stdio.h>
4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
5 {
6 printf("Hello world!\n");
7 return;
8 }
9
10 JNIEXPORT void JNICALL Java_HelloWorld_printxx
11 (JNIEnv *env, jobject obj, jstring prompt){
12
13 const char *str = (*env)->GetStringUTFChars(env, prompt, 0);
14 printf("%s",prompt);
15 (*env)->ReleaseStringUTFChars(env, prompt, str);
16
17 return;
18 }
19
20
3錛嶫ava綾誨瀷鍜屾湰鍦扮被鍨嬪搴?br>銆銆
銆銆鍦ㄥ涓嬫儏鍐典笅錛岄渶瑕佸湪鏈湴鏂規硶涓簲鐢╦ava瀵硅薄鐨勫紩鐢紝灝變細鐢ㄥ埌綾誨瀷涔嬮棿鐨勮漿鎹細
銆銆
銆銆1錛塲ava鏂規硶閲岄潰灝嗗弬鏁頒紶鍏ユ湰鍦版柟娉曪紱
銆銆
銆銆2錛夊湪鏈湴鏂規硶閲岄潰鍒涘緩java瀵硅薄錛?br>銆銆
銆銆3錛夊湪鏈湴鏂規硶閲岄潰return緇撴灉緇檍ava紼嬪簭銆?br>銆銆
銆銆鍒嗕負濡備笅涓ょ鎯呭喌錛?br>銆銆
銆銆Java鍘熷綾誨瀷
銆銆
銆銆鍍廱ooleans銆乮ntegers銆乫loats絳変粠Java紼嬪簭涓紶鍒版湰鍦版柟娉曚腑鐨勫師濮嬬被鍨嬪彲浠ョ洿鎺ヤ嬌鐢紝涓嬮潰鏄痡ava涓殑鍘熷綾誨瀷鍜屾湰鍦版柟娉曚腑鐨勭被鍨嬬殑瀵瑰簲錛?br>銆銆
銆銆Java綾誨瀷銆銆鏈湴綾誨瀷銆銆瀛楄妭(bit)
銆銆
銆銆boolean銆銆 jboolean銆銆 8, unsigned
銆銆byte銆銆銆銆jbyte銆銆銆銆8
銆銆char銆銆銆銆jchar銆銆銆銆16, unsigned
銆銆short銆銆銆 jshort銆銆銆 16
銆銆int銆銆銆銆 jint銆銆銆銆 32
銆銆long銆銆銆銆jlong銆銆銆銆64
銆銆float銆銆銆 jfloat銆銆銆 32
銆銆double銆銆銆jdouble銆銆銆64
銆銆void銆銆銆銆void銆銆銆銆 n/a
銆銆
銆銆涔熷氨鏄濡傛灉鎴戝湪鏂規硶涓紶榪涘幓浜嗕竴涓猙oolean鐨勫弬鏁扮殑璇濓紝閭d箞鎴戝湪鏈湴鏂規硶涓氨鏈塲boolean綾誨瀷涓庝箣瀵瑰簲銆傚悓鐞嗭紝濡傛灉鍦ㄦ湰鍦版柟娉曚腑return涓涓猨int鐨勮瘽錛岄偅涔堝湪java涓氨榪斿洖涓涓猧nt綾誨瀷銆?涓浗緗戠璁哄潧
銆銆
銆銆Java瀵硅薄
銆銆
銆銆Java瀵硅薄鍋氫負寮曠敤琚紶閫掑埌鏈湴鏂規硶涓紝鎵鏈夎繖浜汮ava瀵硅薄鐨勫紩鐢ㄩ兘鏈変竴涓叡鍚岀殑鐖剁被鍨媕object(鐩稿綋浜巎ava涓殑Object綾繪槸鎵鏈夌被鐨勭埗綾諱竴鏍?銆備笅闈㈡槸JNI瀹炵幇鐨勪竴浜沯object鐨勫瓙綾伙細
銆銆
銆銆4錛庢湰鍦版柟娉曚腑璁塊棶java紼嬪簭涓殑鍐呭
銆銆
銆銆1)璁塊棶String瀵硅薄錛?br>銆銆
銆銆浠巎ava紼嬪簭涓紶榪囧幓鐨凷tring瀵硅薄鍦ㄦ湰鍦版柟娉曚腑瀵瑰簲鐨勬槸jstring綾誨瀷錛宩string綾誨瀷鍜宑涓殑char*涓嶅悓錛屾墍浠ュ鏋滀綘鐩存帴褰撳仛char*浣跨敤鐨勮瘽錛屽氨浼氬嚭閿欍傚洜姝ゅ湪浣跨敤涔嬪墠闇瑕佸皢jstring杞崲鎴愪負c/c++涓殑char*錛岃繖閲屼嬌鐢↗NIEnv鐨勬柟娉曡漿鎹€備笅闈㈡槸涓涓緥瀛愶細
銆銆
銆銆浠g爜3錛?br>銆銆
銆銆JNIEXPORT jstring JNICALL Java_Prompt_getLine
銆銆(JNIEnv *env, jobject obj, jstring prompt)
銆銆{
銆銆char buf[128];
銆銆const char *str = (*env)->GetStringUTFChars(env, prompt, 0);
銆銆printf("%s", str);
銆銆(*env)->ReleaseStringUTFChars(env, prompt, str);
銆銆
銆銆榪欓噷浣跨敤GetStringUTFChars鏂規硶灝嗕紶榪涙潵鐨刾rompt錛坖string綾誨瀷錛夎漿鎹㈡垚涓篣TF錛?鐨勬牸寮忥紝灝辮兘澶熷湪鏈湴鏂規硶涓嬌鐢ㄤ簡銆?br>銆銆
銆銆娉ㄦ剰錛氬湪浣跨敤瀹屼綘鎵杞崲涔嬪悗鐨勫璞′箣鍚庯紝闇瑕佹樉紺鴻皟鐢≧eleaseStringUTFChars鏂規硶錛岃JVM閲婃斁杞崲鎴怳TF-8鐨剆tring鐨勫璞$殑絀洪棿錛屽鏋滀笉鏄劇ず鐨勮皟鐢ㄧ殑璇濓紝JVM涓細涓鐩翠繚瀛樿瀵硅薄錛屼笉浼氳鍨冨溇鍥炴敹鍣ㄥ洖鏀訛紝鍥犳灝變細瀵艱嚧鍐呭瓨婧㈠嚭銆?
銆銆
銆銆涓嬮潰鏄闂甋tring鐨勪竴浜涙柟娉曪細
銆銆
銆銆鈼咷etStringUTFChars灝唈string杞崲鎴愪負UTF-8鏍煎紡鐨刢har*
銆銆
銆銆鈼咷etStringChars灝唈string杞崲鎴愪負Unicode鏍煎紡鐨刢har*
銆銆
銆銆鈼哛eleaseStringUTFChars閲婃斁鎸囧悜UTF-8鏍煎紡鐨刢har*鐨勬寚閽?br>銆銆
銆銆鈼哛eleaseStringChars閲婃斁鎸囧悜Unicode鏍煎紡鐨刢har*鐨勬寚閽?br>銆銆
銆銆鈼哊ewStringUTF鍒涘緩涓涓猆TF-8鏍煎紡鐨凷tring瀵硅薄
銆銆
銆銆鈼哊ewString鍒涘緩涓涓猆nicode鏍煎紡鐨凷tring瀵硅薄
銆銆
銆銆鈼咷etStringUTFLengt鑾峰彇UTF-8鏍煎紡鐨刢har*鐨勯暱搴?br>銆銆
銆銆鈼咷etStringLength鑾峰彇Unicode鏍煎紡鐨刢har*鐨勯暱搴?br>銆銆
銆銆2) 璁塊棶Array瀵硅薄錛?br>銆銆
銆銆鍜孲tring瀵硅薄涓鏍鳳紝鍦ㄦ湰鍦版柟娉曚腑涓嶈兘鐩存帴璁塊棶jarray瀵硅薄錛岃屾槸浣跨敤JNIEnv鎸囬拡鎸囧悜鐨勪竴浜涙柟娉曟潵鏄敤銆?br>銆銆
銆銆璁塊棶Java鍘熷綾誨瀷鏁扮粍錛?br>銆銆
銆銆1錛夎幏鍙栨暟緇勭殑闀垮害錛?br>銆銆
銆銆浠g爜4錛?br>銆銆
銆銆JNIEXPORT jint JNICALL Java_IntArray_sumArray
銆銆(JNIEnv *env, jobject obj, jintArray arr)
銆銆{
銆銆int i, sum = 0;
銆銆jsize len = (*env)->GetArrayLength(env, arr);
銆銆
銆銆濡備唬鐮?鎵紺猴紝榪欓噷鑾峰彇鏁扮粍鐨勯暱搴﹀拰鏅氱殑c璇█涓殑鑾峰彇鏁扮粍闀垮害涓嶄竴鏍鳳紝榪欓噷浣跨敤JNIEvn鐨勪竴涓嚱鏁癎etArrayLength銆?
銆銆
銆銆2錛夎幏鍙栦竴涓寚鍚戞暟緇勫厓绱犵殑鎸囬拡錛?br>銆銆
銆銆浠g爜4錛?br>銆銆
銆銆jint *body = (*env)->GetIntArrayElements(env, arr, 0);
銆銆
銆銆浣跨敤GetIntArrayElements鏂規硶鑾峰彇鎸囧悜arr鏁扮粍鍏冪礌鐨勬寚閽堬紝娉ㄦ剰璇ュ嚱鏁扮殑鍙傛暟錛岀涓涓槸JNIEnv錛岀浜屼釜鏄暟緇勶紝絎笁涓槸鏁扮粍閲岄潰絎笁涓槸鏁扮粍閲岄潰寮濮嬬殑鍏冪礌
銆銆
銆銆3錛変嬌鐢ㄦ寚閽堝彇鍑篈rray涓殑鍏冪礌
銆銆
銆銆浠g爜5錛?br>銆銆
銆銆for (i=0; i<len; i++) {
銆銆sum += body[i];
銆銆}
銆銆
銆銆榪欓噷浣跨敤灝卞拰鏅氱殑c涓殑鏁扮粍浣跨敤娌℃湁浠涔堜笉鍚屼簡
銆銆
銆銆4錛夐噴鏀炬暟緇勫厓绱犵殑寮曠敤
銆銆
銆銆浠g爜6錛?br>銆銆
銆銆(*env)->ReleaseIntArrayElements(env, arr, body, 0);
銆銆
銆銆鍜屾搷浣淪tring涓殑閲婃斁String鐨勫紩鐢ㄦ槸涓鏍風殑錛屾彁閱扟VM鍥炴敹arr鏁扮粍鍏冪礌鐨勫紩鐢ㄣ?br>銆銆
銆銆榪欓噷涓劇殑渚嬪瓙鏄嬌鐢╥nt鏁扮粍鐨勶紝鍚屾牱榪樻湁boolean銆乫loat絳夊搴旂殑鏁扮粍銆?br>銆銆
銆銆鑾峰彇鏁扮粍鍏冪礌鎸囬拡鐨勫搴斿叧緋伙細
銆銆
銆銆鍑芥暟銆銆銆銆銆銆銆銆銆銆銆銆鏁扮粍綾誨瀷
銆銆
銆銆GetBooleanArrayElements銆銆 boolean
銆銆GetByteArrayElements銆銆銆銆byte
銆銆GetCharArrayElements銆銆銆銆char bitsCN.nET涓浗緗戠鍗氬
銆銆GetShortArrayElements銆銆銆 short
銆銆GetIntArrayElements銆銆銆銆 int
銆銆GetLongArrayElements銆銆銆銆long
銆銆GetFloatArrayElements銆銆銆 float
銆銆GetDoubleArrayElements銆銆銆double
銆銆
銆銆閲婃斁鏁扮粍鍏冪礌鎸囬拡鐨勫搴斿叧緋伙細
銆銆Function銆銆銆銆銆銆銆銆銆銆銆銆Array Type
銆銆ReleaseBooleanArrayElements銆銆 boolean
銆銆ReleaseByteArrayElements銆銆銆銆byte
銆銆ReleaseCharArrayElements銆銆銆銆char
銆銆ReleaseShortArrayElements銆銆銆 short
銆銆ReleaseIntArrayElements銆銆銆銆 int
銆銆ReleaseLongArrayElements銆銆銆銆long
銆銆ReleaseFloatArrayElements銆銆銆 float
銆銆ReleaseDoubleArrayElements銆銆銆double
銆銆
銆銆璁塊棶鑷畾涔塉ava瀵硅薄鏁扮粍
銆銆
銆銆The JNI provides a separate set of functions to access elements of object arrays. You can use these functions to get and set individual object array elements.
銆銆
銆銆Note:銆You cannot get all the object array elements at once.
銆銆
銆銆GetObjectArrayElement returns the object element at a given index.
銆銆
銆銆SetObjectArrayElement updates the object element at a given index.
銆銆
銆銆3) 璁塊棶Java瀵硅薄鐨勬柟娉曪細
銆銆
銆銆鍦ㄦ湰鍦版柟娉曚腑璋冪敤Java瀵硅薄鐨勬柟娉曠殑姝ラ錛?br>銆銆
銆銆鈶?鑾峰彇浣犻渶瑕佽闂殑Java瀵硅薄鐨勭被錛?br>銆銆
銆銆jclass cls = (*env)->GetObjectClass(env, obj);
銆銆
銆銆浣跨敤GetObjectClass鏂規硶鑾峰彇obj瀵瑰簲鐨刯class銆?br>銆銆
銆銆鈶?鑾峰彇MethodID錛?br>銆銆
銆銆jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");
銆銆
銆銆浣跨敤GetMethdoID鏂規硶鑾峰彇浣犺浣跨敤鐨勬柟娉曠殑MethdoID銆傚叾鍙傛暟鐨勬剰涔夛細
銆銆
銆銆env??>JNIEnv
銆銆
銆銆cls??>絎竴姝ヨ幏鍙栫殑jclass
銆銆
銆銆"callback"??>瑕佽皟鐢ㄧ殑鏂規硶鍚?br>銆銆
銆銆"(I)V"??>鏂規硶鐨凷ignature
銆銆
銆銆鈶?璋冪敤鏂規硶錛?br>銆銆
銆銆(*env)->CallVoidMethod(env, obj, mid, depth);
銆銆
銆銆浣跨敤CallVoidMethod鏂規硶璋冪敤鏂規硶銆傚弬鏁扮殑鎰忎箟錛?br>銆銆
銆銆env??>JNIEnv
銆銆
銆銆obj??>閫氳繃鏈湴鏂規硶絀胯繃鏉ョ殑jobject
銆銆
銆銆mid??>瑕佽皟鐢ㄧ殑MethodID錛堝嵆絎簩姝ヨ幏寰楃殑MethodID錛?br>銆銆
銆銆depth??>鏂規硶闇瑕佺殑鍙傛暟錛堝搴旀柟娉曠殑闇姹傦紝娣誨姞鐩稿簲鐨勫弬鏁幫級 bitsCN.nET涓浗緗戠鍗氬
銆銆
銆銆娉細榪欓噷浣跨敤鐨勬槸CallVoidMethod鏂規硶璋冪敤錛屽洜涓烘病鏈夎繑鍥炲鹼紝濡傛灉鏈夎繑鍥炲肩殑璇濅嬌鐢ㄥ搴旂殑鏂規硶錛屽湪鍚庨潰浼氭彁鍒般?br>銆銆
銆銆鏂規硶鐨凷ignature
銆銆
銆銆鏂規硶鐨凷ignature鏄敱鏂規硶鐨勫弬鏁板拰榪斿洖鍊肩殑綾誨瀷鍏卞悓鏋勬垚鐨勶紝涓嬮潰鏄粬浠殑緇撴瀯錛?br>銆銆
銆銆"(argument-types)return-type"
銆銆
銆銆鍏朵腑Java紼嬪簭涓弬鏁扮被鍨嬪拰鍏跺搴旂殑鍊煎涓嬶細
銆銆
銆銆Signature銆銆Java涓殑綾誨瀷
銆銆Z銆銆銆銆銆銆銆boolean
銆銆B銆銆銆銆銆銆銆byte
銆銆C銆銆銆銆銆銆銆char
銆銆S銆銆銆銆銆銆銆short
銆銆I銆銆銆銆銆銆銆int
銆銆J銆銆銆銆銆銆銆long
銆銆F銆銆銆銆銆銆銆float
銆銆D銆銆銆銆銆銆銆double
銆銆L fully-qualified-class;銆銆 fully-qualified-class
銆銆
銆銆[ type銆銆type[]
銆銆
銆銆( arg-types ) ret-type銆銆method type
銆銆
銆銆涓涓狫ava綾葷殑鏂規硶鐨凷ignature鍙互閫氳繃javap鍛戒護鑾峰彇錛?br>銆銆
銆銆javap -s -p Java綾誨悕
銆銆
銆銆緇欒皟鐢ㄧ殑鍑芥暟浼犲弬鏁幫細
銆銆
銆銆閫氬父鎴戜滑鐩存帴鍦╩ethodID鍚庨潰灝嗚浼犵殑鍙傛暟娣誨姞鍦ㄥ悗闈紝浣嗘槸榪樻湁鍏朵粬鐨勬柟娉曚篃鍙互浼犲弬鏁幫細
銆銆
銆銆CallVoidMethodV鍙互鑾峰彇涓涓暟閲忓彲鍙樼殑鍒楄〃浣滀負鍙傛暟錛?www_bitscn_com
銆銆
銆銆CallVoidMethodA鍙互鑾峰彇涓涓猽nion銆?br>銆銆
銆銆璋冪敤闈欐佹柟娉曪細
銆銆
銆銆灝辨槸灝嗙浜屾鍜岀涓夋璋冪敤鐨勬柟娉曟敼涓哄搴旂殑錛?br>銆銆
銆銆GetStaticMethodID鑾峰彇瀵瑰簲鐨勯潤鎬佹柟娉曠殑ID
銆銆
銆銆CallStaticIntMethod璋冪敤闈欐佹柟娉?br>銆銆
銆銆璋冪敤瓚呯被鐨勬柟娉曪細
銆銆
銆銆鐢ㄧ殑姣旇緝灝戯紝鑷繁鐪嬪暒銆俕_^銆?br>銆銆
銆銆4)璁塊棶Java瀵硅薄鐨勫睘鎬э細
銆銆
銆銆璁塊棶Java瀵硅薄鐨勫睘鎬у拰璁塊棶Java瀵硅薄鐨勬柟娉曞熀鏈笂涓鏍鳳紝鍙渶瑕佸皢鍑芥暟閲岄潰鐨凪ethod鏀逛負Field鍗沖彲
]]>
qt瀹樻柟緗戠珯 http://trolltech.com/
瑙e帇qt4銆?br>浣跨敤Visual Studio 2008 Command Prompt鍒板懡浠よ妯″紡銆?br>鍒皅t鐩綍涓?br>cd bin
configure (寰堜箙)
namke (寰堜箙)
寤虹珛欏圭洰
緙栬緫涓涓獂x.cpp鏂囦歡
鍦ㄦ枃浠剁洰褰曚笅鎵ц
qmake -project
qmake -t vcapp
涓嬮潰鐢ㄤ竴涓皬紼嬪簭嫻嬭瘯涓涓?br>
鍒涘緩鏂囦歡鍚嶄負hello.cpp錛岃緭鍏ュ涓嬩唬鐮侊細
#include <QApplication>
#include <QLabel>
int main(int argc, char **argv) {
QApplication app(argc, argv);
QLabel *label = new QLabel("Hello World!");
label->show();
return app.exec();
}
鐒跺悗
prompt> qmake -project -o hello.pro
prompt> qmake
prompt> nmake
灝變細鍦╠ebug鏂囦歡澶逛笅鐢熸垚涓涓?exe鏂囦歡銆?br>
qmake
鐢╲s2008鎵撳紑欏圭洰
緙栬緫ui
鎵цbin鐩綍涓嬬殑designer.exe
瀛樼洏錛?br>uic -o xxx.h xxx.ui
澶嶅埗鍒伴」鐩笅闈?br>鎵цqmake
鐢╲s2008鎵撳紑
瀛楃涓蹭嬌鐢╣bk緙栫爜(鍏ㄥ眬)
main鍑芥暟鍔犲叆
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));.
YOUR_LIB=your_path
for jar in `ls $YOUR_LIB/*.jar`
do
CLASSPATH="$CLASSPATH:""$jar"
done
windows :
SETLOCAL ENABLEDELAYEDEXPANSION
set LIB=xx
set CLASSPATH=.
FOR %%C IN (LIB\*.jar) DO set CLASSPATH=!CLASSPATH!;%%C
echo %CLASSPATH%
unix ksh:
鏆傛棤
1.4.2jdk緙栬瘧鎵ц銆傞暱鏃墮棿鎵ц娌℃湁鍙戠幇鏈夌綉涓婃墍璇寸殑鐢變簬jit浼樺寲瀵艱嚧鐨勫綋鍒嗛厤瀹孎oo鐨勫唴瀛橈紝Foo鏋勯犲嚱鏁版湭鍒濆鍖栧畬鎴愬氨灝嗗叾鍦板潃璧嬪肩粰foo鐨勯敊璇傜浉淇¤繖鏃跺檍it宸茬粡瀵逛唬鐮佽繘琛屼簡浼樺寲銆?br />
鍥藉緗戝潃鍏充簬Double-Checked Locking鐨勬枃绔?a >http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
Paul Jakubik found an example of a use of double-checked locking that did not work correctly. A slightly cleaned up version of that code is available here.
When run on a system using the Symantec JIT, it doesn't work. In particular, the Symantec JIT compiles
singletons[i].reference = new Singleton();
to the following (note that the Symantec JIT using a handle-based object allocation system).
0206106A mov eax,0F97E78h
0206106F call 01F6B210 ; allocate space for
; Singleton, return result in eax
02061074 mov dword ptr [ebp],eax ; EBP is &singletons[i].reference
; store the unconstructed object here.
02061077 mov ecx,dword ptr [eax] ; dereference the handle to
; get the raw pointer
02061079 mov dword ptr [ecx],100h ; Next 4 lines are
0206107F mov dword ptr [ecx+4],200h ; Singleton's inlined constructor
02061086 mov dword ptr [ecx+8],400h
0206108D mov dword ptr [ecx+0Ch],0F84030h
As you can see, the assignment to singletons[i].reference is performed before the constructor for Singleton is called. This is completely legal under the existing Java memory model, and also legal in C and C++ (since neither of them have a memory model).
涓婇潰鏄浗澶栫綉绔欑粰鍑虹殑jit浠g爜鍜岃鏄庛?br />
鍊?
銆銆銆 渚嬪瓙1銆佸拰UNITS鍚堢敤錛屾寚瀹氭棩鏈熸垨鏃墮棿鍗曚綅(year,month,day,hour,minute,seond,fraction)錛?
銆銆銆銆銆銆銆let tmp_date = today + 3 UNITS day
銆銆銆 渚嬪瓙2銆乴et tmp_date = MDY(10,30,2002)銆銆-- 2002-10-30
銆銆銆 渚嬪瓙3銆乴et tmp_date = today + interval(7) day to day銆--褰撳墠鏃墮棿鍔犱笂7澶╋紱
銆銆銆銆銆銆銆娉細璇ュ姛鑳戒笌1鐩鎬技錛?
銆銆銆 渚嬪瓙4銆丒XTEND杞崲鏃ユ湡鎴栨棩鏈熸椂闂村?
銆銆銆銆銆銆銆let tmp_inthour = extend(datetime1,hour to hour)
銆 3銆佷唬鏁板嚱鏁?
銆銆銆1錛堿BS(COLNAME/EXPRESSION)錛氥銆銆銆銆銆 鍙栫粷瀵瑰?
銆銆銆2錛塎OD錛圕OLNAME/EXPRESSION錛孌IVISOR錛夈銆榪斿洖闄や互闄ゆ暟鍚庣殑妯★紙浣欐暟錛?
銆銆銆3錛塒OW錛圕OLNAME/EXPRESSION錛孍XPONENT錛夈 榪斿洖涓涓肩殑鎸囨暟鍐?
銆銆銆銆 渚嬪瓙錛歭et tmp_float = pow(2,3)銆--8.00000000
銆銆銆4錛塕OOT錛圕OLNAME/EXPRESSION錛孾index]錛夈 榪斿洖鎸囧畾鍒楁垨琛ㄨ揪寮忕殑鏍瑰?
銆銆銆5錛塖QRT錛圕OLNAME/EXPRESSION錛夈銆銆銆銆銆榪斿洖鎸囧畾鍒楁垨琛ㄨ揪寮忕殑騫蟲柟鏍瑰?
銆銆銆6錛塕OUND錛圕OLNAME/EXPRESSION錛孾factor]錛?榪斿洖鎸囧畾鍒楁垨琛ㄨ揪寮忕殑鍦嗘暣鍖栧?
銆銆銆7錛塗RUNC錛圕OLNAME/EXPRESSION錛孾factor]錛?榪斿洖鎸囧畾鍒楁垨琛ㄨ揪寮忕殑鎴熬鍊?
銆銆銆銆 璇存槑錛氫笂涓よ呬腑FACTOR鎸囧畾灝忔暟浣嶆暟錛岃嫢涓嶆寚瀹氾紝鍒欎負0錛涜嫢涓鴻礋鏁幫紝鍒欐暣鍖栧埌灝忔暟鐐瑰乏杈癸紱
銆銆銆銆 娉細ROUND鏄湪鎸囧畾浣嶄笂榪涜4鑸?鍏ワ紱TRUNC鏄湪鎸囧畾浣嶄笂鐩存帴鎴柇錛?
銆銆銆銆銆let tmp_float = round(4.555,2) --4.56
銆銆銆銆銆let tmp_float = trunc(4.555,2) --4.55
銆 4銆佹寚鏁頒笌瀵規暟鍑芥暟
銆銆銆1錛塃XP錛圕OLNAME/EXPRESSION錛夈銆銆銆榪斿洖鎸囧畾鍒楁垨琛ㄨ揪寮忕殑鎸囨暟鍊?
銆銆銆2錛塋OGN錛圕OLNAME/EXPRESSION錛夈銆銆 榪斿洖鎸囧畾鍒楁垨琛ㄨ揪寮忕殑鑷劧瀵規暟鍊?
銆銆銆3錛塋OG10錛圕OLNAME/EXPRESSION錛夈銆銆榪斿洖鎸囧畾鍒楁垨琛ㄨ揪寮忕殑搴曟暟浣?0鐨勫鏁板?
銆 5銆佷笁瑙掑嚱鏁?
銆銆銆1錛塁OS錛圧ADIAN EXPRESSION錛夈銆銆銆銆榪斿洖鎸囧畾寮у害琛ㄨ揪寮忕殑浣欏雞鍊?
銆銆銆2錛塖IN錛圧ADIAN EXPRESSION錛夈銆銆銆銆姝e雞
銆銆銆3錛塗AN錛圧ADIAN EXPRESSION錛夈銆銆銆銆姝e垏
銆銆銆4錛堿COS錛圧ADIAN EXPRESSION錛夈銆銆銆 鍙嶄綑寮?
銆銆銆5錛堿SIN錛圧ADIAN EXPRESSION錛夈銆銆銆 鍙嶆寮?
銆銆銆6錛堿TAN錛圧ADIAN EXPRESSION錛夈銆銆銆 鍙嶆鍒?
銆銆銆7錛堿TAN2錛圶錛孻錛夈銆銆銆銆銆銆銆銆銆 榪斿洖鍧愭爣錛圶錛孻錛夌殑鏋佸潗鏍囪搴︾粍浠?
銆 6銆佺粺璁″嚱鏁?
銆銆銆1錛塕ANGE錛圕OLNAME錛夈銆銆 榪斿洖鎸囧畾鍒楃殑鏈澶у間笌鏈灝忓間箣宸?= MAX錛圕OLNAME錛?MIN
錛圕OLNAME錛?
銆銆銆2錛塚ARIANCE錛圕OLNAME錛夈銆榪斿洖鎸囧畾鍒楃殑鏍鋒湰鏂瑰樊錛?
銆銆銆3錛塖TDEV錛圕OLNAME錛夈銆銆 榪斿洖鎸囧畾鍒楃殑鏍囧噯鍋忓樊錛?
銆 7銆佸叾浠栧嚱鏁?
銆銆銆1錛塙SER銆銆銆銆銆銆銆銆銆銆銆銆銆銆榪斿洖褰撳墠鐢ㄦ埛鍚?
銆銆銆2錛塇EX錛圕OLNAME/EXPRESSION錛夈銆銆 榪斿洖鎸囧畾鍒楁垨琛ㄨ揪寮忕殑鍗佸叚榪涘埗鍊?
銆銆銆3錛塋ENGTH錛圕OLNAME/EXPRESSION錛夈銆榪斿洖鎸囧畾瀛楃鍒楁垨琛ㄨ揪寮忕殑闀垮害
銆銆銆4錛塗RIM錛圕OLNAME/EXPRESSION錛夈銆銆鍒犻櫎鎸囧畾鍒楁垨琛ㄨ揪寮忓墠鍚庣殑瀛楃
銆銆銆5錛塁OLNAME/EXPRESSION || COLNAME/EXPRESSION銆榪斿洖騫跺湪涓璧風殑瀛楃錛?
浜屻両DS鍐呴儴鍑芥暟
銆 1銆丏BSERVERNAME銆銆銆榪斿洖鏁版嵁搴撴湇鍔″櫒鍚嶃let tmp_char=DBSERVERNAME
銆 2銆丼ITENAME銆銆銆銆銆榪斿洖鏁版嵁搴撴湇鍔″櫒鍚嶃let tmp_char=SITENAME
銆銆銆璇存槑錛氫袱鑰呭姛鑳界浉鍚岋紱
銆 3銆丏BINFO錛堚楽PECIAL_KEYWORD')銆銆銆榪斿洖鍙叧閿瓧鍊?
銆銆銆渚嬪瓙1錛氳繑鍥炴暟鎹腑姣忎釜琛ㄧ殑DBSPACE鍚嶇О
銆銆銆銆 select dbinfo('dbspace',partnum),tabname from systables
銆銆銆銆銆where tabid>99 and tabtype='T'銆(OK)
銆銆銆渚嬪瓙2錛氳繑鍥炰換浣曡〃涓彃鍏ョ殑鏈鍚庝竴涓猄ERIAL鍊?
銆銆銆銆銆select dbinfo('sqlca.sqlerrd1') from systables where tabid = 1
銆銆銆渚嬪瓙3錛氳繑鍥炴渶鍚庝竴涓猄ELECT錛孖NSERT錛孶PDATE錛孌ELETE鎴朎XECUTE PROCEDURE璇彞澶勭悊鐨勮鏁幫紱
銆銆銆銆銆select dbinfo('sqlca.sqlerrd2') from systables where tabid=1;
聽
One of the more difficult concepts in Informix's handling of date and time values concerns the use of the variables in arithmetic or relational expressions. You can add or subtract DATE and DATETIME variables from each other. You can add or subtract an INTERVAL to a DATE or DATETIME. Table 1 shows the results of different types of operations on DATE and DATETIME values.
Table 1. Operations on DATE and DATETIME Variables
|
First Operand |
Operation |
Second Operand |
Result |
|
DATE |
- |
DATETIME |
INTERVAL |
|
DATETIME |
- |
DATE |
INTERVAL |
|
DATE |
+- |
INTERVAL |
DATETIME |
|
DATETIME |
- |
DATETIME |
INTERVAL |
|
DATETIME |
+- |
INTERVAL |
DATETIME |
|
INTERVAL |
+ |
DATETIME |
DATETIME |
|
INTERVAL |
+- |
INTERVAL |
INTERVAL |
|
DATETIME |
- |
CURRENT |
INTERVAL |
|
CURRENT |
- |
DATETIME |
INTERVAL |
|
INTERVAL |
+ |
CURRENT |
DATETIME |
|
CURRENT |
+- |
INTERVAL |
DATETIME |
|
DATETIME |
+- |
UNITS |
DATETIME |
|
INTERVAL |
+- |
UNITS |
INTERVAL |
|
INTERVAL |
*/ |
NUMBER |
INTERVAL |
Notice that it's always okay to subtract one DATE or DATETIME value from another, as shown here: In such a case, the result is always an INTERVAL variable. It would make no sense to add two DATE or DATETIME values together. What could such an addition represent? When working with INTERVAL values, sometimes it is necessary to specify the precision with which you are dealing. For example, suppose you have the following field defined: To add 10 days to the lead time you could use a SQL statement like this: You could achieve the same results using the UNITS keyword: Like most other programming languages, SQL often allows you to achieve the same ends with different statements. Sometimes the choice is one of personal style. Other times, one format fits in better with a structured style of code writing than another format does. There are several built-in functions that affect date and time calculations. They can apply to either DATE or DATETIME values, with some exceptions. The TODAY function returns a DATE data value representing the current date. For example, you could execute a SQL function like this: The CURRENT function is similar to the TODAY function, except it returns a DATETIME value. Without specific qualifiers, the default is YEAR to FRACTION(3). You can change the precision by using the same YEAR to FRACTION qualifiers as you use for DATETIMES. Thus, this would be legal: The DATE function takes as input a non-DATE value such as CHAR, DATETIME, or INTEGER and returns the corresponding DATE value. For example, the following SQL translates a CHARACTER value to a DATE: This function returns an integer representing the day of the month. Here's an example: This performs like the DAY function except it returns an integer between 1 and 12 representing the month: This returns an integer representing the day of the week, with 0 being Sunday and 6 being Saturday: This function is like the ones above, only it returns a four-digit integer representing the year. This function allows you to use different precisions in a DATETIME than you have specified in the declaration of the variable. It uses the same FIRST to LAST syntax as the DATETIME variables. This function is used to adjust the precision of a DATETIME variable to match the precision of an INTERVAL that you are using in a calculation. If the INTERVAL value has fields that are not part of the DATETIME value that you are using in a calculation, use the EXTEND function to adjust the precision of the DATETIME. EXTEND can either increase or decrease the precision of a DATETIME, depending upon the FIRST and LAST values. Suppose myvariable is declared as DATETIME YEAR to DAY. If you want to add or subtract an INTERVAL defined as MINUTE, you first have to extend the DATETIME as follows: The resulting value will be DATETIME YEAR to MINUTE. The MDY function converts three-integer values into a DATE format. The first integer is the month and must evaluate to an integer in the range 1鈥?2. The second integer is the day and must evaluate to a number in the range from 1 to however many days are in the particular month (28鈥?1). The third expression is the year and must be a four-digit integer. Thus, the following MDY functions would each be valid: returns a DATE of "07/01/50" returns a DATE equal to the first day of the current month in the current year Informix has extensive capabilities for manipulating dates and times, which can make for long and complex SQL statements. Using the three time-related data types and the time-related functions and keywords, you can accomplish almost any type of manipulation of time data. Unfortunately, getting there may be cryptic and painful. If you regularly do extensive date and time manipulation, you should understand all of the intricacies of these data structures.
Have fun!聽CURRENT - "07/01/1950" = INTERVAL (my age)
"12/25/2000" 鈥?CURRENT = INTERVAL (how long till Xmas?)
UNITS Keyword
lead_time INTERVAL DAY to DAY
SELECT lead_time + INTERVAL(10) DAY to DAY
FROM orders
SELECT lead_time + 10 UNITS DAY
FROM orders
Functions
TODAY
UPDATE member SET change_date = TODAY
WHER member_number = 12345
CURRENT
SELECT * from member
WHERE elapsed_time < CURRENT YEAR to DAY
DATE
SELECT * from member
WHERE enrollment_date > DATE('01/01/99')DAY
SELECT * from member
WHERE DAY(enrollment_date) > DAY(CURRENT)
MONTH
SELECT * from member
WHERE enrollment_date > MONTH('01/01/99')WEEKDAY
SELECT * from member
WHERE WEEKDAY(enrollment_date) > WEEKDAY(CURRENT)
YEAR
EXTEND
SELECT EXTEND(myvariable, YEAR to MINUTE) 鈥?
INTERVAL(5) MINUTE to MINUTE
FROM member
MDY
MDY(7,1,1950)
MDY(MONTH(TODAY), 1, YEAR(TODAY))
聽