03Mysql的自身優(yōu)化模糊查詢_第1頁
03Mysql的自身優(yōu)化模糊查詢_第2頁
03Mysql的自身優(yōu)化模糊查詢_第3頁
03Mysql的自身優(yōu)化模糊查詢_第4頁
03Mysql的自身優(yōu)化模糊查詢_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、explain執(zhí)行計(jì)劃 簡(jiǎn)介MySQL調(diào)優(yōu): 1 .先發(fā)現(xiàn)問題(慢查詢,profile) 2 .對(duì)于使用索引和沒有使用索引,了解到索引可以快速去查找數(shù)據(jù) 3 .了解什么是索引(索引是排好序的快速查找的數(shù)據(jù)結(jié)構(gòu)) 4 .索引的管理(查看,創(chuàng)建,刪除) 5 .索引的本身的數(shù)據(jù)結(jié)構(gòu)(B-TREE結(jié)構(gòu)和聚簇結(jié)構(gòu)) 6 .MySQL是如何去使用這些索引的(explain工具),需要去發(fā)現(xiàn)索引是否合理的被使用,防止索引濫用。 注意:索引對(duì)查詢是有幫助的,但是對(duì)更新是沒有好處的。索引要建立的合理。 MySQL調(diào)優(yōu)的一個(gè)通用思路(面試題):通過上面的步驟就可以對(duì)MySQL進(jìn)行調(diào)優(yōu),只 要將上面的步驟重復(fù)不斷執(zhí)

2、行,可以使用MySQL在最優(yōu)的情況下工作。 pro巾le定義:MySQL提供的一個(gè)可以分析SQL語句執(zhí)行過程的工具,通過它大致可以了解 到MySQL將如何執(zhí)行用戶傳遞過來的sql語句。 用法 使用的時(shí)候只要在對(duì)應(yīng)的sql語句前面,加上關(guān)鍵字explain或者同義詞desc # descselect*fromtableNamewhereid=1000000; # explainselect*fromtableNamewhereid=1000000; 以上兩條sql執(zhí)行效果是等價(jià)的。 可以先簡(jiǎn)單對(duì)比有索引和無索引執(zhí)行計(jì)劃: no_index無索引的情況下分析: 叫descpeople; +-+-+

3、 IFieldITypeINullIKeyIDefaultIExtra +7=+ IidIint(1G)uneianodINOIPRIINULLIauto_incremfrnt Ino_indexIint(i)unsignedIhioII1I InaintIuarcharC50IYESII-NULLI IgenderIuarchar(50)IYESIINULLI ItmailIuarchar(IOO)IVESIINULLI 5rowsinset(0,G3sec) my5qldescselect乂frompeoplewhereno_index=1OGO0OGXG 棄某MX/X捉MW翼 XWMX

4、弁其 X 找翼冥翼1二一rOH興標(biāo)某弁找攏WMWWXWM* select_type;SIMPLE t&bl。=people Ftupe:ALL p??倢?dǎo):NULL key:NULLkey.len;NULLrefiNULL 掃描 row*4523288 Extra:Usingwhere 1rowinset。一E)Bgee mysqL rows:代表查詢滿足該sql語句的結(jié)果,可能需要查詢行的數(shù)量。 * *F - + 十一- + 1Field 1 Type INull I Ke 1 Default 1Extra 1 *-一 i 一Jg(. TBiM + 葉1id 1 int(K)unsigned

5、IN0_ 1 PR】 1 NULL 1auto_increment 1 1no_index 1 int(10)uFiGigndd IND 1 T 1 1 1 1nam 1 uarchar(50) IVES 1 i NULL 1 1 1gender 1 uarchar(59) IVES 1 i NULL 1 1 1amail 1 uarchar(19Q) IYES 1 i NULL 1 1 id存在主鍵索引的情況下分析: mysqldescpeople; +-+-+-+-T-T-+ 5rowsinset(O.03sec) mu|sqlexplainselect城frompeoplewhereid

6、=1OOQ6OOG id:1 5elect_type:SIMPLE tabic:people 11Il彳審已Jrjlqgffc.*廿.4南丫廣|si type:const possiblekeqs:PRIMARY_ Keg:PRIMARY key_len:4 ref:const,-一, rows:1_代表查詢讀記錄查詢的物理行只有-行.不需要全表掃招 J.I- Extra: 搜狗拼音三: type:重點(diǎn)分析 1.all代表全表掃描,一般在不使用索引的情況下回出現(xiàn)該值 i*sqldescpeople; IField1Type1Null1Koy1Default1Extra1 1id1int(10)

7、unsigned1NO1PRIl_NULL1Buto.increment1 1na_index1int(1Q)unsi9nsd1NO11111 1naiiioTuarchar(Sff-IVES_TINULLII 1gender1uarchar(50)1YES11NULL11 1nail1uarchar(WG)1YES11NULL11 5rowsinGet(0.01sec) 叫explainselect“frompeoplewhereno_index=1000600SG XXArtrtAftAftrtAftAArtAftrtA1.UHftAftA id:1 Gelect_typG:SIMPLE

8、table:peopletype*ALL possible_ktgs:NULLkey:NULL key_len:NULLref:NULL rous:4523288 全表掃描:一行一行的逐行比較,然后返回滿足條件的記錄。 my$qlexplainselectfrompeoplewhereid2andid 面試題:什么樣的字段適合建立索引?(建立索引的時(shí)候有什么考慮?) 答: 1 .在where條件后面作為查詢的字段需要建立索引。 2 .在(排序order范圍range分組group)這些情況下也是可以使用索引的,所以在排序字段后面加上索引也是可以的。 注意:在where條件后也不是所有的字段都建

9、立索引,因?yàn)樗饕旧硪彩怯虚_銷的。 4. index代表使用了索引 mysqlexplainselectcount(M)frompecpleG XXMMMMMMMMHMMMMMMMMMMMMMMMXid:1select.type:SIMPLEtable:DeoioleHT tijpe;indexld0弓 uselect共fromkcgoods_id=1G ERROR10544芝S芝2):Unknowncolumnqocd&_id1inwh&reclause 力ysqlde5Gselect乂fromkcwhere9od_id=1G id:1 :SIMPLEtablejkctype;systemp

10、ossible.keys;PRIMARY-key:NULLkey_lon:NULLrf:NULLrows:1 Extra: 1rowinset(G,60ec) 1,rOk|KXKXKXKXXXKXMMXMXMXMMMMMMMM key:FK1HHKY key_ien;4 reF:NULL 4523238 Extra:Usingirdx 1rowInset(Q,GOsec) 總共的記錄.直接可以在索 U.-LiLX,- 但實(shí)際使用了主 有鍵索引 以不使用索引即可返回滿足條件的記錄,記錄的情況下才會(huì)出現(xiàn)口 1rowinset(0.00sec) 總結(jié):nullsystemconstrangeinde

11、xall 注意:盡量不要出現(xiàn)all6.null,可能出現(xiàn),如果出現(xiàn)這個(gè),也代表很好?;静蝗菀壮霈F(xiàn)。 mysqldescselect1+1G idselecttupetabletypepossible_keyskeykey_lenrefrowsExtra SIMPLENULLNULLNULLNULLNULLNULLNULLNotablesused MySQL常見注意事項(xiàng) 1 .模糊查詢like默認(rèn)是對(duì)name字段建立了索引 注意:在使用模糊查詢的時(shí)候,當(dāng)%在第一個(gè)字母的位置的時(shí)候,這個(gè)時(shí)候索引是無法被使用的。但是%在其他的位置的時(shí)候,索引是可以被使用的。 #select*fromtableNa

12、mewherenamelike%zhangsan;?可以使用到索引???不可以。 分析:因?yàn)槭遣淮_定查詢,在表中任何一行記錄都有可能滿足查詢條件。 mysqldescpeople; Field * I Type T_-一一. 1 _JL_ 一 T Hey1Default 1Extra_i_ T id I int(10)unsigned 1NO 1 PRI1NULL 1autoincrement noindex I intll)unsigned 1NO 1 11 1 name I uarchar(59) 1YES 1 MUL1NULL 1 gander I uarchar(50) 1YES 1 1

13、NULL 1 email I uarcharf1 1VES 1 -1NULL-+ r 5rowsinset(r00sec) mysqldescselectfromuserwheremelike黑超G id:1 select_tgpeSIMPLE“hidtype:ALLpossible_keysNULLkey:NULLkey.len:NULLref:NULLrows:10Extra:Usingwhere1rowinset(0.00sec) #select*fromtableNamewherenamelikeZh%”;可以使用嗎?可以 #select*fromtableNamewherenamel

14、ikeZh%三;可以使用嗎?可以 #select*fromtableNamewherenamelikeZ%san;?可以使用嗎?可以,首先可以快速定位z字母開頭的部分。讀z字母這段范圍之內(nèi)只能逐行比較。mysqldescselect黑frouserwhorelieliko趙弘良G id:1 select_type:SIMPLE table:user type:rangepossible_keys:mekey:mekey_lon;153 -ref:NULL rows:1 Extra:usingwhere1rowinset(0.00sec) mLjsqldiescselect*fromuserwh

15、eremelike趣器G 1prCU冊(cè)*kkk 汽粘舞*河*舞* id:1 &elect_type:SIMPLE table:_usertype:range possible_ky9:mekey:mekey_len:155ref;NULLrows:1 Extra:Usingwhere 1 rowinset(0.00sec) 2 .對(duì)查詢的列不要使用函數(shù)或者運(yùn)算。否則索引無法使用。 # select*fromtableNamewhereid+1=1000; # select*fromtableNamewhereid=999;等價(jià)。 mysqldscselect*frompgoplelwherei

16、d+1=10O0G id:1 $elect_type:SIMPLEtable:peopleltypeTALL possible_keys:NULL -key:NULL key_len:NULLref:NULLrows:4395361Extra:Usingwhere1rowinset(0.0Dsec)ysqldoseselect拜frompeople!whereid=999G 1.rOWWMKMXMKMKMMKMXNMMXMWMXMKMK id:1 select_type:SIMPLE table:peoplel type:const ossible.keqs:PRIMARY key?PRIMA

17、RY key_len:4 ref:_const rous:1 Extra: rouinset(0.DGs*c) 有的時(shí)候,會(huì)在查詢字段上面使用函數(shù)。使用函數(shù)的時(shí)候也是無法使用所有的,一般的解決方案是將查詢后的結(jié)果交給php程序(字符串和數(shù)組)來實(shí)現(xiàn)處理。不要把函數(shù)的處理放在MySQL里面完成。 mijsqldescselectfrompeoplewherelength(name)5G id:1 select_type : SIMPLEtable : peopletype : ALLposGible_keys : NULLkey :NULLkey.len:NULLref:NULLrows:452

18、3288Extra:Usingwhere1rowinset(0.01sec) 3.在你開發(fā)之中,什么樣的字段適合建立索引?簡(jiǎn)述為什么? 答: 1 .在where后面作為查詢條件的字段是適合建立索引的。 a)注意:對(duì)于唯一很差的字段不適合建立索引,例如只有男和女這兩種情況的 字段。 2 .在需要排序的字段上面,也可以建立索引。nysqldescselectxfrompeopleorderbynamlimit9*G OCIKXKMXMXMXMMKMXKMXMMXMKMMK1.ICONKMMXMXMMMMXMMMMXMXMMKMMMMMMid:16014Ct_type:SIMPLEtdble:peo

19、pletype:index 3ossible_keys;NULLkey:namekey_ln_153ref:NULLrow:9 Extra; Irowinset(9.OGsec) 執(zhí)行orderby不加限定,全表掃描,巾lesort含義注意:?jiǎn)栴}? *x*x*x*x*x*1.rowid:1Gloct_typ:SIMPLEtabi。:peopletypo:ALL pos9ible_keysJNULLkey:NULLkey_len:NULL7:NULLrows4523288 Extra:Usingfilesort,ygqldesc弓elect*frompeopleordop-bynaitioG r

20、ad,rBaEaEaisaLrHLVUJkuLJ 如在口rderby做排序的時(shí)候如果沒有限定的情況下,會(huì)做全表的排序 filesortz一定要注意不是說這個(gè)在礴盤上做文件排序,而是在內(nèi)存中MySQL需要對(duì)數(shù)據(jù)排序 4. MySQL優(yōu)化的一個(gè)通用方案?答: 1 .開啟MySQL的慢查詢記錄功能,讓系統(tǒng)運(yùn)行一段時(shí)間(測(cè)試時(shí)間都是在半個(gè)月到一個(gè) 月時(shí)間) 2 .檢查慢查詢的日志信息,分析出可能有問題的sql語句 3 .使用profile工具詳細(xì)去分析sql語句執(zhí)行的時(shí)候,每個(gè)步驟所花費(fèi)的時(shí)間,sendingdata (可能出現(xiàn)的問題是MySQL沒有使用索引的情況下,會(huì)去磁盤上獲取數(shù)據(jù):經(jīng)驗(yàn)) 4 .

21、對(duì)sql語句優(yōu)化(本身寫出來的sql語句就存在問題,例如對(duì)查詢的字段使用了函數(shù))或 者對(duì)表的結(jié)構(gòu)(表中有些查詢字段沒有建立索引)適當(dāng)?shù)淖鲆恍┱{(diào)整(索引重建或者建立的 更合適) 5 .使用explain工具分析一下這些sql語句在執(zhí)行的時(shí)候,是如何執(zhí)行(可能使用索引或者是使用那些索引) a)type:constindex出現(xiàn)這些代表索引正常使用 6 .反復(fù)上面的過程具體分析。 5. MySQL的自身緩存 解釋:MySQL的客戶端在發(fā)送sql語句到MySQL服務(wù)器端之后,會(huì)先去檢查一下權(quán)限,之后去查詢?cè)摋lsql語句的緩存信息是否存在,如果存在,則直接返回;如果不存在,MySQL 服務(wù)器需要去分析該

22、sql語句,做詞法語法分析,然后編譯,生產(chǎn)執(zhí)行樹,去磁盤上獲取數(shù)據(jù),獲取數(shù)據(jù)后,緩存到自身的一個(gè)緩存容器里面,然后在返回?cái)?shù)據(jù)。 使用: # showvariableslike%cache%”; ngsqlshowuariableslike # setglobalquery_cache_size=1024*1024*32;Uariable_name .4一一一一. -一-一-一4 binlcg_cache_size 132768 binlcg_stmt_cache_size 132768 haue_query_cache 1YES key_cache_age_threshold 1300 key

23、_cache_block_size 11024 key_cache_diuision_limit 1100 max_binlcg_cache_size I1844G74407370954752QI max,binlog_stmt_cache 9ize I18446科4了3了09547521 metadata_locks_cache_size 11024 query_cache_limit 11648576 quGry_CachG_niinjeunit 14096 一孑這行query_cache_siz 18388608 存的大 query_cache_typ 1ON 節(jié)) qury_cacho

24、_ulock_inualidat 1OFF &tored_program_cBcho 12S& table_definiticn-cache 1400 table_opon_cache 1256 JAqJ匕不J周 thread_cache_size 13 緩存功能-J 表MySQL自身緩 MySQL的自身 注意:第一個(gè)是要加關(guān)鍵字global第二個(gè)是大小的單位為B(字節(jié))第三具體給多少合 適,取決于自身操作系統(tǒng)的內(nèi)存大小。 query.cachGsize qury_cach_type I33554432 IUIN query_cachG_ulock_inuBlidateIOFF 測(cè)試對(duì)比: n

25、gsqlselect*frompeoplewh&rno_index=10000;+-T-T1T+ IidIno_indexInamIgenderIemailI +-+-+ I998SI10000I林政鋼IMI+ 1rowinset(3.56sec) nysql selectfrompeoplewhereno_index=1GODO; 自身甥 IidIno_index|namoIgenderIemailI存二 I9988I1Q0QGI林政鋼IMIalexlinQl訕邙笆I第 +A*一.一一*-+一 4f 向石匚殳 1rowinset(D.00sec) 注意:MySQL自身的緩存需要注意兩點(diǎn): 1

26、.MySQL的sql語句里面不能出現(xiàn)不確定信息(例如在條件里面使用now()函數(shù)),MySQL 的自身緩存將無法被使用。查詢的結(jié)構(gòu)不會(huì)被緩存起來。 my$qlselectnow(); Inow() I2016-03-0411:51:52I 1rowinset(Q.00sec) 分析: mysqlselect乂,now()astimefrompeoplewhereno.index110002; +-+二+不-4+ IidIno_indexInameIgnd&rI&inailItime I99加I10092I沃曉紅IFItexneMtan9.ccmI2016-03-04111:50:16I 1ro

27、win(3.53sc) i一候.由于now函數(shù)產(chǎn)生了一個(gè)不確定因素 I_串f幅MuGCI的白白耀右均無北詁仲田 mysqlselectnow)3方timefrompeople心白 Mno_index-10002: +-:*+1|.紛回目-+-七存- IidIno_indexInameIgpndgrI&nailItin I99S0I10092I沃曉紅 FItexnewtgng.ccn)I2016-03-Q11:50:2 1rowins&t(3.64sc) 2.MySQL的自身的緩存是嚴(yán)格基于sql語句的(MySQL自身緩存是嚴(yán)格區(qū)分sql語句的大 小寫的)select=SELECT關(guān)鍵字其實(shí)是一

28、樣的 mysqlselectfrompeoplewhrna_index-20001; +:十=+-+ IIidInoindexInamel|genderIemailI +-+4 II19989120001I周清霞IFIcandyOI2G.com +T-+ 1 rowinset(3.67sec)MySQL自身的緩; i-yU-JJ1I mysqlSELECT閶frompeoplewherenosindx=20091nq4 -孑市B9 IidIno_indoxInameIgenderIQuailI + I199S9I200Q1I周清霞IFI5126,mtnI + 1rowinset3.55sec)

29、mgsql -MA+showstatuslikeXInnoX; IUariable_nameIUalue + IInnodb_buffer_pool_pages_dataI575 IInnodb_buffer_pool_pages_dirtyI0 IInnodb_buffer_pool_pages_flushedI5204 IInnodb_buffer_pool_pages_freeI0 IInnodb_buffer_pool_pages_niiscI1 IInnodb_buffer_pool_pages_totalI576 IInnodb_buffer_poolread_aheadrndI0

30、 I地的飾注一平._ 一股對(duì)于一個(gè)一股對(duì)于一個(gè)應(yīng)用來說,業(yè)務(wù)中應(yīng)用來說,業(yè)務(wù)中7。% %的操作是讀操作,剩下的是寫操作的操作是讀操作,剩下的是寫操作+ +所以,讀的壓力所以,讀的壓力相抵來說很大,相抵來說很大,這個(gè)時(shí)這個(gè)時(shí)候就需要分擔(dān)讀的壓力使候就需要分擔(dān)讀的壓力使用讀寫分離用讀寫分離技術(shù)技術(shù). . 讀寫分離概圖: mysql-proxy這個(gè)工具可以實(shí)現(xiàn)對(duì)sql語句的分析, 判斷sql語句是讀操作(select關(guān)鍵字) 還是寫操作(insert、update、delete)。最后去連接不同的服務(wù)器實(shí)現(xiàn)業(yè)務(wù)的完成。 當(dāng)完成讀的時(shí)候,MySQL-proxy會(huì)從對(duì)臺(tái)讀服務(wù)器按照一定策略去選擇一臺(tái)(輪

31、詢、加權(quán)、 ip_hash)完成讀操作 當(dāng)完成寫的時(shí)候,直接去連接寫的服務(wù)器 問題: 由于數(shù)據(jù)只在主服務(wù)器上實(shí)現(xiàn)寫操作,但是從服務(wù)器上是沒有完成寫操作的,這個(gè)時(shí)候數(shù)據(jù) 就會(huì)不一致。 需要解決一致性的問題? 答:可以使用MySQL的一個(gè)bin日志來完成數(shù)據(jù)的一致性問題。 使用步驟: 主服務(wù)器配置: 1 .先在主服務(wù)器上開啟bin日志(bin日志是MySQL的一個(gè)二進(jìn)制日志功能,可以記錄對(duì) MySQL數(shù)據(jù)造成更改的sql語句,形成一個(gè)日志文件) 2 .在主服務(wù)器上的配置文件里面定義一個(gè)server_id=Number相當(dāng)于標(biāo)示一下這個(gè)服務(wù)器 的叫的叫L服務(wù)服務(wù)器器 從服務(wù)器配置: 1 .開啟從服務(wù)

32、器的一個(gè)中繼日志,這個(gè)日志主要是把主服務(wù)器bin日志讀取之后(無法直接 使用,需要先轉(zhuǎn)換為中繼日志),形成轉(zhuǎn)換。 2 .在從服務(wù)器上的配置文件定義一個(gè)server_id=Number不要和主服務(wù)器重復(fù) 3 .使用主服務(wù)器的授權(quán)賬號(hào)去鏈接主服務(wù)器獲取bin日志,然后讀取到本地,形成中級(jí)日志, 然后在本地的MySQL執(zhí)行一遍,達(dá)到和主服務(wù)器上數(shù)據(jù)文件一致。 4 .啟動(dòng)從服務(wù)器的主從復(fù)制功能。 總結(jié):主從復(fù)制是完成讀寫分離的一個(gè)基礎(chǔ)。(稍微有點(diǎn)延時(shí)) 3.在主服務(wù)器上添加一個(gè)授權(quán)賬號(hào)用來到時(shí)候獲取 bin日志。 客戶端 insertintoselect MySQLM服務(wù) 器0號(hào)name 中間件負(fù)載均

33、衡推)MySQL-prox MySQL-proxy這個(gè)軟件它可以完成請(qǐng)求的分發(fā),它有己知道哪些服務(wù)器是讀服務(wù)器,哪些是寫服務(wù)器,那肯定是需要配置MySQL*pK)xy.給它指定啞些服務(wù)器是讀,哪些是寫 寫攜佗insertupdatedelete我數(shù)據(jù)庫數(shù)據(jù)適成更改的語句 由于怎操作只在身服務(wù)器上完成,但是讀服務(wù)器上并沒有數(shù)據(jù):需要品證數(shù)據(jù)一致性。希里當(dāng)舄服務(wù)器上完成插入數(shù)據(jù)之后.讀服務(wù)器來寫服努器上獲取數(shù)據(jù).保存到讀服務(wù)器上; 注意:對(duì)于讀舄分寓這種架構(gòu),以后不加區(qū)分的把耳服弟號(hào)叫做主服務(wù)器;讀服務(wù)器叫做從服務(wù)器; 負(fù)載均衡器的請(qǐng)求是基于連接 n 不是基干瑕1涪句 讀操作select M夜QL

34、讀眼務(wù)器2號(hào)Inan對(duì) 購飄出寫服務(wù)器natiie MSQL讀服舞器1號(hào)name 優(yōu)化技術(shù) 索引覆蓋 對(duì)于MylSAM的存儲(chǔ)引擎來說,如果查詢的字段信息正好在索引文件里面出現(xiàn),這個(gè) 時(shí)候不需要做回行的操作,直接可以從索引文件里面返回的現(xiàn)象就叫做索引覆蓋。(索引正 好覆蓋了查詢的字段)應(yīng)用:在大數(shù)據(jù)(百萬數(shù)據(jù))下的一個(gè)翻頁效果技術(shù)點(diǎn):翻頁是如何做的? 答:select*fromtableNamelimitoffset,page; 好比現(xiàn)在是N頁,每頁顯示page條 offset=(N-1)*page 實(shí)際使用: mysqlselectcount(x)frompeople; Icount()I+

35、I4236744I 1rowinset(2.17sec) 分頁操作 mysqlselectxfrompeopleUnit10,10; IMII IFIg.wangQ.tnI IFIquonne.zhangcn.bureauueritaa.coitiI IFIjiangzhaohongQSI IHINULLI IFIzhangzQhbsanhuan.contcnI IFIarah_fen9G INI IFIchen_xidcuicse,comI IFIamandaQ 當(dāng)很大頁碼的時(shí)候na(nIgenderIitiail 紅玲來蘭恒瑩彗昭瑤崢彬鵬曦惠孫王張蔣陳張馮葉陳王 1Qroktein sel

36、ect*frompeoplelimit000000,10; IidIno_indexInameIgenderIemailI +-+ 10rowsinset(3.64sec) 通過上面的對(duì)比發(fā)現(xiàn),MySQL在使用limit分頁的時(shí)候,在頁碼足夠大的情況下,效率是很 低的,為什么? 答:主要原因是,MySQL在使用limit做查詢的時(shí)候,如下sql: select*fromtableNamelimitoffset,page; 執(zhí)行過程: 先取出0ffset+page條記錄,然后在丟棄offset條記錄,返回page條記錄。 所以有必要對(duì)這種情況做優(yōu)化操作: 1 .從業(yè)務(wù)上完成(限制用戶的行為,不允

37、許翻頁超過規(guī)定的頁碼) 網(wǎng)頁網(wǎng)頁新聞貼吧知道音樂圖片視頻地圖文庫更多為新聞貼吧知道音樂圖片視頻地圖文庫更多為 百度為您找到相關(guān)結(jié)果也吧吧7搜索工具 口口h口入門口入門. .海進(jìn)兄弟連,活該你成功!海進(jìn)兄弟連,活該你成功!I口口ho難嗎難嗎推廣鏈接熱點(diǎn).叩hpA門優(yōu)勢(shì):200除家企韭任你選|你的人生就對(duì)了 兄弟連ph3門,玩命學(xué)習(xí),挑戰(zhàn)自我,萬余名程序員的共同選擇兄弟連phpk門,你的圈子對(duì)了,你的人生就對(duì)了次),70*1和7 2016-03/*a 2口入門利稽一教程 百度限制用戶行為: 4000002H000003(000004(000005 H0Q0Q064000007H00000840O0

38、Q09 40000104000cHi 4000014H00001540000164000017 4060013 4000019HD000264660621 4000022H000023 林飛蘭安安超強(qiáng)家悅林燕明哲洋長章應(yīng)榮李康張徐林趙韓李倪王 IFINULLIIMINULLI IFINULLI IMINULLI IMINULLI IMINULLI IMINULLI IMINULLI IMINULLI IMINULLI 后度 ph函已置 百度一下 學(xué)口hr:需塞什么基礎(chǔ)phu二次開發(fā)數(shù)程 提示F為了提供最相關(guān)的菇果,我們省略了一些內(nèi)容相似的條目.點(diǎn)去這里可以看到所有度量 物強(qiáng)物強(qiáng) 相關(guān)接密相關(guān)接

39、密 加遇過查置百支的分頁. M博道罐百度在搜索的時(shí)候是限 口m白伯m酉已苴曳了弓二工一為三 2 .不從限制用戶的行為上去考慮,可以使用索引來實(shí)現(xiàn)。 a)select*fromtableNamewhereidNumberlimitpage; mysqlselectfrompeoplewhereid29limit10; IidIno_indexInameIgenderIemail IFI.cnI FI11CX20C2Q1G3,CQIIII IFIfenpiSaOsinacomI IFIcy_qing163,comI HIgemini931gmdiL.comI I7HjingjingQ163.con

40、I IMIipauo1&3,comI IMIzhpngning_xu520Qsina.coin.enI IFIcy_1DIdShotniai1-conI IHIuelax_uu(3sohurcomI 10rowsin(Q.OQeec) 當(dāng)分頁頁碼變大的情況下: select*frompeoplewhereid4000034limit10; 10rowsinset(0,00sec) 通過使用whereidNumberlimit10;這樣由于可以使用上id的主鍵索引, 所以可以快速的定位, 達(dá)到一個(gè)大數(shù)據(jù)的分頁的效果。 問題: a. select*fromtableNamewhereidNumbe

41、rlimitpage; b. select*fromtableNamelimitNumber,page; no_indexIname r+ IgenderIemailI HOO0O36HoeeesTG0D03S00003914GQDD4O400OG410000424Q0D043 UOOO04 400004840。 耿9M000D50000051 000052400005340000544000055000056 流瓊富蜂利珍紅賓雄小宏雄福凌珍春宏錦陳陳陳柯張張何劉郭李 IMINULLIIMINULLI IHINULLI IMINULLI IMINULLI IMINULLI IFINULLI I

42、FINULLI IHINULLI IFINULLI pripS己宜環(huán)境prp5曲己直 phDl清文件liriLK口hpj清 iisun唯,苜口rnm配苜 蘭jiji鵬鳴龍患效芬陽場(chǎng)回國爭(zhēng)妍曉王陳裴普孫潘徐陳吳 當(dāng)上面的這兩條sql語句執(zhí)行后,結(jié)果在什么時(shí)候完全一致,什么時(shí)候不一致? 答:當(dāng)數(shù)據(jù)沒有被物理行刪除的時(shí)候。這個(gè)時(shí)候數(shù)據(jù)是一致的,但是有物理行刪除的時(shí) 候,數(shù)據(jù)是不一致的。 如何解決上面的問題? 答:既然是物理行刪除造成的,那就不做物理行的刪除,只做邏輯刪除(設(shè)置一個(gè)is_delete字段0代表沒有刪除1代表已經(jīng)刪除)。 使用邏輯刪除之后,數(shù)據(jù)會(huì)一致,只要在數(shù)據(jù)顯示的,在顯示層面(HTM

43、L)讓is_delete=1不顯示出來即可。if(is_delete=1)echo該條信息已被刪除!例如:常見的百度貼吧, 網(wǎng)易新聞端。 3.實(shí)現(xiàn)物理行刪除,不限制用戶行為 答:這個(gè)時(shí)候可以使用索引覆蓋+延時(shí)關(guān)聯(lián)技巧來實(shí)現(xiàn)。 分析: 程序代碼實(shí)現(xiàn): 在php層面實(shí)現(xiàn) 1 .由于主鍵id是可以快速查找,先查出滿足條件id mysqlselectidfrompeoplelimit1000,10; + IidI I161655II3218355I I2933156I I78972I I2773856I I104331I I2616555I I9S27I I91G54I I80697|+4- 2 .然

44、后根據(jù)id快速的去查找對(duì)應(yīng)的記錄 foreach($dataas$k=$v) $sql=select*fromtableNamewhereid=$v; $res=mysql_query($sql); $row=mysql_fetch_assoc($res); $result=$row; $result/分頁數(shù)據(jù) 在MySQL層面聯(lián)表處理: 使用聯(lián)表來完成大數(shù)據(jù)的分頁操作 .id,p1FnamefrompeopleBS )astrapontrap.id=pl.id: 1616553218355293315673S72 2773856 184331 2616555$5279110543QG97 解

45、釋 irysql?select*frompeopleliinit4000000,10,執(zhí)行該語句的時(shí)候, 需要先關(guān)聯(lián)4000000次來查詢數(shù)據(jù) nysqlselectpLid,pLnammfrompeopleasplinnerjoin(selectidfrompeopl elimit10010)ast叩ont匹.id-pl,id; 執(zhí)行該領(lǐng)1的時(shí)候,先利用索引覆蓋快速的取出1蹶據(jù),然后利用id做回行將數(shù)據(jù)取出來 面試題 5卷“以力pusemaGesen二-dkb三二n謂優(yōu)化FSOL語隹,. .tnynusers*herezW* 14Q237S923anduisemame= b-seied*fr

46、omwsers=W 2J瑞寫_號(hào)處法紀(jì)干二生二5:一與二二三于工 A、B、C條件表達(dá)式 1 .由于A&B&C在A、B、C都為真的情況下,那么B&C&A或者C&A&B最終的結(jié)果都真; 如果A、B、C其中有一個(gè)或者多個(gè)為假的情況下,那么B&C&A或者C&A&B最終的結(jié)果是假; 所以通過上面的證明:&運(yùn)算滿足交換律。 那么對(duì)于該條sql語句,通過交換律 plinnerjoin(selectidFrom 東遠(yuǎn)房明曼偉 安家繼良賽鴻麗博山建 馬馬馬馬馬駱高高高高 ysqlselectpllimit1000h10 rowsinst .01sec) select*fromuserswheredescript

47、ionlike%麥光科技andcreated=1402378923andusername=magit; 與 select*fromuserswherecreated=1402378923andusername=magitanddescriptionlike%麥光科技;等價(jià); 2 .寫一條sql語句,用來統(tǒng)計(jì)五月份每天的注冊(cè)人數(shù) 1 .統(tǒng)計(jì)(聚合函數(shù)count。) 2 .5月份 時(shí)間戳能不能有函數(shù)做一下時(shí)間戳格式化操作 FROM_UNIXTIME(1234567890,%Y-%m-%d%H:%i:%S) 叫SELECT*XTIHEfcreated, ,froni_unixtime(created

48、,工 Xd)fromyuangongwhr FRQMUNI Xm)=5 ; +T ,|= 1id1usernBue 1 1description1 created1froii_unixti m(cratem(crated d ,XV-Xih-Xd)1 TT 一一。一一 T 11I白eion T. 1male 1heagoodman!I 1431H04603I2015-65-12 1 121bill 1 1male 1billisbilll1 143149100312015-05-13 1 131ruby 1firale 1rubyisbaashiI1 1431H7G&03I2015-05-13

49、 1 141lily IH苜1電 1billisbill!1 1H31343403I2015-05H 1 151andy 1 1fmale 1ruby15baomhi,1 14313638831291505-11 1 Ji i_ _JliiL- nr 3.每天-分組(groupby):分成每天 LsqlSELECTcount(x),from_unixtime(created,XV-Xm-Xd)fromLjuanqongwhtreRQM_UNIXTIHE(created,Xm)=5group兇from_uriLXtime(created,Xd); Iccunt(x)Ifroifi_unixtim

50、e(created,)I 2I2015-05-11 1I2915-05-12 2I2015-G5-13 3rowineot(0.00sc) 小技巧 1. 快速復(fù)制一張表 a,復(fù)制表結(jié)構(gòu) mysqlcreatetablensllikens;QueryOK,Growsaffected(0.02sec) mysqldescnsl;.JLA.,.一上-_X 1Field1Type1Null1Key1Default1Extra1 1id1int(10)unsigned1NO1PRI1NULL1autc_increment1 1title1uerchar(40)1NO11NULL1-1 1img1uarc

51、har(GO)1NO1111 1contentsItext1YESIINULLII 4rowsinset(G.02sec) myeqldescns; 1Field1Type1Null1Key1Default1Extra1 1id1int(1D)unsigned1NO1PRI1NULL1auto_increm&nt1 1title1uarchar(40)1NO11NULL1-1 1img1uerchar(Ga)1NO1111 1contentsItextIVESIINULLII 4rowsinset(Q.02 b,復(fù)制表數(shù)據(jù) #insertintonew_tableselect*fromold_

52、table; mysqlinsertintons2select*fromnsl; -MqTV_ 2. MySQL索引 記住:索引是排好序的快速查找結(jié)構(gòu)。 1. where條件后 2,排序字段或者范圍 3. B-TREE結(jié)構(gòu)和聚簇結(jié)構(gòu)3.視圖, 是復(fù)雜sql語句的一個(gè)快捷方式。 本身不是表, 只是為了減少記憶成本。 叫wqlcreateuiewregistejcount|5ELECTcountO),from.unixtime(created,XV-工m-YcT)fromUMangshQuhereFROM_UNIXTIME(created,乂楙)=5groupbufron_unix tin9(h%

53、d); QueryOK,0rowsaffected(0.60sec) imysqlshowtables; ysqlshowtables; TablesintestI attrcityempgoods_kcitindexkcnewsnsnslns2DfiODle I register_countsongsulyuangong mysqlselect聶fromregister_count; Icount(x)Ifrom-unixtimefcreatedFI 卜-一一一十*-4 I2I2Q15-05-11I I1I201505-12I I2I2015-05-13I 注意:一般復(fù)雜的sql語句都是運(yùn)維

54、寫好的,做好了視圖,開發(fā)人員只需要調(diào)用即可。 4.MySQL中常見函數(shù) 日期函數(shù): a) from_unixtime(time,%Y-%m-%d%H:%i:%S); ysqlselectfrom_unixtime(121212331,*%Y-Xm-XdZHiZizXS); + fromunixtime(121212331,XV-Zm-XdXH:Xi:XS)I 十 1973-11-0406:05:31I + rowinset(0,QDsec) b) now(); mysqlselectnow(); +4 Inow()I +4 I2016-O3-Q416:25:01I 1rowinset(9,90

55、sec) 連接函數(shù) concat mysqlselectconcat(name,:*,uals)fromattr; + Iconcat(name,1:*Tuals)I l-顏色:紅色+I I聲地;深圳I I重量二5。日9I I制式:3GI group_concat(SEPARATOR)將多行數(shù)據(jù)按照分隔符拼接成一行記錄 mysqlselectgroup_concat(nameSEPARATOR)fromattr;+-+ Igroup_concat(nameSEPARATORb)I + I顏色產(chǎn)地重量br/制式I 1rowinset(0.00sec) 實(shí)際使用場(chǎng)景:冏晶名郎廂旺廂旺 諾基亞哈諾基

56、亞哈5 F306 sql語句: selectgroup_concat(nameSEPARATOR)from(selectconcat(name,:,vals)asnamefromattrwhereid1)astmp 測(cè)試函數(shù): benchmark(count,exp) 能讓exp表達(dá)式執(zhí)行count次 mysqlselectbenchmark(1GOOOGO,10000001888889988);+ Ibenchmark(1000000.1000000 x1888889988)I+卜 I0I 顏色顏色: :黑色黑色 制式制式:3G 顏色顏色: :灰色灰色 +-+ 1rowinset(0.03s

57、ec) myaqlselectbenchmark(22OOO0eO,123223023201888889988); 搜狗拼音半: 通過這個(gè)函數(shù)可以模擬一個(gè)慢查詢的操作記錄 lease將字符串轉(zhuǎn)換為小寫 ucase將字符串轉(zhuǎn)換為答謝 length獲取字符串長度 my&qlselectlcade(*N*);4-4- IIcaseCNJI+ InI + 1rowin3t(0.OGsec)mysqlselectucase(n);+ Iucase(ln*)I+ INI + 1rowinset(0.06sec) 面試題: 5.重排auto_increment(自己測(cè)試數(shù)據(jù)的時(shí)候會(huì)使用) 1. trunca

58、tetableName這個(gè)可以使用自增id還原為1 linysqltruncatensl; IdueryOK,0rowsaffected(000SPCJ my$qlinsertintons1uaLues(nullhtitle/./ing/1jP9dthisis曰content1); QueryQK,1rowaffected(0.02eec) ihLj$qlde*nsl;4+4+ IFieldITypeINullIKeyIDefaultIExtraI i1+卜 IidIint(10)unsignedINOIPRIINULLIauto_increnentI ItitleIuarchar(4Q)IN

59、OIINULLI-I IimgIuarchar(GO)INOIIII IcontentsItaxtIYESIINULLII i+k 4rowsinst(0.01sc) my導(dǎo)qlselectMfroransl; +-+ IidItitleIimgIcontentsI 三一一-X-一一三二三-La I1ItitleI./img/1.jpgIthisisacontentI +二二二一+ 1 rowinset(Q.GQsec) 2 .可以使alter關(guān)鍵字做修改 a)當(dāng)刪除完數(shù)據(jù)之后 b)在執(zhí)行這條語句altertabletableNameauto_increment=1;可以使得主鍵的自增id從

60、1開始 6.巧妙的取出隨機(jī)三條信息,如果現(xiàn)在有100w行記錄,隨機(jī)取三條 場(chǎng)景:抽獎(jiǎng)叫sqlselectidfromnewsorderbyrand()limit3; IidI+-+ I5I I8| I2I+ 3rowsinset(0.00sec) I0.5564740817588513I 1 rowinGatiO.O0j 7 .mysql幫助Linux下有問題都找那個(gè)man幫忙#manlshelp? helpgrant mysqlhelpgrant Name:,GRANT, Description: Syntax: GRANT priu_type(column_list) ,priu_typ(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論