久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

MySQL表設(shè)計與查詢優(yōu)化:從建表規(guī)范到慢查詢實(shí)戰(zhàn)

MySQL表設(shè)計與查詢優(yōu)化:從建表規(guī)范到慢查詢實(shí)戰(zhàn) 1. 先把“表”這件事想清楚字段、類型與約束只要是接觸過MySQL的人應(yīng)該都有過這種經(jīng)歷剛開始建表時特別隨意字段類型憑感覺選約束能不加就不加等業(yè)務(wù)跑了大半年數(shù)據(jù)量上來之后才發(fā)現(xiàn)一堆歷史遺留問題——查詢慢、亂碼、數(shù)據(jù)對不上、沒法統(tǒng)計。再回頭改表結(jié)構(gòu)又怕鎖表影響線上業(yè)務(wù)。所以聊MySQL表操作和查詢之前我想先說說建表階段那些容易被忽略、但影響極其深遠(yuǎn)的基礎(chǔ)設(shè)計問題。畢竟表結(jié)構(gòu)設(shè)計得是否合理直接決定后面所有查詢語句好不好寫、跑得快不快。1.1 字段類型選錯了后面全是淚字段類型是表結(jié)構(gòu)里最基礎(chǔ)但也最容易出錯的地方。很多新手喜歡“省事”所有字符串一律用varchar(255)所有數(shù)值一律用int日期就放一個字符串字段存進(jìn)去。短期看確實(shí)沒問題等數(shù)據(jù)量到了幾百萬行各種問題就來了字符串類型的日期沒法直接用日期函數(shù)做范圍統(tǒng)計int存不下手機(jī)號直接溢出varchar(255)在utf8mb4字符集下單字段索引長度超限導(dǎo)致索引失效。這里我直接給一套常用的選型參考整數(shù)能用int就別用bigint能用tinyint就別用int。狀態(tài)值、開關(guān)值用tinyint主鍵用bigint還是int取決于業(yè)務(wù)量預(yù)估但不要一拍腦袋就給所有表都上bigint。小數(shù)不要用float和double存金額精度丟失的問題在實(shí)際項(xiàng)目中非???。用decimal比如decimal(10,2)10表示總位數(shù)2表示小數(shù)位。字符串定長的用char比如身份證號、手機(jī)號這種長度固定的變長的用varchar但要給合理的最大長度別一上來就255。長文本用text但要注意text字段不能有默認(rèn)值索引也只能前綴索引。日期時間這個特別值得多說一句。強(qiáng)烈建議用datetime不要用timestamp因?yàn)閠imestamp有2038年的上限問題。另外不要用字符串存日期雖然看起來方便但丟了時間函數(shù)的便利性也無法利用索引做高效的區(qū)間查詢。有人可能會問datetime和timestamp到底差在哪。簡單說timestamp存儲的是UTC時間存的時候會轉(zhuǎn)時區(qū)取的時候也會轉(zhuǎn)回來受時區(qū)設(shè)置影響datetime存的就是字面時間不涉及時區(qū)轉(zhuǎn)換。對于業(yè)務(wù)系統(tǒng)來說大多數(shù)情況下datetime更直觀、更可控避免因?yàn)閿?shù)據(jù)庫時區(qū)和應(yīng)用時區(qū)不一致造成數(shù)據(jù)錯亂。1.2 約束與索引建表時一次想好別等數(shù)據(jù)量大了再回頭約束是很多人建表時最容易忽略的東西。常見的主鍵約束、唯一約束、非空約束、默認(rèn)值約束以及外鍵約束我發(fā)現(xiàn)很多項(xiàng)目干脆一個外鍵都不用。不用的原因也簡單外鍵在寫入的時候有額外的校驗(yàn)開銷分布式拆分表的時候也麻煩所以業(yè)務(wù)系統(tǒng)基本都靠應(yīng)用層來保證關(guān)聯(lián)數(shù)據(jù)的完整性。這可以理解但至少主鍵、唯一鍵、非空、默認(rèn)值這些基礎(chǔ)約束該加就得加。主鍵的選擇上我建議用自增int/bigint作為主鍵業(yè)務(wù)字段不要直接當(dāng)主鍵。原因有兩個一是InnoDB是聚簇索引組織表主鍵是物理存儲的順序依據(jù)自增主鍵能保證插入時順序?qū)懭霚p少頁分裂二是業(yè)務(wù)字段的變更不可控拿手機(jī)號當(dāng)主鍵哪天允許用戶改綁手機(jī)號整個索引結(jié)構(gòu)都得跟著動。唯一約束這塊要注意它和普通索引的區(qū)別。唯一約束本身就是索引只是額外加了唯一性校驗(yàn)。所以如果業(yè)務(wù)上需要保證某個字段唯一直接加unique key不要用普通索引之后再在應(yīng)用層做查詢校驗(yàn)既慢又容易有并發(fā)漏洞。還有個很實(shí)用的習(xí)慣每張表都加上創(chuàng)建時間和更新時間兩個字段類型用datetime更新時間可以靠業(yè)務(wù)代碼維護(hù)也可以建表時用ON UPDATE CURRENT_TIMESTAMP自動更新。這兩個字段在排查數(shù)據(jù)問題時幾乎是救命稻草尤其是出現(xiàn)臟數(shù)據(jù)、重復(fù)數(shù)據(jù)、異常數(shù)據(jù)的時候能迅速定位出問題時間點(diǎn)。1.3 字符集與排序規(guī)則亂碼和排序不對的頭號原因字符集問題可以說是MySQL新手時期最常遇到的坑之一。我記得第一次接手一個老項(xiàng)目明明代碼里都是UTF-8數(shù)據(jù)庫里卻出現(xiàn)一串問號和亂碼排查了半天最后發(fā)現(xiàn)庫的默認(rèn)字符集是latin1。這種問題一旦上線之后再想改代價非常大。所以在建庫建表的時候第一件事就是明確字符集?,F(xiàn)在的統(tǒng)一標(biāo)準(zhǔn)就是utf8mb4注意不是utf8。MySQL里的utf8是utf8mb3的別名只支持最多3字節(jié)的字符像emoji這種4字節(jié)字符就存不了會報錯或者變成亂碼。utf8mb4才是真正的“完整UTF-8”兼容所有Unicode字符。排序規(guī)則也要一并確認(rèn)。utf8mb4_general_ci和utf8mb4_unicode_ci是兩種常見選擇。前者排序快但精度略差后者排序更準(zhǔn)確但稍微慢一點(diǎn)。絕大多數(shù)業(yè)務(wù)系統(tǒng)其實(shí)用哪個差別都不大需要重點(diǎn)注意的是別出現(xiàn)表、庫、連接層字符集不一致的情況。判斷起來也簡單執(zhí)行一次查詢?nèi)绻l(fā)現(xiàn)中文亂碼先別急著改數(shù)據(jù)從客戶端連接、到數(shù)據(jù)庫連接、再到表和字段的字符集一層層排查。最常見的坑是連接層用了utf8而表和字段是utf8mb4中文正常遇到特殊字符就出問題。2. 建表、改表、刪表一張表的完整生命周期管理前面說了設(shè)計層面的問題接下來就進(jìn)入實(shí)際操作環(huán)節(jié)。表操作無非就是建表、改表、刪表這三類但每一類里都有不少細(xì)節(jié)值得展開。很多人寫SQL的時候只關(guān)心能不能跑通忽略了操作帶來的影響面尤其是生產(chǎn)環(huán)境里一條ALTER TABLE就可能把整個業(yè)務(wù)拖垮。2.1 建表從需求到DDL落地的實(shí)操寫法先看一個實(shí)際的建表示例。假設(shè)要建一張用戶訂單表包含訂單號、用戶ID、商品名稱、訂單金額、訂單狀態(tài)、創(chuàng)建時間、更新時間這些基本字段。第一版DDL可以這樣寫CREATE TABLE orders ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 主鍵ID, order_no VARCHAR(64) NOT NULL COMMENT 訂單號, user_id BIGINT NOT NULL COMMENT 用戶ID, product_name VARCHAR(128) NOT NULL COMMENT 商品名稱, amount DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT 訂單金額, status TINYINT NOT NULL DEFAULT 0 COMMENT 訂單狀態(tài)0待支付 1已支付 2已取消, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 創(chuàng)建時間, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新時間, PRIMARY KEY (id), UNIQUE KEY uk_order_no (order_no), KEY idx_user_id (user_id), KEY idx_created_at (created_at) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci COMMENT用戶訂單表;這個建表語句里的幾個細(xì)節(jié)值得展開說明一下。首先是ENGINEInnoDBMySQL 5.7之后默認(rèn)就是InnoDB但寫出來更明確。InnoDB支持事務(wù)、行級鎖、崩潰恢復(fù)是絕大多數(shù)業(yè)務(wù)場景的唯一選擇。有些人可能聽說過MyISAM查詢快但它不支持事務(wù)、不支持行鎖寫并發(fā)一高就全線阻塞真不適合業(yè)務(wù)系統(tǒng)用。其次是每個字段都加了COMMENT注釋。這個習(xí)慣非常好。一個項(xiàng)目壽命往往遠(yuǎn)超想象兩三年后你自己回頭維護(hù)這張表如果沒有注釋真的會想不起來某個字段是干什么用的。更不用說團(tuán)隊協(xié)作別人接手你的表結(jié)構(gòu)時良好的注釋能省下大量溝通成本。再注意到status字段用的是TINYINT而不是VARCHAR或者ENUM。用數(shù)字表示狀態(tài)擴(kuò)展性好0、1、2不夠用隨時可以加。但這里有個小建議數(shù)字狀態(tài)值一定要配注釋說明含義否則時間長了沒人知道1代表什么。不過更推薦的做法是在應(yīng)用層代碼里定義狀態(tài)常量注釋輔助解釋兩邊對應(yīng)著看。2.2 ALTER TABLE加字段、改字段、加索引的常見操作業(yè)務(wù)迭代過程中表結(jié)構(gòu)幾乎一定會變。ALTER TABLE的語法比較簡單但生產(chǎn)環(huán)境里要特別注意執(zhí)行成本和鎖表風(fēng)險。加字段是最常見的操作。比如給訂單表加一個支付時間字段ALTER TABLE orders ADD COLUMN paid_at DATETIME DEFAULT NULL COMMENT 支付時間 AFTER status;這里有一個非常實(shí)用的習(xí)慣把新字段用AFTER關(guān)鍵字放在相關(guān)字段旁邊而不是默認(rèn)加到最后。雖然最終效果不影響查詢但看表結(jié)構(gòu)時邏輯會更清晰。另外注意在數(shù)據(jù)量很大的表上執(zhí)行ALTER TABLEInnoDB需要重建表會鎖住寫操作耗時可能非常長甚至導(dǎo)致主從延遲。直到MySQL 5.6引入了在線DDL加上MySQL 8.0的進(jìn)一步優(yōu)化很多ALTER操作已經(jīng)不會完全鎖表了但字段類型變更、修改字符集這類操作仍然可能很重。所以在生產(chǎn)環(huán)境做表結(jié)構(gòu)變更前我一般會先確認(rèn)表的行數(shù)和當(dāng)前實(shí)例的負(fù)載盡量挑業(yè)務(wù)低峰期操作。修改字段類型和默認(rèn)值也是高頻操作。語法如下ALTER TABLE orders MODIFY COLUMN status TINYINT NOT NULL DEFAULT 1 COMMENT 訂單狀態(tài)0待支付 1已支付 2已取消 3已退款;同樣一個MODIFY操作看似簡單但如果表很大執(zhí)行期間同樣是有代價的。而且MODIFY COLUMN會改變字段的整條定義如果你只寫了一部分屬性其他屬性會被重置所以執(zhí)行前最好先用SHOW CREATE TABLE把原有定義完整看一下再確認(rèn)要改的信息避免誤把已有的NOT NULL、DEFAULT等屬性弄丟。加索引的常見操作ALTER TABLE orders ADD INDEX idx_user_created (user_id, created_at);這是一個典型的聯(lián)合索引能夠同時優(yōu)化“查某個用戶的訂單按時間倒序”這類高頻查詢。聯(lián)合索引的核心設(shè)計原則是區(qū)分度高的字段放前面等值查詢字段放前面范圍查詢字段放后面。這個后面講到查詢優(yōu)化時還會再展開。2.3 刪表與清空DROP / TRUNCATE / DELETE的本質(zhì)區(qū)別刪表有三種方式很多人分不清它們的適用場景。DROP TABLE是整張表直接刪掉表結(jié)構(gòu)、數(shù)據(jù)、索引全部消失不可恢復(fù)。TRUNCATE TABLE是清空數(shù)據(jù)但保留表結(jié)構(gòu)相當(dāng)于重置這張表不可按條件刪也不能回滾。DELETE FROM是逐行刪除可以帶WHERE條件且走事務(wù)可以回滾。所以日常開發(fā)中真正不要這張表了才用DROP想要快速清空一張臨時表或日志表的數(shù)據(jù)用TRUNCATE刪除符合條件的部分?jǐn)?shù)據(jù)用DELETE。這里特別提一個問題很多人誤以為DELETE之后數(shù)據(jù)量還是沒降下來。這是因?yàn)镮nnoDB刪除的行標(biāo)記為“已刪除”但物理空間沒有被立即釋放后續(xù)有新數(shù)據(jù)插入時才會復(fù)用這些空間。如果只是跑了一次DELETE FROM大表磁盤空間不變是很正常的不要慌張。想要真正收縮表空間可以執(zhí)行OPTIMIZE TABLE或者ALTER TABLE ... ENGINEInnoDB來重建表但這又是一個重操作生產(chǎn)環(huán)境慎用。3. 單表查詢SELECT的核心邏輯與執(zhí)行順序聊完表操作進(jìn)入查詢部分。查詢是MySQL里最日常、也最考驗(yàn)功力的操作。很多人寫了幾年的SQL遇到慢查詢還是只會加索引其實(shí)很多問題的根源不在于缺索引而在于沒有真正理解SELECT的執(zhí)行邏輯。3.1 SELECT語法順序與執(zhí)行順序是兩碼事這是個老生常談卻又極其重要的話題。一條完整的SELECT語句書寫的順序是SELECT 字段 FROM 表 WHERE 條件 GROUP BY 分組字段 HAVING 分組后條件 ORDER BY 排序字段 LIMIT 偏移量, 行數(shù)但SQL真正執(zhí)行的順序不是這個。MySQL會先走FROM找到數(shù)據(jù)源然后WHERE過濾原始數(shù)據(jù)再GROUP BY分組之后HAVING過濾分組結(jié)果接著SELECT投影目標(biāo)字段然后ORDER BY排序最后LIMIT截取。理解這個執(zhí)行順序最直接的好處是能解釋很多“奇怪”的現(xiàn)象。比如WHERE條件里不能用SELECT中定義的別名因?yàn)閃HERE執(zhí)行時SELECT還沒執(zhí)行別名自然不存在。而ORDER BY可以用別名因?yàn)榕判虬l(fā)生在SELECT之后。再比如為什么GROUP BY之后SELECT能用的字段要么是分組字段要么是聚合函數(shù)的結(jié)果因?yàn)榉纸M后每組只保留一行其他字段的值可能有多條MySQL無法確定取哪個在嚴(yán)格模式下會直接報錯。我見過一個很典型的案例某個統(tǒng)計報表里SQL寫得特別長里面在WHERE里判斷了一個用CASE WHEN生成的別名結(jié)果一直報錯。我當(dāng)時給出的修改方案就是把那個判斷挪到HAVING里或者在外面再包一層子查詢問題立刻解決。這種問題如果不懂執(zhí)行順序光看報錯信息很難定位。3.2 WHERE過濾條件的類型陷阱和經(jīng)驗(yàn)寫法WHERE是查詢中最常用、也最容易埋坑的子句。最常見的一個坑是類型不一致導(dǎo)致索引失效。比如表里user_id是VARCHAR類型但查詢時傳了一個數(shù)字MySQL會把字符串類型字段隱式轉(zhuǎn)換成數(shù)字來比較導(dǎo)致該字段上的索引無法使用。反過來也一樣如果字段是INT類型查詢條件里傳了字符串同樣存在隱式轉(zhuǎn)換。所以一條基礎(chǔ)經(jīng)驗(yàn)是字段類型和條件值類型保持一致別讓MySQL幫你做隱式轉(zhuǎn)換。還有一個常見問題是函數(shù)包裹字段。比如在創(chuàng)建時間字段上寫了WHERE DATE(created_at) 2024-01-01乍一看沒毛病但實(shí)際上DATE()函數(shù)讓created_at無法直接使用索引MySQL不得不對每一行執(zhí)行函數(shù)計算然后再過濾。正確寫法是改成范圍條件WHERE created_at 2024-01-01 AND created_at 2024-01-02這是一個非常高頻的優(yōu)化點(diǎn)凡是出現(xiàn)“查詢慢但明明加了索引還是慢”的情況第一反應(yīng)就應(yīng)該是檢查WHERE條件里有沒有對索引字段使用函數(shù)或者做了隱式轉(zhuǎn)換。如果要表達(dá)得更嚴(yán)謹(jǐn)一點(diǎn)想讓索引生效就要讓索引字段保持“裸狀態(tài)”不做任何包裹計算。3.3 GROUP BY與HAVING分組統(tǒng)計的正確姿勢GROUP BY用于對數(shù)據(jù)進(jìn)行分組統(tǒng)計是報表類需求的基石。比如統(tǒng)計每天訂單數(shù)SELECT DATE(created_at) AS day, COUNT(*) AS order_count FROM orders WHERE created_at 2024-01-01 GROUP BY day ORDER BY day;注意這里的DAY這個別名在GROUP BY和ORDER BY里都能用因?yàn)檫@兩步都發(fā)生在SELECT之后。這個寫法在MySQL里是允許的而且很常見。GROUP BY和HAVING經(jīng)常一起出現(xiàn)HAVING用于對分組后的結(jié)果再做過濾。很多人會把HAVING和WHERE搞混記一個簡單的區(qū)別WHERE在分組之前過濾行HAVING在分組之后過濾分組。WHERE不能使用聚合函數(shù)HAVING可以。比如要找出訂單數(shù)超過100的用戶IDSELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id HAVING order_count 100;這條SQL是先按用戶分組統(tǒng)計再過濾出訂單數(shù)大于100的用戶。如果把這個條件放到WHERE里就會直接報錯因?yàn)镃OUNT的值在WHERE階段根本還沒算出來。還有一點(diǎn)要注意HAVING的效率通常比WHERE差因?yàn)镠AVING要等分組完成才能過濾所以能用WHERE提前過濾的數(shù)據(jù)盡量在WHERE階段就過濾掉減少分組壓力。3.4 ORDER BY與LIMIT排序、分頁與深分頁優(yōu)化排序和分頁是日常接口開發(fā)里離不開的操作。最簡單的查詢SELECT * FROM orders WHERE user_id 10001 ORDER BY created_at DESC LIMIT 20;這里有一個聯(lián)合索引設(shè)計的最佳實(shí)踐如果這個查詢是高頻的可以建一個(user_id, created_at)的聯(lián)合索引這樣WHERE定位到用戶后索引內(nèi)部已經(jīng)按created_at排好序了直接取前20條就行省去排序環(huán)節(jié)。這就是前面建表部分提到聯(lián)合索引設(shè)計原則的應(yīng)用。LIMIT的分頁寫法也很常見但深分頁是個隱藏的大坑。比如SELECT * FROM orders ORDER BY id LIMIT 1000000, 20;這條SQL會把前100萬條數(shù)據(jù)都查出來然后丟棄只留下最后的20條。偏移量越大查詢越慢而且是線性增長的。解決思路有幾種。第一種是記錄上一次查詢的最大ID下次查詢帶上WHERE id 上次最大ID的條件用延遲關(guān)聯(lián)或索引覆蓋的方式去翻頁。第二種是子查詢先取偏移段的ID列表再回表拿完整數(shù)據(jù)SELECT * FROM orders WHERE id ( SELECT id FROM orders ORDER BY id LIMIT 1000000, 1 ) ORDER BY id LIMIT 20;這種方式先用索引快速定位到第1000001條的位置再往后取20條比直接LIMIT 1000000, 20高效得多。但要注意這種優(yōu)化方案只適用于有自增主鍵且數(shù)據(jù)沒有頻繁物理刪除的場景如果數(shù)據(jù)有大量隨機(jī)刪除ID之間的空洞會讓分頁結(jié)果不一致。實(shí)際項(xiàng)目中需要結(jié)合業(yè)務(wù)場景權(quán)衡。4. 多表查詢JOIN、子查詢、UNION怎么選單表查詢解決的是單個數(shù)據(jù)源的問題但業(yè)務(wù)需求往往需要關(guān)聯(lián)多張表。多表查詢的實(shí)現(xiàn)方式有三種JOIN、子查詢、UNION。每種方式都有各自的適用場景沒有絕對的好壞關(guān)鍵是要理解它們的執(zhí)行邏輯。4.1 JOIN家族INNER、LEFT、RIGHT的區(qū)別與場景JOIN是關(guān)聯(lián)查詢最核心的寫法。最常見的三種是INNER JOIN、LEFT JOIN、RIGHT JOIN。網(wǎng)上有很多圖解釋它們的區(qū)別這里我用實(shí)際業(yè)務(wù)來舉例說明。假設(shè)有兩張表用戶表users和訂單表orders。想知道“哪些用戶下過單”用INNER JOIN只返回兩邊都匹配的行SELECT users.id, users.name, orders.order_no FROM users INNER JOIN orders ON users.id orders.user_id;想知道“每個用戶和他的所有訂單沒下過單的用戶也要顯示出來”用LEFT JOIN左表數(shù)據(jù)全部保留右表無匹配就以NULL填充SELECT users.id, users.name, orders.order_no FROM users LEFT JOIN orders ON users.id orders.user_id;這個場景最常見的就是列表頁需要展示主表數(shù)據(jù)即使副表沒數(shù)據(jù)也要顯示一行。RIGHT JOIN的用法和LEFT JOIN對稱以右表為主但實(shí)際開發(fā)中用得很少。我個人的建議是統(tǒng)一用LEFT JOIN就好不要混用RIGHT JOIN否則SQL的可讀性會變差團(tuán)隊同事看代碼也不舒服。關(guān)聯(lián)條件上有一個極其重要的坑LEFT JOIN中如果在WHERE里對右表字段加過濾條件會導(dǎo)致“左表保留全部行”的語義被破壞。舉例SELECT users.id, users.name, orders.order_no FROM users LEFT JOIN orders ON users.id orders.user_id WHERE orders.status 1;這條SQL的意圖可能是“查所有用戶中已支付訂單的關(guān)聯(lián)情況”但實(shí)際執(zhí)行時因?yàn)閃HERE在JOIN之后過濾已經(jīng)把左表中沒有匹配訂單的用戶行全部剔除了LEFT JOIN變成了INNER JOIN的效果。想要保持左表全部保留應(yīng)該把過濾條件寫在ON子句里SELECT users.id, users.name, orders.order_no FROM users LEFT JOIN orders ON users.id orders.user_id AND orders.status 1;這個細(xì)節(jié)我已經(jīng)在真實(shí)項(xiàng)目中碰到不止一次每次都是面試題級別的經(jīng)典陷阱而且業(yè)務(wù)上一旦踩中定位問題往往要花不少時間。4.2 子查詢與JOIN的取舍子查詢是嵌套在主查詢里的SELECT語句可以分為FROM子句里的子查詢、 WHERE子句里的子查詢、SELECT子句里的標(biāo)量子查詢幾種。比如要查“每個用戶最近一筆訂單”可以用關(guān)聯(lián)子查詢的方式SELECT o.* FROM orders o WHERE o.id ( SELECT MAX(id) FROM orders o2 WHERE o2.user_id o.user_id );這個寫法理解起來比較簡單但它對每條訂單都會執(zhí)行一次子查詢?nèi)绻麛?shù)據(jù)量大性能會很差。還有一類常見的子查詢是用IN比如SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount 100);這種寫法的隱患是如果子查詢返回的結(jié)果集特別大IN列表會非常長效率不高。而且某些MySQL版本對IN子查詢的優(yōu)化做得不夠好執(zhí)行計劃可能會退化成全表掃描。更穩(wěn)健的做法是用EXISTS改寫或者改成JOINSELECT DISTINCT users.* FROM users INNER JOIN orders ON users.id orders.user_id AND orders.amount 100;用JOIN的語義更直白執(zhí)行計劃可控性也更高。當(dāng)然JOIN之后如果主表數(shù)據(jù)有重復(fù)關(guān)聯(lián)需要加上DISTINCT去重這時要自己確認(rèn)是否會產(chǎn)生重復(fù)行。子查詢和JOIN的選擇沒有絕對標(biāo)準(zhǔn)我的經(jīng)驗(yàn)是小數(shù)據(jù)量、語義直觀的子查詢可以用大數(shù)據(jù)量、性能敏感的查詢優(yōu)先考慮JOIN和EXISTS然后通過EXPLAIN確認(rèn)執(zhí)行計劃。4.3 UNION與UNION ALL別讓去重拖慢查詢UNION和UNION ALL都是將多個SELECT的結(jié)果集合并輸出。區(qū)別在于UNION會去重UNION ALL不去重。這一字之差性能差距可能非常明顯因?yàn)槿ブ匾馕吨枰獙φ麄€結(jié)果集排序或走哈希去重額外開銷極大。業(yè)務(wù)上如果明確兩個結(jié)果集不可能有重復(fù)或者重復(fù)無害直接用UNION ALL就沒問題了。舉一個實(shí)際場景要查“訂單金額大于1000的訂單”和“最近7天創(chuàng)建的訂單”的合并列表。兩個條件有交叉的可能但最終展示訂單列表時重復(fù)也沒關(guān)系所以SELECT order_no, created_at FROM orders WHERE amount 1000 UNION ALL SELECT order_no, created_at FROM orders WHERE created_at NOW() - INTERVAL 7 DAY;這樣比UNION快不少而且邏輯更符合業(yè)務(wù)預(yù)期。另外還有一個容易被忽略的事項(xiàng)UNION的子句之間各SELECT返回的列數(shù)和數(shù)據(jù)類型必須一致否則MySQL會報錯。比如第一個SELECT返回了兩列第二個SELECT返回了三列直接編譯失敗。如果各表中列名不一致第一個SELECT的列名會作為結(jié)果集的列名。5. 提升查詢性能的關(guān)鍵索引與執(zhí)行計劃前面講了很多查詢寫法但真正跑線上查詢的時候性能怎么樣不能靠猜得靠數(shù)據(jù)說話。這一部分重點(diǎn)說索引的坑和EXPLAIN執(zhí)行計劃的用法。5.1 索引失效的幾種常見姿勢索引失效是慢查詢的頭號原因。我總結(jié)過幾條高頻踩坑場景基本覆蓋了日常開發(fā)里90%的問題。第一對索引列使用函數(shù)或表達(dá)式計算。前面已經(jīng)提過WHERE DATE(created_at) 2024-01-01會導(dǎo)致索引失效。同樣地WHERE amount 1 100這種寫法也會讓amount字段的索引失效。第二隱式類型轉(zhuǎn)換。varchar字段和數(shù)字比較、int字段和字符串比較都會讓MySQL放棄索引。第三LIKE模糊匹配以%開頭。比如WHERE name LIKE %張%因?yàn)闊o法確定前綴B樹無法定位只能全表掃。反過來WHERE name LIKE 張%可以走索引。第四聯(lián)合索引不使用最左前綴。建了(a, b, c)聯(lián)合索引條件里直接查b1跳過a索引用不上。這是最左前綴原則決定的。在設(shè)計聯(lián)合索引時一定要把最高頻的等值查詢字段放最左邊。第五OR條件導(dǎo)致索引失效。比如WHERE a 1 OR b 2如果只有a字段有索引MySQL可能選擇全表掃描。優(yōu)化方式是把OR改成UNION或者給b也加上索引。第六對NULL值的判斷。WHERE name IS NULL不一定導(dǎo)致索引失效但WHERE name IS NOT NULL在很多場景下優(yōu)化器會認(rèn)為返回數(shù)據(jù)量太大直接放棄索引。這里沒有絕對結(jié)論實(shí)際操作中以EXPLAIN結(jié)果為準(zhǔn)。第七ORDER BY和GROUP BY的字段順序與索引順序不一致。比如聯(lián)合索引(a, b)但SQL里ORDER BY b, a索引順序不匹配排序走文件排序性能下降。5.2 EXPLAIN怎么看重點(diǎn)字段速查EXPLAIN是排查慢查詢的核心工具。用法很簡單在SELECT前面加個EXPLAIN關(guān)鍵字就行EXPLAIN SELECT * FROM orders WHERE user_id 10001 AND created_at 2024-01-01;返回結(jié)果里重點(diǎn)看這幾個字段type訪問類型。從好到差依次是const、eq_ref、ref、range、index、ALL。出現(xiàn)ALL表示全表掃描要高度警惕。range說明掃描了一個索引范圍比全表掃描好得多。key實(shí)際用到的索引名。如果為NULL說明沒走索引。rows預(yù)估掃描的行數(shù)。這個數(shù)越大查詢通常越慢。Extra額外信息。出現(xiàn)Using filesort或Using temporary說明排序或分組用了臨時文件性能往往不佳出現(xiàn)Using index則說明是覆蓋索引性能很好。舉個實(shí)際排查案例某次線上接口變慢EXPLAIN結(jié)果顯示一條查詢的type為ALLrows達(dá)到500多萬。打開SQL一看WHERE條件里對create_time用了DATE()函數(shù)。改成范圍條件后type變成rangerows降到幾千接口響應(yīng)時間從接近2秒降到幾十毫秒。這就是EXPLAIN的價值——用數(shù)據(jù)定位問題而不是拍腦袋猜。5.3 一個真實(shí)慢查詢優(yōu)化案例之前處理過某業(yè)務(wù)系統(tǒng)的一個慢查詢是訂單列表接口。SQL大概長這樣SELECT id, order_no, user_id, amount, status, created_at FROM orders WHERE user_id 12345 ORDER BY created_at DESC LIMIT 10;表里訂單量接近千萬user_id和created_at各自都是獨(dú)立索引但查詢依然慢。EXPLAIN之后發(fā)現(xiàn)優(yōu)化器在兩個索引之間選擇了一個但Extra里出現(xiàn)了Using filesort也就是排序沒有完全走索引。原因很簡單優(yōu)化器走的是idx_user_id先定位到該用戶的所有訂單再對這些訂單按created_at排序。因?yàn)閏reated_at不滿足索引順序排序操作只能在內(nèi)存或磁盤上做數(shù)據(jù)量一大就慢。解決方案就是前面提到的聯(lián)合索引ALTER TABLE orders ADD INDEX idx_user_created (user_id, created_at);這個聯(lián)合索引既能通過user_id快速定位又能在索引內(nèi)部天然按created_at排好序完美匹配ORDER BY的需求。加上索引之后EXPLAIN顯示Using filesort消失查詢時間從幾百毫秒降到個位數(shù)毫秒。這個案例值得記住的不是SQL寫法本身而是索引設(shè)計要兼顧WHERE和ORDER BY。很多人在聯(lián)合索引上只考慮過濾字段忽略了排序字段結(jié)果WHERE很快但ORDER BY把整個查詢拖慢。6. 常見問題與排查技巧實(shí)錄最后把這些年在MySQL表操作和查詢這塊遇到的高頻問題統(tǒng)一整理成一張速查表方便大家在實(shí)際開發(fā)中對號入座。癥狀可能原因排查思路解決方向中文亂碼字符集不一致或連接層字符集不對檢查庫、表、字段、連接的字符集統(tǒng)一為utf8mb4重建連接并確認(rèn)character_set_server查詢越來越慢缺索引、索引失效或掃描行數(shù)過多執(zhí)行EXPLAIN看type、rows、key補(bǔ)聯(lián)合索引、改寫條件、避免函數(shù)包裹加了索引還是慢索引列被函數(shù)包裹、隱式類型轉(zhuǎn)換或OR條件檢查WHERE里索引列是否“裸狀態(tài)”去掉函數(shù)/轉(zhuǎn)換OR改為UNION或補(bǔ)索引排序慢索引順序與ORDER BY不匹配看Extra是否有Using filesort設(shè)計聯(lián)合索引時把排序字段放進(jìn)去LIMIT翻頁到后面很慢深分頁在大偏移量下掃描大量無用行分析偏移量大小、掃描行數(shù)用ID定位、延遲關(guān)聯(lián)或減少偏移量DELETE后表空間不減少InnoDB的已刪除行空間未立即釋放查看表大小、碎片情況定期OPTIMIZE TABLE或接受空間復(fù)用機(jī)制同一查詢不同環(huán)境結(jié)果不同字符集、排序規(guī)則或數(shù)據(jù)分布差異對比兩邊的表結(jié)構(gòu)定義和數(shù)據(jù)分布用小數(shù)據(jù)量復(fù)現(xiàn)并對比執(zhí)行計劃GROUP BY報錯沒開啟嚴(yán)格模式或SELECT字段與GROUP BY字段不匹配查看sql_mode配置和SQL寫法把非分組字段改為聚合函數(shù)或加入GROUP BY關(guān)聯(lián)查詢數(shù)據(jù)量暴增JOIN條件產(chǎn)生笛卡爾積檢查ON條件是否缺失或條件過寬確認(rèn)關(guān)聯(lián)字段有索引條件收窄查詢結(jié)果包含重復(fù)數(shù)據(jù)JOIN一對一關(guān)系變一對多檢查關(guān)聯(lián)表的唯一性、關(guān)聯(lián)鍵是否有重復(fù)加DISTINCT或調(diào)整關(guān)聯(lián)SQL排查問題的時候有一個實(shí)用心法不要一上來就改SQL。先花兩分鐘看表結(jié)構(gòu)再執(zhí)行EXPLAIN看執(zhí)行計劃最后才動手改。大多數(shù)慢查詢問題在執(zhí)行計劃階段就能露出馬腳改SQL只是收尾動作。還有一個經(jīng)驗(yàn)之談排查過程中把當(dāng)時的表結(jié)構(gòu)、數(shù)據(jù)量、SQL語句、執(zhí)行計劃這四個信息記錄下來問題解決之后再回頭復(fù)盤一段時間下來自己解決問題的能力會提升一大截。表操作和查詢是MySQL最基礎(chǔ)的能力但也是最值得反復(fù)打磨的能力。工作中見到過太多“上線前沒問題跑了一段時間之后突然慢得出奇”的案例究其原因多數(shù)不是SQL本身的問題而是表結(jié)構(gòu)設(shè)計和查詢方式對數(shù)據(jù)增長的適應(yīng)性不足。比如索引設(shè)計沒考慮到數(shù)據(jù)規(guī)模的增長、表結(jié)構(gòu)變更沒有預(yù)留彈性、深分頁沒有提前做容量規(guī)劃。所以我的經(jīng)驗(yàn)是寫建表DDL和查詢SQL的時候多問自己一句這個表和這條SQL在數(shù)據(jù)量再漲十倍、漲百倍之后還能不能撐住帶著這個意識去寫每一行SQL能避掉絕大部分性能坑。最后再分享一個小技巧每張業(yè)務(wù)表都留一個自增主鍵和創(chuàng)建時間字段這兩個字段雖然平淡卻是后續(xù)排查問題時最可靠的抓手。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91色综| 国产探花日韩援交| 天堂九九九九九九九九九| 久操91视频| 欧美色97| 久久香蕉国产线看观看亚洲女人| 色五月激情AV在线| 97超碰亚洲| 91xingse| 五月丁香六月婷| 尤物黄色在线观看网站| 成人五月天丁香激情综合| 91国产丝袜美女| 91亚州日韩高清| 人人色人人操在线| 3p国产欧美99热| 无码久久亚洲高清,| 啊啊啊啊啊啊啊啊视频| 熟妇无码视频三区| 亚洲综合贴图91 | 黄色成品网站| 久久熟女人| 久操婷婷| 精品一区二区亚洲国产| 中文操嬖片。| JIZZJIZZ国产精品喷水| 中国乱伦一区二区| 东北丰满熟女国产一区| 精品偷拍13p欧美dodk视频| 国模无码人体一区二区三| 欧美性第一页| 国产精品美女视频诱惑| 中文字幕久久婷婷丁香五月天| 欧成人在线| 日韩欧美天堂| 9久久久久久| 人人操人人肉久久精品| 一类无码操逼视频| 在线观看日韩av不卡| 伊人影院综合是一个与深夜成人在线| 中国大陆国产高清AⅤ毛片| 变态乱伦伪娘灌肠一区二区| 日本视频在线观看污污污| 日本一级婬片试看三分钟| 亚洲日本激情| 思思热在线cao| 在线播放一级无码视频| 老熟妇一区二区三区…| 五月天色图| 国产欧美一区激情交| 国产按摩一区二区三区| 91在线美女| 精产国品一区二三产品| 2019午夜福利视频| 天天日天天干天天摸天天操| 国产精品久久久无码AV网站| 操逼网站视频漫画国产| 久久久五月天| 天天舔九色婷婷| 日韩资源网| 怡红院网站在线视频| 97干在线视频| 在线免费观看高清无码视频| 无套内射人妻在线播放| 长长久久88视频| 久久久久无码| 国产精品白丝www| 97视频在线看| 亚洲色 国产 欧美 日韩| 国产亚洲精品美女久久久m| 熟女突然公开看18禁影片| 色情综合网| 少妇与黑人高潮在线| 日本顶级天天操狠狠操夜夜操中文字幕| 91精品免费| 91综合网站| 无码丰满熟妇一区二区浪潮AV| aⅴ日韩成人电影av在线免费看av大全| 日本午夜操逼| 有码免费观看| 国产白丝网站| 熟女色综合久久| 国产精品交换一区二区| 男人天堂2030| 亚洲 国产 精品一区| 国产婷婷一区| 亚洲天堂资源在线| 婷婷五月成人| 九色 蝌蚪 熟女自| 久久久精品91八戒| 夜夜国产一区| 碰碰97| 99久久99九九99九九九| 看看日B真人视频| 女性91网站| 亚洲免费人妻在| 一个人在线看的黄色电影网站| 在线观看 99热| 九九视频黄色片| 五月丁香影视| 人人摸人人舔一区二区| 亚洲1区| 91色堂| 黄片视频观看| 无码免费一区二区三区啪啪| 九九精品网| 欧美十八禁网站| 亚洲天堂久久久久久粉红视频| 一级A啪啪啪啪| 青青草成人视频在线观看二区| 久久国产乱子伦精品免费女,网站| 亚洲无无码αⅴ每日更新| 亚洲 日韩 欧美 国产综合体| 加勒比性爱成人在线| 99久久久久久亚洲精品不卡| 中文字幕老熟妇黄色视频| 91亚洲黄色网| 九色婷婷| 欧美桃色网| 在线中文字幕极品av| 96免费视频在线| 国产精品亚洲色婷婷久久久| 丁香五月天婷婷姐| 秋霞一级鲁丝片A片| 九九热精品视频在线观看| 久久婷婷一区| 日本综合色图| 老熟女91| 亚洲色性情三级| 十八禁视频一区二区| 用力操死我| 99久久精品欧美国产| 精品人妻一区二区三区-国产| 亚洲熟妇A V黑人| 日本精品一区三区| 国产精品原创巨作?v网站| 亚洲综合113页| 狠狠色伊人亚洲综合网站色| 久久久免费高清中文视频| 国产无套粉嫩白浆在| 伊人麻豆传媒| 精品9999| 116美女午夜| 国产大陆天天艹| 人乳av| 香蕉婷婷| 黑人精品XXX一区一二区| 熟妇国产免费一区| 天美精品av| 新亚洲无码| 绑缚麻绳人妻寝取完整版| 国产黄片在线免费观看| 欧美日韩亚洲天堂| 91亚洲欧美色图| 十八禁av无码免费网站APP| 久久色一区二区| 欧美黄色大香蕉一区二区| 抽插亚洲无码| 青青国产在线拍揄自揄拍| 凹凸视频在线观看伊人| 天天做天天爱| 91网站18| 97在线视频观看免费| 人妻天天夜夜爽一区二区| 在线中文字幕| 五月婷亚洲精品天堂| 九九九九免费高| 99ri精品| 九月丁香综合网| 免费a v| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 久草毛片| 校园春色综合色| www久久99| 午夜福利av电影在线| 欧美成人精品一区| 婷婷探花久久精品一区| 97碰碰日本乱偷人妻中文的| 天天综合网~69| 免费公开人人操| 思思久热在线精品66| 蜜臀久久精品久久久久视频| 淫乱图区| 67194无码不卡| 日韩AV片| 99操99| 91三级理论片播放器| 探花视频免费观看国产专区| 天天肏视频| 九99久久| 囯产精品强| 91国产大片| 啊啊啊啊嗯嗯嗯用力好爽 | 黄色AAAAA欧美| 91网九色蝌蚪操熟女| 97在线公开视频| 中文字幕第23区| 青青草视频导航官网| 尻女朋友一夜| 91人妻超碰| 看日韩美女二区三区免费操逼视频 | 国内精品伊人久久久久影院会| 最新av中文字幕高清| 久久专区| 国产精品午夜福利亚洲综合网| 蜜臀久久99精品久久久久久| 亚洲小说视频| 97国产超碰| 碰碰97| 免费在线看黄片av| 天天视频网站黄| 免费久久一级毛片大黄| 国产精品久久久久久久毛片1| 精品国产一区探花在线观看| av在线观看不卡网站| 淫荡少妇免费| 女同性恋久久| 激情小说五月天| 日韩啪啪啪啪啪| 国产一区二区三区中文字幕| 久久久久9久久久久| 欧美熟爽综合| 亚洲精品欧美专业| 中文字幕色AV| 天天干电影| 青娱乐休闲视频在线观看| 2019精品国产无码成人| 国产一级黄色片在线观看| 亚洲经典啪啪| 精品国产网站| 日日骚一区二区三区| 久久 精品| 伊人国产成人av网站| 91久久久久免| 欧美少妇第一页| 动漫av中文| 在线天堂资源亚洲| 亚洲日韩精品久久久久一区壹牛 | 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 无码高清操逼网址| 久久一级无码精品毛片6| 97在线精品| 99热超碰| 亚洲国产中文字幕| 五月丁香激情四射| 日韩色| 欧美性爱五月天| 亚洲欧美性生活| 97在线日韩中文字幕| 欧美一二三| 99久久婷婷丁香| 大奶啊啊好爽| 亚洲高清在线se| 精品999999| 人人操人人搞人人草| 久久人妻办公室视频| 97香蕉人人乳| 精品人妻一区二区免费看| 日本中文字幕不卡视频| 国产久久久久久久久一区二区 | 国模无码人体一区二区三| 国产小黄片在线免费观看| 久久久久久亚洲精品中文字幕人妻| 日韩不卡码| 夜夜嗨视频| 日欧亚洲二三区大片不卡| 五月天激情网图片| 精品无码产区一区二| 91婷婷| 搡老女人老91妇女熟女| 精品九九国产无码| 亚洲天堂自拍| 丁香色狠狠色综合久久小说| 狠狠狠狠狠狠| 亚洲男人天堂视频| 青青操综合网| 美女主播色欲91抠b在线播放| 欧美综合天堂| 狠狠色综合网| 少妇精品| 97碰在线视频| 校园春色AV天堂| 无色无码| 另类成人首页一区| 中国东北熟女老太婆内谢| 日韩少妇丰满亚洲| 一级毛片电影免费看| 五月婷婷六月激情| 久久免费少妇| 精品人妻1237| 欧美18老人禁| 国内97干免费看| 人人贴人人摸| 久久久久密臀视频| 亚洲砖码砖专无区2023| 91劲爆| 亚洲成a人在线观看久| 婷婷丁香一区二区三区| 黑人美精品 A片| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 九九碰九九爱97超| 91成人在线| 无码高清操逼网址| 美日韩一二三区| 午夜高清成人在线视频| 精品对白久久不卡| 亚洲啪啪综合?v一区综合精品区| 91综合在线| 超碰97网站| 最新一二三区视频| 日韩精品在线观看观看| 大香蕉日韩欧美| 超碰免费在线| 97超碰人人操人人操| 色鬼在线综合| 思思热在线cao| 日本不卡中文| 97九色人妻| 国产极品粉嫩馒头一线天av| 欧美高潮| AV一二区| 亚洲无码久久久久久久| 91殴美| 超碰99热中文字幕| www.激情| 国产精品亚洲无码| 亚洲综合草草| 精品免费1| 人人干人人操人人..com| 久9综合在线| 韩国轻伦国内自拍一区| 人人插人人摸人人| 欧洲精品一级二级精品综合视频综合 | 伊人久久亚洲色欲综合网站| 亚洲欧洲偷拍一区| 亚洲毛片一级带毛片基地| 欧美操逼录像国产黄色国产| 日韩国产十八禁| 大香蕉免费乱伦视频| 日本熟妇人妻一区二区三区| 欧美日韩精品国产91| 国产一区二区视频在线播放| 国产乱伦视频污| 亚洲一区制服诱惑| 国产视频一区二区在线| 国产成人精品日本亚洲语言| 51久久夜色精品国产麻豆| 啪啪啪男女亚洲中文字幕99| av在线观看不卡网站| 国产精品乱码久久久久久久久| 操人妻逼91| 亚洲精品99| 中国大陆国产高清AⅤ毛片| 搡老女人老91妇女老熟女| 国产不卡的视频 | 欧美精品23| 99999亚洲| 乱子伦一区二区三区国产精品| 成人 日韩欧美一区| 无码在线亚洲| 日本熟女免费視颖| 91人妻精华帖| 亚洲啪啪视频免费| 久久精品人妻一区| 亚洲精品人体| 色妇综合网| 一二三四区电影| 欧美 日韩 婷婷 五月| 超碰日本97美女人妻人人玩人人爱| 国产 热久久久久国产精品| 亚洲国产91精品一区二区久久| 性色A∨91| 日韩天天综合| 欧美激情 一区| 欧美日韩国产精品久久色婷婷| 97干天天| 亚洲视频小说| 碰超人人在线一区二区三区| 91 国产丝袜在线播放-百度| 中文字幕第23区| 国产第11页| 亚州色国| 国产精品乱码久久久久久久| 职场同事知名国产国产精品久久欧美日韩 | 十八禁黄色成人网站观看| 久久最新免费视频23| 欧美亚洲日韩人妻在线观看| 男人的天堂网免费| 青青操在线亚洲视频观看欧美在线| 久久婷婷一区二| 116美女午夜| 成人影 天天操 亚洲| 97人肏| 中文字幕 一区二区 亚洲无码| 91原创在线观看| 国产精品经典一卡久久久 | 嫩草 人人网精品| 四虎884a| 另类成人首页一区| 91白虎| 97爱| 国产女同视频在线播放| 最新日产中文在线麻豆| 97色干| 1024亚洲中文字幕久在线看片你懂的| 欧美美女在线高潮999| 操逼精品视频| 欧美色亚洲色| 2018天天日天天日| 中国一区二区亚洲人妻| 久久久久精| 试看福利| 欧美综合网在线| 国产精品不卡一区二区三区av| 日本操逼视频不卡直接放| 亚洲无吗在线视频| 天天摸,夜夜摸| 99抽插| 久久宗合97| 天天日天天操天天射河南省| 午夜福利精品| 青娱乐导航AV| 九九热精品视频六| 乱伦3P视频| 超碰爽人妻熟女Av| 91精品在线播放| 久久夜夜| 亚洲色婷婷| 日韩精品操少妇| 91无码人妻精品一区二区三区蜜桃| 亚洲在线a| 深夜激情无码| 天天看高清麻豆| 欲香欲色综合天天伊人| 强奸乱伦av电影| 好吊色在线观看| 国产日韩欧美| 亚洲一区二区三区春色| 日韩性爱网址| 日本熟妇色熟妇在线视频播放| 国产97色在线| 自拍欧美| 日韩激情电影中文字幕| 99成人| 男女性扦B| 欧美精品成人一区二区在线观看| 综合色99| 欧美综合色图片| 影音先锋乱| 国产白丝在线| 999精品国产高清一区二区| 丁香五月综合| JuliaAnn丝袜熟女系列| 柠檬AV导航| 免费97视频| 色翁荡息又大又硬又粗又爽| 免费农村成人少妇人妻Aa一区二区视频 | 欧美日韩制服| 99操碰| www.av不卡中文字幕| 久久欲| 久久的网站啊啊啊啊啊| 五月天亚洲色图| 天天操天天插| 蜜臀视频网站| 97爱免费插| 国产精品福利视频| 欧美78p| 久久久久国产精品久久久| 狠狠色色| 久久天堂| 妇女视频网站| 成全在线观看免费观看| 日日夜夜青青草母狗| se吧提供91精品国产91久久久久久 | 亚洲情色五月天| 91亚洲人| 久久久久久久78| 三级精品三级在线观看| 亚洲视频小说| 91爆操视频| 少妇精品久久久八区九区| 97欧美性爱| 久久噜噜噜精品国产亚洲综合| 最新日产中文在线麻豆| 成人午夜小视频手机在线看| 另类视频在线| 97色色婷婷| 久久久久久久性爱| 中出789在线视频| 欧美黄片免费在线观看视频| 十八禁电影伊人网| 青草视频在线看看看看看看看看看| 97天天摸天天爽| 91久久午夜无码鲁丝片久久人妻| 三级色综合| 抽插一区二区视频| 夜夜操夜夜爽夜夜高潮| 日韩色| 91久久18禁| 国产野战露脸在线播放| 自拍偷拍2025在线观看| 亚州欧美色图| 97 九色| 在线视频日韩欧美国产| 9久久久久| 最新精品久久蜜桃 | 亚洲天堂在线怕怕视频| 日韩精品电影| 久久超碰爱| www.91逼逼.com| 精品人妻一区二区三区视频在线| 欧美九九99久久精品| 秋霞无码av鲁丝片一区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 国产成人在线观看网址| 999九九精品| 96精品在线| 黄色大香焦1级‘′‘| 狠狠爱综合网| 国产丁香精品露脸视频| 校园春色综合色| 丁香婷婷久久 | 91婷婷伊人狠人| 人妻81p| 人妻三级在线中文字幕| 性感美女啊啊啊在线| 综精品久久久aaaa| 99在线免费观看| 国产精品无码在线| 中国国产精品一区视频| 色婷婷狠狠18禁| 人人操人人93| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 97国产成人精品免费视频| 精品性爱| 天天噜| 超碰97极品9| 一级黄碟在线看| sss视频华人在线| 久久性爱视频| 国产激情视频在线观看| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 91人妻精华帖| 九九视频黄色片| 中文字幕丰满人妻日本| 伊人九九九| 快播久久人人aV| 九九热午夜欧亚国产视频| 欧美老妇女内射网址| 亚洲男人天堂网久久| 天天操夜夜操| 亚洲中文字幕噜噜噜久久久| 天天干天天插| 国产11页| 欧美制服另类丝袜| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 97综合国产| 亚州男人天堂| 大色综合| 秋霞一集毛片观看| 香伊人在线| Sekablack无码一区| 国内毛片欧美香蕉精品| 99无码狠狠久久| 另类图片欧美激情综合| 欧美伊人久久综合网| 伊人黄色片| 国内亚洲精彩视频在线| 无码在线亚洲| 天天操天天插| 性欧美天天| 91爱做| 亚洲双插| 欧美99热| 9久超碰| 男人的天堂激情| 国产美女激情| 超碰久久综合| 78精品| 囯产精品久久久久久久久久梁医生| 日本乱人伦片中文三区| 思思热久久成人| 日本熟女中文| 日日日啊啊啊| 中文字幕色AV| 青娱乐淫乱1314| 大香网站| 日本久操视频| 久久高清无码夜夜操| 精品无码少妇| 欧美黄色大片在线观看 | 少妇三P| 欧洲一区二区| 伊人网青青| 99日精品欧美国产| 天堂国产AV| 蜜臀网址在线| 人人看人人爰人人操| 大香蕉久| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 99久久精品无码一区二区毛片免费| 美女操逼福利视频| 小草精彩毛片| 91综合天天看| 99老司机精品视频在线观看 | 国产v亚洲v日韩v欧美v片另类| 99久久婷婷丁香| 91色碰| 日韩精品亚洲一二三| 国产亚洲精品一区二区三区| 蜜乳AV色欲AVAV无码| 啊嗯好大视频在线观看| 亚洲图片小说欧洲| 国产色精品午夜大片| 97干com| 亚洲第一页色网| 亚洲第一黄色av网站| 高凊专区人人操| 超碰吊日色| 黄色AAAAAAAAAAA大片| 91 丝袜在线| 97视频免费播放| 日韩性爱小视频在线观看| 麻豆影音天美视频| 试看日韩黄片| 婷婷五月天补不补| 美女黄页网站| 婬女免费一二三区A片| 天天舔天天日天天射| 国产极品粉嫩馒头一线天av| 亚洲色图欧美色18直播在线| 国产毛片在线| 久久久久久久久久黄色网 | 日本999精品视频| 污色区网站| 久久极品一区二区| 啊v在线观看视频| 99热精品免费| 97超碰9| 这里只有精品视频在线| 91日产桃蜜| 亚洲天堂99| 综合亚州欧美| 91九九| 亚洲欧洲日韩中文字幕一区| 色99在线| 精品人妻一区二区三区鲁大师| 色色综合网站| 一起草视频在线| 一本道综合色图| 中欧人妻丝袜中文字幕| 五月天黄色av| 国产偷拍网站| m欧洲一级午老| 久久成人国产| 色噜噜狠狠色综无码久久| 色色色色网站| 男人天堂2030| 欧中日成人免费影视| 欧美大香蕉久| 欧美亚州色的图| 日韩不卡a级视频专区| 欧美桃色网| 欧美黄页在线| 国产亚洲精品无码三区| 色偷综合| 色婷婷丁香五月| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 欧美一级A片在线看视频性色| 久久精品女同亚洲女同13| 久久激情网| 凹凸视频在线一区二区| 亚洲精品国产av天美传媒| 三级网色| 啊啊啊啊啊啊啊啊在线观看| 蜜桃在线观看一区二区三区 | 97 国产一区| 午夜国产成人福利视频| 97综合在线| 天美传媒Av在线| 婷婷综合激情| 国产又黄又粗的视频| 欧美在线|亚洲| 久久久草成人网站久久久草成人久久久草久久久 | 色综合久久88色综合久久天天| 一二三区视频在线观看| 国产黄色动态精品| 久久性视频| 精品国产乱码| 亚洲精品日日夜夜52| 欧美色女人| 蜜臀无码一区二区| 久久日韩毛| 国产午夜激片Av毛片不卡| 少妇一区二区三区| 后入式五六区| 91色爽欧美| 天天做天天爱天天爽| 99老司机精品视频在线观看 | 天无日色综合| 欧美日韩中文亚洲v在线综合| 操国产逼| 91丰满| 蜜桃视频啊啊啊啊| 国产乱弄免费在线视频。| www.夜夜| av凤凰久久久| 99精品欧美一区二区三区桃色| 色综合91好| 天天情欲宗合网| 日日橹狠狠爱欧美超碰| 人人乐大香蕉| 色婷婷综合网| 国产成人精品亚洲日本| 人妻一区视频| 超碰人人操97碰| 日本久久女同性恋视频| 久久综合97| 国产一区二区在线看| 欧洲亚洲天堂精品| 粉嫩AV一区夜夜嗨| 久久视网78| 国产四虎在线| 91蜜臀在线久久久久| 综合激情五月天| 欧美一级黄片免费播放| 97国产高清视频在线观看| 国产毛片久久久久久久| 51久久夜色精品国产麻豆| 天天草天天日| 精品九九| 成 人 A V免费视频在线观看| 天天综合官网| 国产400孕妇孕交群| 五月天伊人网| 日日爱99| 丝袜亚洲综合| 色在线视频导航| 肏逼视频日本| 欧美中文字幕日韩在线| 精品久久久久久AV无码| 欧美性爱18观看| 91av一区二区在线观看| 国产精品人人爽人人做可爱福利| 日本1区2区不卡视频| 中文字幕五月婷婷免费| 中文字幕一区二区三区高清| 青椒国产97在线熟女| 午夜影美女日鸡鸡天天视频国产 | 大逼色网站| 9久久精品| 九九九热| 久久亚州精品成人Av无| 密乳AV免费观看| 成人性爱全视频观看| 亚洲丁香花色| 国产精品视频电影| 日韩 国产 欧美自拍| 欧美极品美女aaaaaa级黄片| 国产多人在线观看视频| 操高情无码| 亚洲操逼网| 黑丝91视频| 青青草久草AV| 91岛国动作片| 天天日天天干天天色| 韩国成人精品久久久免费看 | 啊v在线观看视频| 超碰在线欧美性爱激情| 午夜福利免费福利视频| 99热综合| 91成人国产综合久久精品蜜月| 呦女网站| 久久男人的天堂| 国产性久久久| 亚洲激情久久| 伊人操操| 91五十路| 国产福利小视频高清在线观看| 日本免费中文一区二区三区四区| 色鬼在线综合| 99热在线只有精品| 欧美亚洲国产91在线| 日韩AV熟女乱伦| 色婷婷成人综合| 青青久久久| 国产三级在线现体验区| 人人扣人人操| 久草在| 男人的午夜天堂| 凸凹视频在线观看| 爱欲AV| 亚洲天堂另类| 日本天天操| 暖暖精品二区三区观看| 99re99在线视频| 人人操肉肉| 日韩精品三区四区| 91欧| 日韩欧美俄罗斯A片| 国产老熟女| 中国熟妇| 日韩性爱网址| 伊人色综合欧美| 岛国免费视频在线| 亚洲欧洲偷拍一区| 9久久久久久| 国产色呦呦| 嗯嗯啊好大| 人妻9117c| 亚洲图片欧美91N| 9美女超碰在线免费观看| 欧美老妇曰批的视频| 亚洲AO在线| 少妇久久久久久| 国产 日韩 欧美 人妻 熟女 中文| 97精品国产精品免费观看| av网站免费线看| 十八禁网站在线| 精品欧美乱码久| 婷婷色五月激情| 欧美成人精品一区二区男人蜜臀| 高潮的A片激情扒开一区| 射丝袜高跟鞋99| 男人天堂网站| 99热这里只有精| 午夜精品久久99蜜桃的功能章节| 五月天精品| 精品少妇99| 99热这里是精品| 一区二区视频在看| 婷婷中文字幕| 90后性网国产欧美| 2019午夜福利视频| 九月丁香综合网| 天天综合网合集91| 中文字幕av乱伦| 国产日韩美女小穴视频网站不卡| 久久99人妖视频国产| 天天影视之亚洲综合网| 天天色综亚洲91污| 4tube欧美女厕所| 99在线免费观看| 91亚洲色图| 精产国品一区二三产品| 日韩性爱视频在线免费观看| 伊人操操| 激情五月天社区| 亚洲高清欧美总合| 亚洲天堂另类美腿| 欧美1区二区三区公司| 亚欧美综合网。| 日本精品第一视频在'| 欧美图片校园春色| 人妻激情另类| 蜜臀AV秘一区翔田千里| 九九国产热| 日韩av乱伦| 啊啊啊网站| 乱老熟女一区二区三区| 精品国产乱码久久久久久口爆网站| 久久女女| 日韩美女久久一区二区三区| 亚洲精品乱码线路中文字幕| 91日日夜夜| 久久极品一区二区| 日本日逼高清| 91无码人妻精品一区二区三区蜜桃| 亚洲欧美精品一区天堂久久| 51国产午夜精品视频| AV久日| 熟女丝袜视频| 免费伦费视频在线观看| 花花AV导航| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 99性爱在线观看| 97天堂| 久久熟女久| 亚洲综合小说另类图欧美视频激情小说色五月天 | 好爽视频在线观看| 97日视频| 久久麻豆一区二区| 成人性爱美曰韩| 久久国产成人精品国产成人亚洲 | 精品国产精品一区二区| 国产 亚洲 一二三四| 啊啊啊轻点在线观看| 亚熟在线| 99九九久久| 艹精品| 欧美黄页| 精品国产乱码久久久久久久| 国产精品欧美激在线| 激情开心五月天| 福利视频一区二区微拍| 97精品| 97伦综合| 少妇人妻激情四射| 日本日日色视频| 午夜精品一区二区三区三上悠亚| 99精品视频在线观看免费| 欧美少妇色图| 亚洲 日本 不卡| 国产AV人人夜夜澡人人爽麻豆| 国产精品对白内射| 天天天天操| www.人人cao| 激情网色| 91香蕉视频在线观看免费| 国产99热| 蜜臀AV午夜精品久| 久久精品操| 夜夜爽夜夜摸夜夜操免费视频| 国产青视频| 色月天AV导航| 超碰超碰95| 六月婷婷综合| 欧美综合传媒| 久久久免费懂色| 日韩资源网| 97一区二压| 久久国产精品熟女人妻| 午夜天堂精品久久| 97色色色综合网站| 美女淫穴| 欧美日韩精品久久| 欧美性爱一区二区三区四区| 打av高清| 九九热五区| 亚洲欧美天堂在线| 欧美天堂日韩三级国产传媒| 国产怡红院| 最新一二三区视频| 免费看污网站| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 一道本久久棕合爱| 欧美亚洲国内自拍| 7月婷婷综合| 欧美日韩电影一区二区| 人人超碰在线观看黄| 久久国模av| 欧美激情久久久久| 俺也射| 激情在线青青操| 成年人黄色| 亚洲男人综合| 日韩无码a片| 色综合久久88色综合久久天天| 久久久久久精品免费看A级| JULIA一区二区三区在线播放| 人妻熟女av国产网站| 久久久com| 丝袜六区| 四虎视频在线观看| 加勒比久久av| 欧美色另类| a片久久久久久久久久久久 | 超碰一区二区| 黄色交缠性感爆操91国产精品免费一区二区三区| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 日本幼女18+| 国产传媒av天美传媒在线| 日韩有码 一区二区三区| 国产精品一区二区校花| 女人爽到高潮潮喷18禁网站| 亚洲成人碰碰| 欧美日动态视频| 欧美草草高清日韩视频| 91视频综合网| 操逼逼中文字幕| 色色国产| 亚洲美女色图| 激情小说激情视频| 中文AV制服乱伦| 亚洲AV无码国产精品久久久久| 亚洲男人天堂2019| 黄资源| 美欧色综合| 三级色综合| 日本人体九九九九九九| 天天超级碰碰碰| 91骚熟女| 超碰人人超在线观看| 九九玖玖精品| 日韩射图| 8x福利精品第一福利视频导航| 欧美日韩99| 欧美日动态视频| 久久精品久| 在线性黄高清免费视频| 九一综合精品视品av| 久久久久久人| 国产精品久久久久无码A√| 99热精品在线观看| 欧美久久久| 人人操人人93| 婷婷久久久| 欧美性天天影院| 国产又粗又大硬免费色网视频| 操逼网免费无码视频| 成人A片男人的天堂| 国产一区在线播放| 亚洲精品国产精品乱码不99| 91在线色| 天美传媒精品一区二区| 国产日韩欧美三级片| 久久婷婷欧美| 久久精品福利影院| 久热伊人99re| 色九久| 久久男女激情视频网站| 亚洲男人的天堂在线看| 国产强奸乱伦无码视频| 99只有精品| 国产一区二区在线看| 亚洲五码一区二区三区| 91久久国产综合精品| 操逼无码操逼| 日韩情色视频| 后入式免费视频| 激情五月天网| 久久久久久久久久久久97| 韩国三级理论在线| 超碰69| 大香网站| 久草线上视频免费看| 97人妻免费中文字幕| 亚洲视频二区 | 99热18这里只有精品| 韩国黄片aaaa| 黄色片G G G| 在线观看色视频| 亚洲免费在线探花| 极品内射| 韩日性爱av| 一级黄碟| 色综合网1| av2014 日韩在线中文字幕| 再深点灬舒服灬太大了好硬好爽| 久久久精品视频欧州站| 殴美大黄片| 久9爱精品| 淫妻综合网| 男人天堂电影院| 欧洲中文字幕| 国产精品毛片?v一区二区三区| 亚洲美女色图| 成人三一级一片aaa| 很狠操| 99精彩视频| 亚洲福利影院一区久久| 亚洲高清视频在线观看| 变态乱伦伪娘灌肠一区二区| 色综合99999| 久久 国产精品 一区| 亚州性色| 三上制服丝AV| 日本女优在线视频福利| 欧美啪啪啪91| 亚洲天堂性爱| 欧美日韩亚洲一区二区在线观看| 香蕉大久久久| 嗯啊不要啊在线 | 亚洲欧洲另类| 一区二区三区美女超清| 97超碰在线资源网站| 黑人精品成人一区二区三区| 猛猛干| 亚洲永久永久永久永久一级一级一级精品 | 亚洲欧洲精品视频发布| 日本一二三免费久久| 久久久久久亚洲精品中文字幕人妻| 欧美一区二区福利在线| 999久久芭蕾| 大香蕉综合| 国产精品香蕉热久久新品| 欧美劲爆第一页| 亚洲永久永久永久永久一级一级一级精品 | 日韩av熟女一区二区三区成人| 成人性爱视频在线看| 这里都是精品| 330Dv国产女人终合视频极品人与兽| 日本激情免费大片| 校园春色亚洲| 在线五区| 性欧美体内射精| 欧美刺激色黄片免费看| 久久精品国产精品一区| 骚货 中文字幕 av| 欧美色图私拍91| 五月香婷婷| 手机在线中文字幕国产| 一区二区不卡视| 久久久精品中文字幕麻豆| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 中文字幕五区| 啪啪资源网| 美女天天干| 久久久精精精| 久久九操在线观看| 亚洲 欧美 另类 综合 偷拍| 五月天激情四射| 亚洲精品官网在线观看| 国产精品内射婷婷一级二| 日韩人妻制服丝袜av| 东京成人一区| 九九综合久久| 免费看黄视频亚洲网站| av亚欧| 怡红院久久老司机| 物业黑人 AV一区| 超碰 另类 欧美| 国产刺激视频| 91人妻Pr| 青椒国产97在线熟女| 亚洲影院无码在线| 综合网91| 超碰色97| 偷拍亚洲视频一区二区三区四区| 欧美青青视频| 啊啊啊啊啊啊啊好爽不要| 国产精品天美传媒| 天天干美少妇一区| 午夜免费福利视频一区| 333kkkk·亚洲com久久| 日韩人妻制服丝袜av| 天天视频网站黄| 午夜国产成人精品视频| 99re在线| 亚洲国产成人精品女人久久久| 欧美亚州综合网图片| 尤物视频新赏网鲜网色诱网| 蜜臀久久精品久久久久视频| 女人的天堂大香蕉网| 久操 高清| 日本不卡二三区| 亚洲精品国产精品乱码不卡| 一区二区首页| 国产精品网站免费| 精品一久久久| 九一精品牛牛一区二区| 啊啊啊97视频| 欧美91在线+|+欧美| 小明看看网址| 欧美一级专区免费大片 | 免费福利视频中文字幕| 一个人免费视频观看在线WWW | 久久久久久性爱视频| 欧色综合| 伊人青青草久久| 欧日韩在线观看| 人妻熟妇久草在线| 国产人妻精品一区二区三区秋霞| 91观看 国产白丝| 99视频这有这里有精品| 亚洲中文字幕av| 高清在线偷拍自拍视频| 日韩十八禁| 人妻美腿丝袜日韩|