日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

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

從元組演算到執(zhí)行計(jì)劃:數(shù)據(jù)庫(kù)查詢優(yōu)化與慢SQL排查實(shí)戰(zhàn)

從元組演算到執(zhí)行計(jì)劃:數(shù)據(jù)庫(kù)查詢優(yōu)化與慢SQL排查實(shí)戰(zhàn) 1. 為什么考完試就忘干凈了元組演算和域演算的真實(shí)用處我見過太多數(shù)據(jù)庫(kù)系統(tǒng)工程師考生把元組演算、域演算背得滾瓜爛熟考試一過就徹底拋到腦后。這個(gè)現(xiàn)象本身不奇怪——考試要的是公式推導(dǎo)和符號(hào)變換而日常開發(fā)面對(duì)的是SQL語(yǔ)句和慢查詢?nèi)罩緝烧呖雌饋硗耆皇且粋€(gè)世界的東西。但我想說的是這些理論概念恰恰是理解數(shù)據(jù)庫(kù)底層邏輯的鑰匙尤其是當(dāng)你開始研究查詢優(yōu)化器、分析執(zhí)行計(jì)劃、排查慢SQL的時(shí)候你當(dāng)年背誦的那些公式會(huì)以另一種方式重新出現(xiàn)在你面前。先把這個(gè)話題攤開來說。元組演算和域演算誕生于上世紀(jì)七十年代是關(guān)系模型創(chuàng)始人E.F.Codd在研究如何用數(shù)學(xué)語(yǔ)言描述數(shù)據(jù)庫(kù)查詢時(shí)提出的。它們和關(guān)系代數(shù)一樣是關(guān)系數(shù)據(jù)庫(kù)查詢語(yǔ)言的理論根基。SQL雖然看起來像是英文句子但它的語(yǔ)義基礎(chǔ)其實(shí)是元組演算的變體——SELECT ... FROM ... WHERE ...這種結(jié)構(gòu)本質(zhì)上就是在做元組變量的聲明和條件判斷。這塊內(nèi)容的核心價(jià)值在哪里我總結(jié)下來有三點(diǎn)。第一它是理解查詢優(yōu)化器推理過程的理論前提。優(yōu)化器要把SQL重寫成執(zhí)行計(jì)劃需要一套嚴(yán)密的等價(jià)變換規(guī)則這些規(guī)則的來源就是關(guān)系代數(shù)和演算的恒等變換。不懂這套底層邏輯看執(zhí)行計(jì)劃永遠(yuǎn)只能看個(gè)皮毛。第二它是判斷一條SQL是否可優(yōu)化、如何優(yōu)化的思維工具。比如一個(gè)子查詢能不能改寫成JOIN一個(gè)EXISTS能不能換成IN這些問題的答案其實(shí)都隱藏在關(guān)系代數(shù)和演算的等價(jià)性里。第三它是你作為數(shù)據(jù)庫(kù)系統(tǒng)工程師區(qū)別于普通CRUD開發(fā)者的知識(shí)壁壘。面試聊到索引、執(zhí)行計(jì)劃、查詢重寫的時(shí)候深度立刻見分曉。這篇文章我就打算從元組演算和域演算的基本概念講起一路聊到它們和SQL的對(duì)應(yīng)關(guān)系再深入到查詢優(yōu)化器的工作機(jī)制最后落到真實(shí)的執(zhí)行計(jì)劃分析場(chǎng)景里。如果你正在備考數(shù)據(jù)庫(kù)系統(tǒng)工程師或者工作中經(jīng)常被慢查詢折磨這篇內(nèi)容應(yīng)該能幫上忙。2. 元組演算和域演算到底在說什么從集合論到查詢公式2.1 先搞清楚研究對(duì)象元組、域和關(guān)系要理解元組演算和域演算先得把三個(gè)基礎(chǔ)概念厘清元組、域、關(guān)系。關(guān)系數(shù)據(jù)庫(kù)里的“關(guān)系”在數(shù)學(xué)上就是一組元組的集合。元組可以理解成一張表中的一行它是一組值的有序排列。域則更簡(jiǎn)單——它是元組中某個(gè)分量可能取值的集合。舉個(gè)例子一張學(xué)生表里有學(xué)號(hào)、姓名、年齡三個(gè)列那么每一行就是一個(gè)元組(2024001, 張三, 20)這個(gè)三元組就是元組的具體表現(xiàn)形式。而“學(xué)號(hào)”這一列所有可能的取值的集合就是這個(gè)屬性對(duì)應(yīng)的域。理解了這個(gè)基礎(chǔ)元組演算和域演算的區(qū)別就清晰了元組演算以“行”為基本單位做變量聲明和條件判斷域演算以“列的值”為基本單位。用大白話說元組演算是“我一整行一整行地看”域演算是“我按每個(gè)單元格的值來判斷”。這個(gè)區(qū)別看似簡(jiǎn)單但它決定了兩種演算在表達(dá)能力上的差異也決定了它們?cè)诤髞頂?shù)據(jù)庫(kù)實(shí)現(xiàn)中的命運(yùn)。實(shí)際關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)里SQL的語(yǔ)義實(shí)現(xiàn)更靠近元組演算而域演算則更多地出現(xiàn)在一些形式化驗(yàn)證和邏輯推導(dǎo)的場(chǎng)景中。所以很多教材會(huì)偏重元組演算這是有工程原因的。2.2 元組演算的基本形式存在量詞和全稱量詞元組演算的基本表達(dá)式長(zhǎng)得像這樣{t | P(t)}這個(gè)式子的意思是所有滿足條件P的元組t的集合。理解這個(gè)表達(dá)式是理解整個(gè)元組演算的關(guān)鍵。它其實(shí)用了一階謂詞邏輯的語(yǔ)言來定義集合——你給我一個(gè)條件我從整個(gè)關(guān)系集合里把所有符合條件的行挑出來。這里最讓初學(xué)者頭疼的是兩個(gè)量詞存在量詞?和全稱量詞?。存在量詞好理解意思是“存在這樣一行”全稱量詞麻煩一點(diǎn)意思是“對(duì)所有行都成立”。舉一個(gè)特別典型的例子。給定學(xué)生表S學(xué)號(hào), 姓名, 年齡, 系別和選課表SC學(xué)號(hào), 課程號(hào), 成績(jī)要查“選修了全部課程的學(xué)生姓名”。這個(gè)需求用自然語(yǔ)言說很簡(jiǎn)單但用元組演算寫就稍微繞一點(diǎn){t[姓名] | S(t) ∧ (?u)(C(u) → (?v)(SC(v) ∧ v[學(xué)號(hào)]t[學(xué)號(hào)] ∧ v[課程號(hào)]u[課程號(hào)]))}這個(gè)式子的邏輯是我先找到學(xué)生元組t然后對(duì)所有課程元組u只要這門課程存在就必須存在一條選課記錄v把t和u關(guān)聯(lián)起來。外層是對(duì)所有學(xué)生遍歷內(nèi)層是對(duì)所有課程推導(dǎo)。如果某門課沒有對(duì)應(yīng)的選課記錄這個(gè)學(xué)生的元組就會(huì)被排除。這個(gè)例子考研、軟考、數(shù)據(jù)庫(kù)系統(tǒng)工程師考試都愛出。很多人考試時(shí)靠死記硬背這個(gè)模板通過但如果你真的理解了它的推理過程你會(huì)發(fā)現(xiàn)在“對(duì)所有課程都選了”這種業(yè)務(wù)需求的SQL實(shí)現(xiàn)中你會(huì)有更清晰的改寫思路——用NOT EXISTS還是用COUNT比較背后的邏輯基礎(chǔ)就在這里。2.3 域演算按值域說話的另一種視角域演算的表達(dá)式長(zhǎng)這樣{x1, x2, ..., xn | P(x1, x2, ..., xn)}它聲明的是若干個(gè)域變量每個(gè)變量取各自域中的值然后通過條件P來約束這些變量的組合。不用聲明整行元組作為變量而是直接針對(duì)列的值做操作。域演算的一個(gè)經(jīng)典例子是“查年齡大于18歲的學(xué)生姓名”{姓名 | (?學(xué)號(hào))(?年齡)(?系別)(學(xué)生(學(xué)號(hào), 姓名, 年齡, 系別) ∧ 年齡 18)}這里的變量是學(xué)號(hào)、年齡、系別這些具體的值而不是一整行。它更像是用邏輯公式描述一張?zhí)摂M的結(jié)果表這一列放姓名那幾列是約束條件涉及的值大家組合起來。從查詢表達(dá)力的角度看域演算和元組演算是等價(jià)的——能用一個(gè)表達(dá)出來的查詢另一個(gè)也能表達(dá)。但認(rèn)知方式很不一樣元組演算比較接近“行掃描”的直覺域演算更接近“列投影”加“篩選”的認(rèn)知。有意思的是SQL的執(zhí)行計(jì)劃中投影操作和過濾操作確實(shí)是分開的域演算的這種拆分方式反而和物理執(zhí)行過程有著某種呼應(yīng)。給備考的朋友一個(gè)建議考試中域演算的題目不用摳太深掌握基本轉(zhuǎn)換規(guī)則即可。但元組演算請(qǐng)務(wù)必理解透因?yàn)镾QL的嵌套子查詢語(yǔ)義和它高度同構(gòu)。2.4 安全性問題別讓查詢結(jié)果無窮大學(xué)演算還有一個(gè)繞不開的話題——安全性。由于演算用的是謂詞邏輯如果不加限制你完全可能寫出一個(gè)公式它的結(jié)果集合是無限的。舉個(gè)例子{t | ?S(t)}的意思是“所有不在學(xué)生表S里的元組的集合”。如果元組的定義域是無限的自然數(shù)集合這個(gè)查詢的結(jié)果也是無限的這在工程上毫無意義也不可能執(zhí)行。所以數(shù)據(jù)庫(kù)提供了“安全表達(dá)式”的概念一個(gè)演算表達(dá)式是安全的當(dāng)且僅當(dāng)它的所有可能結(jié)果都來自某個(gè)有限的域集合。實(shí)際操作中這個(gè)有限域集合通常來自關(guān)系實(shí)例中實(shí)際出現(xiàn)的值以及查詢自身用到的常量。SQL之所以是可執(zhí)行的查詢語(yǔ)言根源就在于它隱含了這樣的安全性約束。這事聽著抽象但它在SQL中的影子很常見——為什么SQL的SELECT結(jié)果必須是有限的行數(shù)為什么子查詢里的NOT IN在遇到NULL時(shí)會(huì)有詭異的行為這些工程問題追溯到底層都和安全語(yǔ)義有關(guān)。理解這些數(shù)學(xué)邊角能幫你更淡定地面對(duì)那些“玄學(xué)”SQL問題。3. 演算到SQL的橋梁SEL/SELECT-WHERE結(jié)構(gòu)與查詢樹的推演3.1 SQL的語(yǔ)義核心是“謂詞約束元組投影”現(xiàn)在把視角從數(shù)學(xué)世界拉回工程世界。SQL的SELECT ... FROM ... WHERE ...結(jié)構(gòu)和元組演算的{t | P(t)}存在清晰的對(duì)應(yīng)關(guān)系FROM子句提供了元組遍歷的范圍WHERE子句扮演了謂詞P的角色SELECT子句則決定了最終保留哪些分量。這個(gè)對(duì)應(yīng)關(guān)系不是巧合SQL在設(shè)計(jì)時(shí)就是受了元組演算的啟發(fā)。SQL的創(chuàng)始人Donald Chamberlin和Raymond Boyce在1974年發(fā)表的論文里明確提到了關(guān)系演算對(duì)SEQUEL語(yǔ)言設(shè)計(jì)的影響。所以當(dāng)你寫一條SQL時(shí)其實(shí)你已經(jīng)在用元組演算的思維了只是平時(shí)沒人提醒你這一點(diǎn)。工程上的一個(gè)特定實(shí)現(xiàn)是SELselect算子和它的參數(shù)化形式。其實(shí)不一定要停留在某個(gè)特定數(shù)據(jù)庫(kù)產(chǎn)品的層面我們可以從通用角度理解一條SQL在執(zhí)行計(jì)劃層面會(huì)被拆成一系列邏輯算子包括掃描算子、過濾算子、投影算子、連接算子等。這些算子的排列組合形成了查詢樹而查詢樹是優(yōu)化器做邏輯等價(jià)變換的基礎(chǔ)。3.2 查詢樹的等價(jià)變換把公式變成可執(zhí)行的方案我舉個(gè)例子來說明查詢樹推演的過程。假設(shè)有兩個(gè)表——訂單表O訂單號(hào), 客戶號(hào), 金額, 狀態(tài)和客戶表C客戶號(hào), 姓名, 城市。現(xiàn)在要查“北京的客戶在2024年下的金額大于1000元的訂單”。SQL寫出來很直觀SELECT O.訂單號(hào), O.金額, C.姓名 FROM 訂單 O JOIN 客戶 C ON O.客戶號(hào) C.客戶號(hào) WHERE C.城市 北京 AND O.金額 1000 AND O.下單時(shí)間 BETWEEN 2024-01-01 AND 2024-12-31;在關(guān)系代數(shù)層面這條SQL對(duì)應(yīng)的查詢樹是先做訂單表掃描再做客戶表掃描然后做連接操作最后做選擇和投影。但問題是這個(gè)執(zhí)行順序是不是最優(yōu)的優(yōu)化器會(huì)做一件關(guān)鍵的事——把可以提前做的過濾操作盡量下推。比如可以在掃描訂單表的時(shí)候就把金額1000和下單時(shí)間范圍的過濾條件直接套在表掃描之上只把符合條件的訂單行送入連接操作客戶表也一樣先把城市北京的客戶過濾出來。這樣進(jìn)入連接操作的數(shù)據(jù)量會(huì)大幅減少連接代價(jià)也隨之降低。在關(guān)系代數(shù)里這個(gè)操作的理論依據(jù)是選擇和連接的可交換性σ_條件(連接(A, B)) 等價(jià)于 連接(σ_條件A(A), σ_條件B(B))只要過濾條件只涉及A或只涉及B就可以安全地下推。3.3 一個(gè)反直覺的改寫案例EXISTS的演算本質(zhì)關(guān)于等價(jià)變換我分享一個(gè)特別有意思的真實(shí)案例。有一次我在優(yōu)化一條SQL業(yè)務(wù)場(chǎng)景是查“有訂單的客戶”。第一版SQL用的是IN子查詢SELECT C.客戶號(hào), C.姓名 FROM 客戶 C WHERE C.客戶號(hào) IN (SELECT O.客戶號(hào) FROM 訂單 O WHERE O.狀態(tài) 已完成);這條SQL在客戶表數(shù)據(jù)量十萬、訂單表數(shù)據(jù)量百萬的情況下執(zhí)行計(jì)劃出現(xiàn)了很糟糕的選擇——優(yōu)化器選擇了先全量掃描訂單子查詢?cè)賹?duì)客戶表做逐行探測(cè)。雖然訂單上建有客戶號(hào)索引但子查詢需要先過濾狀態(tài)已完成索引使用效率不高導(dǎo)致執(zhí)行時(shí)間飆到十幾秒。我當(dāng)時(shí)的處理是把IN改寫為EXISTSSELECT C.客戶號(hào), C.姓名 FROM 客戶 C WHERE EXISTS (SELECT 1 FROM 訂單 O WHERE O.客戶號(hào) C.客戶號(hào) AND O.狀態(tài) 已完成);改寫后優(yōu)化器可以更靈活地選擇執(zhí)行策略把客戶表作為驅(qū)動(dòng)表訂單表通過客戶號(hào)索引進(jìn)行關(guān)聯(lián)探測(cè)執(zhí)行時(shí)間從十幾秒降到了幾百毫秒。那么用演算怎么解釋這個(gè)改寫的正確性IN子查詢的語(yǔ)義是“客戶號(hào)在子查詢結(jié)果集合中”EXISTS的語(yǔ)義是“存在一條訂單記錄滿足條件”。用元組演算的語(yǔ)言來說IN對(duì)應(yīng)的是外層元組的值是否屬于一個(gè)已確定的集合EXISTS對(duì)應(yīng)的是一個(gè)存在量詞推導(dǎo)。這兩個(gè)表達(dá)式的邏輯等價(jià)性正是謂詞邏輯中“元素屬于集合”和“存在量詞斷言”之間的同義變換。這個(gè)案例給我們的啟示是優(yōu)化器雖然能做很多自動(dòng)重寫但它依賴統(tǒng)計(jì)信息、索引結(jié)構(gòu)、代價(jià)模型并不總是智能到能識(shí)別所有等價(jià)的寫法。作為工程師理解底層演算語(yǔ)義能在關(guān)鍵時(shí)刻用人工改寫的方式幫優(yōu)化器一把。4. 優(yōu)化器內(nèi)部視角從邏輯樹到物理計(jì)劃的完整推理鏈路4.1 邏輯優(yōu)化和物理優(yōu)化其實(shí)是兩層不同的決策深入查詢優(yōu)化器內(nèi)部你會(huì)發(fā)現(xiàn)它做的事情遠(yuǎn)不止“等價(jià)重寫”這么簡(jiǎn)單。一個(gè)完整的查詢優(yōu)化流程可以拆成兩個(gè)層面邏輯優(yōu)化和物理優(yōu)化。邏輯優(yōu)化是在不改變查詢語(yǔ)義的前提下對(duì)查詢樹做結(jié)構(gòu)性的等價(jià)變換。常見的手法包括謂詞下推把過濾盡可能提前、子查詢展開把子查詢改寫成連接、連接重排序決定多表連接的先后順序、視圖合并把視圖的定義并入主查詢。這些變換的理論基礎(chǔ)就是前面說的關(guān)系代數(shù)和演算的恒等性。物理優(yōu)化則是在邏輯計(jì)劃確定之后決定每一具體操作的實(shí)現(xiàn)方式表的訪問路徑是走全表掃描還是索引掃描連接算法是用嵌套循環(huán)、哈希連接還是排序合并是否需要額外的排序操作并發(fā)執(zhí)行的程度如何設(shè)定這一層依賴的是數(shù)據(jù)庫(kù)系統(tǒng)內(nèi)部的代價(jià)模型、統(tǒng)計(jì)信息和物理存儲(chǔ)結(jié)構(gòu)。打個(gè)比喻邏輯優(yōu)化像是你在規(guī)劃旅行路線時(shí)決定“先去北京再去上海還是先去上海再去北京”物理優(yōu)化則像是決定“這兩座城市之間坐高鐵還是飛機(jī)”。前者關(guān)注的是步驟的先后和內(nèi)容后者關(guān)注的是每一步的執(zhí)行方式。4.2 代價(jià)模型的兩個(gè)核心組件基數(shù)估計(jì)和成本公式理解了這兩層優(yōu)化之后我想帶你看看優(yōu)化器做決策的最關(guān)鍵依據(jù)——代價(jià)模型。絕大多數(shù)現(xiàn)代數(shù)據(jù)庫(kù)的代價(jià)模型都包含兩個(gè)核心組件基數(shù)估計(jì)和成本公式?;鶖?shù)估計(jì)是估算某個(gè)中間結(jié)果集有多少行成本公式則是根據(jù)基數(shù)估算、數(shù)據(jù)分布、物理存儲(chǔ)特性來算一個(gè)操作的代價(jià)數(shù)值。優(yōu)化器會(huì)枚舉多個(gè)可能的計(jì)劃用代價(jià)模型估算每個(gè)計(jì)劃的總代價(jià)然后選代價(jià)最小的那一個(gè)?;鶖?shù)估計(jì)的難度遠(yuǎn)超想象它需要統(tǒng)計(jì)信息、數(shù)據(jù)分布假設(shè)通常是均勻分布或直方圖、列之間有相關(guān)性假設(shè)。當(dāng)統(tǒng)計(jì)信息過期、數(shù)據(jù)分布不均勻基數(shù)估計(jì)的結(jié)果會(huì)產(chǎn)生數(shù)量級(jí)偏差優(yōu)化器就會(huì)做出災(zāi)難性的執(zhí)行計(jì)劃選擇。這也是為什么實(shí)際運(yùn)維中要定期做統(tǒng)計(jì)信息更新比如ANALYZE、UPDATE STATISTICS以及為什么一些簡(jiǎn)單的SQL會(huì)莫名奇妙地走錯(cuò)執(zhí)行計(jì)劃。成本公式的細(xì)節(jié)因數(shù)據(jù)庫(kù)產(chǎn)品而異但大框架非常相似。對(duì)全表掃描來說代價(jià)和表的總行數(shù)、塊數(shù)成正比對(duì)索引掃描來說代價(jià)和選擇度、索引層數(shù)、回表次數(shù)相關(guān)對(duì)連接操作來說代價(jià)取決于驅(qū)動(dòng)表行數(shù)、被驅(qū)動(dòng)表探測(cè)代價(jià)、內(nèi)存可用量等。理解這些你才能讀懂執(zhí)行計(jì)劃里那些數(shù)值的含義。4.3 統(tǒng)計(jì)信息對(duì)執(zhí)行計(jì)劃的影響一個(gè)被忽視的殺手我在一線工作中遇到過太多因?yàn)榻y(tǒng)計(jì)信息問題導(dǎo)致的性能事故。有一個(gè)印象很深的例子某業(yè)務(wù)表的數(shù)據(jù)量從十萬漲到五千萬但因?yàn)樽詣?dòng)統(tǒng)計(jì)信息的閾值設(shè)置不當(dāng)分區(qū)級(jí)的統(tǒng)計(jì)信息沒有及時(shí)更新優(yōu)化器以為這張表還是十萬行于是選擇了一個(gè)對(duì)小表友好的連接順序——大表驅(qū)動(dòng)小表。結(jié)果執(zhí)行計(jì)劃的實(shí)際運(yùn)行時(shí)間從幾十毫秒膨脹到十幾分鐘。當(dāng)時(shí)排查的完整鏈路是這樣的慢查詢?nèi)罩静蹲降揭粭lSQL的執(zhí)行時(shí)間異常拉長(zhǎng)平時(shí)幾毫秒最近穩(wěn)定在十幾分鐘。用EXPLAIN看執(zhí)行計(jì)劃發(fā)現(xiàn)連接順序明顯反直覺大表作為驅(qū)動(dòng)表小表作為被驅(qū)動(dòng)表。查看統(tǒng)計(jì)信息刷新時(shí)間發(fā)現(xiàn)該表最近一次ANALYZE是在三個(gè)月前當(dāng)時(shí)數(shù)據(jù)量確實(shí)是十萬行。手動(dòng)執(zhí)行ANALYZE強(qiáng)制刷新統(tǒng)計(jì)信息。再看執(zhí)行計(jì)劃連接順序已經(jīng)糾正SQL執(zhí)行時(shí)間恢復(fù)到毫秒級(jí)。這個(gè)案例里沒有任何SQL寫法的問題純粹是統(tǒng)計(jì)信息滯后導(dǎo)致的優(yōu)化器判斷失誤。這個(gè)教訓(xùn)我后來在團(tuán)隊(duì)里反復(fù)強(qiáng)調(diào)遇到SQL性能突變第一件事永遠(yuǎn)先確認(rèn)統(tǒng)計(jì)信息是否新鮮再去懷疑SQL本身的問題。4.4 連接順序選擇的天花板當(dāng)優(yōu)化器也無能為力連接順序的選擇是查詢優(yōu)化中最難的問題之一因?yàn)閚個(gè)表的連接順序有n!種可能每一種還需要考慮對(duì)應(yīng)的連接算法組合。對(duì)于7表或者10表以上的連接全枚舉的代價(jià)就已經(jīng)高到不可接受了所以現(xiàn)代優(yōu)化器幾乎都采用動(dòng)態(tài)規(guī)劃和啟發(fā)式搜索相結(jié)合的方式。但這帶來一個(gè)新的問題——啟發(fā)式策略在多數(shù)情況下表現(xiàn)良好但在極少數(shù)邊界場(chǎng)景下會(huì)選出明顯次優(yōu)的計(jì)劃。工程師對(duì)這類查詢的處理方式是分析連接關(guān)系圖譜找出最小、最有選擇性的子集先行連接再逐級(jí)擴(kuò)展或者干脆用查詢提示hint鎖定連接順序。我在給客戶做性能優(yōu)化時(shí)有一條心得對(duì)復(fù)雜查詢與其讓優(yōu)化器做全空間搜索不如人工拆解。把一個(gè)大查詢拆成幾個(gè)中間結(jié)果表每一步都確保執(zhí)行計(jì)劃可控。這種做法的代價(jià)是額外存儲(chǔ)和多一步ETL但換來的是執(zhí)行計(jì)劃的穩(wěn)定性和可預(yù)測(cè)性。對(duì)生產(chǎn)環(huán)境的穩(wěn)定性要求而言這是值得的。5. 實(shí)戰(zhàn)看執(zhí)行計(jì)劃以EXPLAIN輸出為例的慢查詢定位方法論5.1 執(zhí)行計(jì)劃閱讀的基本順序從嵌套最深到最外層理論知識(shí)說了一大堆現(xiàn)在落到最實(shí)務(wù)的部分——怎么通過執(zhí)行計(jì)劃定位和修復(fù)慢查詢。一個(gè)執(zhí)行計(jì)劃通常以樹狀結(jié)構(gòu)呈現(xiàn)無論是MySQL的EXPLAIN輸出、PostgreSQL的EXPLAIN還是Oracle的執(zhí)行計(jì)劃輸出核心邏輯是一致的。閱讀執(zhí)行計(jì)劃的正確順序其實(shí)是自內(nèi)向外、自底向上先看每個(gè)表中訪問路徑的代價(jià)再看連接操作是不是按合理順序執(zhí)行最后看最外層的結(jié)果集構(gòu)造是否有不必要的開銷。很多新手犯的錯(cuò)誤是一上來就盯著第一個(gè)節(jié)點(diǎn)看這容易漏掉關(guān)鍵問題。我從一次具體的性能排查講起。有一個(gè)場(chǎng)景論壇系統(tǒng)的帖子列表頁(yè)需要展示每個(gè)帖子的標(biāo)題、作者名、最新回復(fù)人和回復(fù)時(shí)間。SQL長(zhǎng)這樣SELECT p.title, u.name AS author_name, r.name AS reply_user, r.reply_time FROM post p JOIN user u ON p.author_id u.id LEFT JOIN LATERAL (SELECT ru.name, r.reply_time FROM reply r JOIN user ru ON r.user_id ru.id WHERE r.post_id p.id ORDER BY r.reply_time DESC LIMIT 1) r ON TRUE WHERE p.status 1 ORDER BY p.update_time DESC LIMIT 20;這條SQL在數(shù)據(jù)量上去之后變得很慢壓測(cè)時(shí)平均響應(yīng)時(shí)間達(dá)到3秒。先看執(zhí)行計(jì)劃的關(guān)鍵部分。5.2 從執(zhí)行計(jì)劃里讀出的三個(gè)問題EXPLAIN ANALYZE輸出顯示外層post表掃描走了索引idx_post_status_update沒問題但內(nèi)層LATERAL子查詢對(duì)reply表的探測(cè)居然走了全表掃描。為什么原來reply表的post_id列上雖然有索引但索引的統(tǒng)計(jì)信息顯示該列的重復(fù)值極多優(yōu)化器估算走索引的回表代價(jià)高于全表掃描。問題出在回復(fù)表和帖子表的數(shù)據(jù)傾斜——少量熱帖集中了大量回復(fù)導(dǎo)致優(yōu)化器做了錯(cuò)誤的基數(shù)估計(jì)。第二個(gè)問題是ORDER BY p.update_time DESC要求排序而執(zhí)行計(jì)劃的排序節(jié)點(diǎn)使用了臨時(shí)文件排序filesort內(nèi)存排序緩沖區(qū)設(shè)置過小導(dǎo)致磁盤排序。第三個(gè)問題是LEFT JOIN LATERAL在PostgreSQL里是逐行調(diào)用子查詢這在邏輯上是串行的無法并行化。當(dāng)驅(qū)動(dòng)表需要掃描的行數(shù)很多時(shí)串行代價(jià)會(huì)被線性放大。5.3 修復(fù)方案和實(shí)施步驟針對(duì)這三個(gè)問題我當(dāng)時(shí)的處理方案如下第一步修正基數(shù)估計(jì)——重新采集reply表的統(tǒng)計(jì)信息并且給post_id這一列建立覆蓋索引idx_reply_post_user_time (post_id, user_id, reply_time)。覆蓋索引可以讓子查詢中的過濾和排序都在索引層面完成不需要回表。第二步調(diào)整排序參數(shù)——把排序緩沖區(qū)從默認(rèn)的2MB調(diào)整到32MB同時(shí)檢查是否可以通過調(diào)整索引讓結(jié)果天然有序。最終是在post表的update_time列和status列上建立了組合索引讓外層查詢的過濾和排序在同一個(gè)索引掃描中完成直接消除了排序節(jié)點(diǎn)。第三步重寫LATERAL子查詢。這里我能想到的最佳實(shí)踐是如果熱帖的回復(fù)數(shù)量本身就不多可以接受一筆額外的預(yù)聚合如果熱帖集中更適合的方式是把“每個(gè)帖子最近回復(fù)”這個(gè)邏輯做成物化結(jié)果。事實(shí)上在很多高并發(fā)社區(qū)場(chǎng)景里這類“最新回復(fù)”數(shù)據(jù)都是異步寫入緩存或單獨(dú)匯總表的實(shí)時(shí)跑SQL反而是不合理的架構(gòu)。優(yōu)化后的執(zhí)行計(jì)劃里三個(gè)性能瓶頸全部消除SQL平均響應(yīng)時(shí)間從3秒降到80毫秒。這個(gè)案例的典型意義在于它同時(shí)涉及了統(tǒng)計(jì)信息、索引設(shè)計(jì)、參數(shù)配置、SQL結(jié)構(gòu)四個(gè)維度而這些恰恰是查詢優(yōu)化中最常見的四個(gè)切入點(diǎn)。提示看執(zhí)行計(jì)劃時(shí)關(guān)注三種特定的標(biāo)志性字段——filtered比例過低說明索引選擇性差、filesort或sort節(jié)點(diǎn)出現(xiàn)說明排序無法利用索引、臨時(shí)表出現(xiàn)說明結(jié)果集產(chǎn)生中間落盤。這三個(gè)信號(hào)基本覆蓋了90%的慢查詢根因。5.4 常見的執(zhí)行計(jì)劃誤讀和我踩過的坑執(zhí)行計(jì)劃閱讀的坑也值得專門說一說。第一個(gè)坑把節(jié)點(diǎn)的輸出行數(shù)當(dāng)成實(shí)際行數(shù)。在執(zhí)行計(jì)劃中節(jié)點(diǎn)輸出行數(shù)是優(yōu)化器的基數(shù)估計(jì)值而不是實(shí)際執(zhí)行行數(shù)。如果想看實(shí)際行數(shù)要用EXPLAIN ANALYZE或者EXPLAIN (ANALYZE, BUFFERS)它會(huì)真實(shí)執(zhí)行查詢并回傳實(shí)際行數(shù)和實(shí)際耗時(shí)。只讀估算行數(shù)很容易被誤導(dǎo)。第二個(gè)坑忽略緩沖BUFFERS信息。很多執(zhí)行計(jì)劃的慢不是慢在計(jì)算而是慢在I/O。BUFFERS字段能告訴你這個(gè)節(jié)點(diǎn)訪問了多少個(gè)數(shù)據(jù)塊其中多少是命中了共享緩沖區(qū)的。如果某個(gè)節(jié)點(diǎn)讀取的塊數(shù)非常多且命中率低說明存在嚴(yán)重的隨機(jī)I/O需要通過索引調(diào)整來訪問更少的數(shù)據(jù)塊。第三個(gè)坑直接把執(zhí)行計(jì)劃中的總代價(jià)拿來排序比較。代價(jià)數(shù)值是相對(duì)的不同數(shù)據(jù)庫(kù)、不同版本、不同參數(shù)下的代價(jià)基準(zhǔn)都不一樣。我自己更習(xí)慣的做法是看計(jì)劃結(jié)構(gòu)是否符合直覺——有沒有哪個(gè)節(jié)點(diǎn)做了不合理的全表掃描有沒有多表連接的驅(qū)動(dòng)順序反了有沒有該走索引卻走了掃描。結(jié)構(gòu)對(duì)加上實(shí)際耗時(shí)驗(yàn)證比糾結(jié)具體數(shù)值更可靠。6. 從演算到現(xiàn)代場(chǎng)景枚舉元組、C#值元組解構(gòu)和畢達(dá)哥拉斯三元組的視角6.1 枚舉元組當(dāng)“元組”遇上現(xiàn)代編程語(yǔ)言聊了很多數(shù)據(jù)庫(kù)系統(tǒng)的內(nèi)容我想再擴(kuò)展一下“元組”這個(gè)詞在現(xiàn)代編程中的含義因?yàn)檫@個(gè)概念對(duì)數(shù)據(jù)庫(kù)工程師來說既熟悉又陌生。在C#、Python、Rust等現(xiàn)代編程語(yǔ)言中元組tuple是一種輕量級(jí)的數(shù)據(jù)結(jié)構(gòu)用于打包一組異構(gòu)的值。C#從7.0開始引入了值元組ValueTuple和解構(gòu)語(yǔ)法這使得開發(fā)者可以這樣寫var (name, age) GetUserInfo(userId); Console.WriteLine(${name} is {age} years old.);這種語(yǔ)法本質(zhì)上是在做元組的解構(gòu)——把一個(gè)元組變量按位置拆成多個(gè)命名變量。這恰好呼應(yīng)了域演算的思維按域變量取值而不是把整個(gè)元組作為一個(gè)整體去操作。對(duì)數(shù)據(jù)庫(kù)開發(fā)者來說理解現(xiàn)代語(yǔ)言中的元組操作有一個(gè)實(shí)際好處當(dāng)你編寫ORM查詢或者做DTO映射時(shí)你實(shí)際上是在關(guān)系的元組和編程語(yǔ)言的元組之間做翻譯。批量枚舉元組、按位置解構(gòu)、按屬性命名這些操作背后的思維模型和關(guān)系數(shù)據(jù)庫(kù)的行列模型是同構(gòu)的。6.2 畢達(dá)哥拉斯三元組一個(gè)經(jīng)典的域演算思維練習(xí)題“noj畢達(dá)哥拉斯3元組”這個(gè)熱搜詞也很有意思。畢達(dá)哥拉斯三元組指的是滿足a2 b2 c2的三個(gè)正整數(shù)比如(3, 4, 5)。用這個(gè)例子來做域演算的思維練習(xí)特別合適因?yàn)樗枰懵暶魅齻€(gè)域變量然后描述它們之間的約束關(guān)系。用域演算來表達(dá)“找出所有畢達(dá)哥拉斯三元組”{(a, b, c) | a ∈ N ∧ b ∈ N ∧ c ∈ N ∧ a2 b2 c2 ∧ 1 ≤ a b c ≤ 100}這個(gè)公式本質(zhì)上是一個(gè)約束搜索問題的聲明式描述。你聲明三個(gè)整數(shù)變量給出取值范圍和約束條件剩下的交給執(zhí)行器去做。這正好對(duì)應(yīng)了SQL中一個(gè)經(jīng)典問題的寫法——生成三個(gè)范圍笛卡爾積后做篩選WITH numbers AS (SELECT generate_series(1, 100) AS n) SELECT a.n AS a, b.n AS b, c.n AS c FROM numbers a, numbers b, numbers c WHERE a.n b.n AND b.n c.n AND a.n * a.n b.n * b.n c.n * c.n;這個(gè)寫法雖然直觀但性能算不上好——范圍小時(shí)還能接受范圍一旦擴(kuò)大笛卡爾積的規(guī)模就是O(n3)優(yōu)化器也無法把這種約束轉(zhuǎn)換成索引友好的計(jì)劃。工程上的處理方式通常是縮小搜索范圍、用數(shù)學(xué)邊界剪枝、或者事先生成緩存表。這個(gè)例子恰好揭示了聲明式語(yǔ)言的一個(gè)根本矛盾表達(dá)簡(jiǎn)潔不等于執(zhí)行高效優(yōu)化器能做的重寫是有限度的。6.3 數(shù)據(jù)庫(kù)查詢優(yōu)化器在AI和現(xiàn)代數(shù)據(jù)棧中的角色變遷把話題拉回查詢優(yōu)化器本身。在現(xiàn)代數(shù)據(jù)棧里查詢優(yōu)化器早已不局限于傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)。Spark SQL、Presto/Trino、ClickHouse這些大數(shù)據(jù)引擎都有自己的一套查詢優(yōu)化策略但底層依然是在做邏輯重寫和物理計(jì)劃選擇。它們面對(duì)的場(chǎng)景更極端——數(shù)據(jù)規(guī)模更大數(shù)據(jù)源更異構(gòu)查詢模式更多樣。值得注意的是近年來業(yè)界在探索用機(jī)器學(xué)習(xí)技術(shù)改進(jìn)基數(shù)估計(jì)和代價(jià)模型。比如把統(tǒng)計(jì)信息丟給神經(jīng)網(wǎng)絡(luò)去學(xué)習(xí)數(shù)據(jù)分布或者用強(qiáng)化學(xué)習(xí)來決定連接順序。這些嘗試的方向是對(duì)的但受限于訓(xùn)練數(shù)據(jù)獲取成本、模型解釋性和推理延遲離大規(guī)模落地還有距離。對(duì)一線工程師來說與其等待優(yōu)化器變得更智能不如更勤奮地理解它現(xiàn)有的決策邏輯。在當(dāng)前這個(gè)數(shù)據(jù)環(huán)境下有另一種趨勢(shì)很值得關(guān)注很多團(tuán)隊(duì)開始主動(dòng)繞過通用優(yōu)化器用物化視圖、預(yù)計(jì)算、增量更新等方式來回避“查詢時(shí)優(yōu)化”的問題。這其實(shí)是一種務(wù)實(shí)的工程折中——既然查詢優(yōu)化器在復(fù)雜場(chǎng)景下難以做到最優(yōu)不如把復(fù)雜計(jì)算挪到寫入端或離線批處理端。能用預(yù)計(jì)算解決的查詢不要在查詢時(shí)挑戰(zhàn)優(yōu)化器。7. 備考復(fù)習(xí)與工作實(shí)踐的結(jié)合路徑我的個(gè)人操作經(jīng)驗(yàn)聊了這么多理論、工程和案例最后分享一些實(shí)際的備考和工作經(jīng)驗(yàn)。如果你是準(zhǔn)備數(shù)據(jù)庫(kù)系統(tǒng)工程師考試的考生我的建議是不要只背符號(hào)公式也不要完全放棄理論。把所有演算表達(dá)式和關(guān)系代數(shù)表達(dá)式翻譯成SQL再翻譯回表達(dá)式來回做幾遍。這個(gè)過程的收益遠(yuǎn)超你的想象——它讓你建立的是語(yǔ)義層面的等價(jià)關(guān)系網(wǎng)絡(luò)而考試題考察的恰好就是這種等價(jià)變換能力。我當(dāng)初備考時(shí)的一個(gè)具體做法是把歷年真題里的關(guān)系代數(shù)、元組演算、SQL三者的互轉(zhuǎn)題目自己整理成一張對(duì)應(yīng)表。每種查詢模式選擇、投影、連接、分組、去重、嵌套都寫清楚三種表達(dá)方式的對(duì)應(yīng)規(guī)則。復(fù)習(xí)效果非常好而且這份對(duì)應(yīng)表在后來工作中分析SQL執(zhí)行計(jì)劃時(shí)依然能派上用場(chǎng)。工作中建議重點(diǎn)掌握幾個(gè)實(shí)操技能EXPLAIN的深度使用、統(tǒng)計(jì)信息的手動(dòng)管理、覆蓋索引的設(shè)計(jì)原則、子查詢和連接的手工改寫。這些技能在慢查詢排查中的實(shí)用性幾乎是日常性的。我給自己團(tuán)隊(duì)定的底線是每個(gè)人都能在十分鐘內(nèi)定位一條慢SQL的根因并給出至少兩種優(yōu)化思路。能做到這一點(diǎn)數(shù)據(jù)庫(kù)系統(tǒng)工程師這個(gè)頭銜才算真正名副其實(shí)。最后再分享一個(gè)小技巧。每次優(yōu)化完一條SQL我會(huì)把優(yōu)化前后的SQL和執(zhí)行計(jì)劃的對(duì)比截圖保存下來附帶一段文字說明根因。半年下來就是一個(gè)非常有價(jià)值的案例庫(kù)。下次有人問“為什么這條SQL變慢了”直接翻案例庫(kù)比重新排查一遍高效太多。這種積累方式對(duì)個(gè)人成長(zhǎng)和團(tuán)隊(duì)沉淀都有好處。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99热18| 淫荡少妇免费| 亚洲欧洲综合成人av一区| WWW黄片COM| 91女网站| 亚洲欧美综合网 | 搡老熟女免费视频| 中文字幕中文字幕一区二区| 欧美性,色九九| 殴美性天天| 特级毛片特黄久久免费看| 欧美日本久久精品一区 | 欧美大战久久久伊人| 欧美色狠| 激情六月天| 超碰社区97| 人妻啪| 亚洲老熟妇xxx| 蜜臀99久久精品| 国内毛片无遮挡国产| 欧美黑人猛交春色影视大全| 78m啪啪啪| 亚洲第2页| 97精品视频网站| 国产在线综合网| 五月丁香网站| 国产路线专区| 男人的天堂不卡一区二区| 少妇色欲综合网2| 国产精品无码av在线| 激情五月婷婷| 老熟女网站| 日日干夜夜干| 亚洲综合欧美| 深喉吞精| 精品-91人妻子系列| 天天干美少妇一区| 又大又白奶子| 天天综合中文字幕 91| 日韩欧美女求操每天更新| 91站街按摩店老熟女熟女| 国产精品亚洲四五区在线观看| 亚洲人码13| 熟女乱伦A| 亚洲诱惑| 国产高清无码一区二区三区四区皇冠| 日曰骚久久精品| 日本三级网页| 97久操| 欧美日韩性爱精品| 91P0RNY大屁股人妻| 熟妇人妻一区二区三区| 啊啊啊好多水| 国产四虎在线| 久草免费福利在线播放| 免费av在线播放二区| 欧美色九九九| 三级日韩一区二区三区| 91美女看B| 免费簧片在线观看| 热久久无毒不卡| 婷婷五月天在线观看| 探花视频免费观看国产专区| 综合大香蕉美。| 色噜噜人妻丝袜a∨先锋影 | 亚洲精品国产精品成人| 夜夜骑天天燥| 韩国黄色片精品久久久| 黑人美精品 A片| 97 国产精品| 色色99| 黄片免费日韩| 久久久久久少妇| 色色热| 天天综合网91| 9999亚洲电影| 精品妇女一区二区三区| 久久精品中文字幕无码l| 一本久久久精品| 日本 免费 一区二区三区 久久香蕉| 九月激情婷婷| 97爱综合| 亚洲国产美女久久久久| 少妇熟女视频一区二区三区| 午夜无码熟妇丰满人妻| 婷婷综合久久| 粉嫩国产精品久久粉嫩| 天天天天天干夜夜夜夜夜操| 亚洲视频小说| 99只有精品| 天天爽夜夜爽夜夜爽精| 黑人精品久久97| 色墦五月丁香| 色区久久| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 欧美综色欧| 丁香五月激情综合国产| 久久性爱大全| 欧美不卡五十路| 色9999日韩国产| 免费观看网黄| 97色97干| 欧综合网| 99人妻| 91 亚欧| 淫骚熟女一区二区三区| 国产美女口爆吞精| 日躁天天爽爽| 超碰久久精品| 中文字幕人妻丝袜乱一区三区| 囯戸精品高潮呻吟旡码| 97欧美精品| 手机在线看片免费人成视频| av在线播放国产一区| 亚洲熟女综合一区二区| 国产真乱mangent| 青青五月天| 久久久内射良家| 四虎视频在线观看| 天天日日日射| 欧美黄色图片| 午夜性| 97亚洲综合电影| 欧美一级色| 国产家庭乱伦性爱视频| 免费一级欧美片片线观看| 日日日日做夜夜夜夜无码| 99视频这有这里有精品| 飘花国产午夜精品不卡| 伊人激情五月天一区二区| 欧美一区二区三区入口| 久久九九视频九九视频| 五十路三级片| 你懂得91| 七久久久| 96免费视频在线| 人妻酒店出差被中出免费在线播放| 私色综合网| 亚 欧 美 综合| 97精品国产97久久久久久户外免费| 色婷五月| 久热69九色熟妇97| 高跟伊人julia ann| 蜜屁Av| 久久精品视| 夜夜做夜夜爽精品视频| 人妻激情视频| 一级毛片电影免费看| 欧美啪啪女女| 老色69| 久久久久免费少妇| 99国产精品人妻人伦| 日韩影片中文字幕一区二区三区| 精品人妻1237| 国产精品日日摸天天碰| 亚洲伊人a线观看视频| 久草视频在线视频在线视频在线观看| 5278欧美一区二区三区| 91在线综合网| 国产夫妻性生活视频| 欧美久久人人网| 国产中文字幕在线点播| 午夜理论片在线观看免费| 欧美日韩操逼嗦吊| 久久久久免费少妇| 青女在线| 午夜噜噜噜| 国产一区二区三区高清视频| 老司机射| 欧美最婬乱婬爆婬性视频 | 大香蕉久| 天美精品av| 精品网站99999| 巨乳特殊服务按摩| 国产CHASE男男GAYGA 毛多色婷婷| 九九在线精品| 黄色十八禁| 999综合网| 欧美日韩性爱无码| 91N综合在线| 啊啊啊好大好深| 97爱爱爱| 天天综合网站| 日本三级韩国三级美三级91| 人人做,人人操,人人摸| 激情网五月天| 91黄射| 成年人黄色视频免费| 国产精品久久成人免费| 欧美情色贴图| 91另类| 秋霞一级视频在线观看免费| 啊啊啊在线观看免费视频| 亚洲综合网91| 色99视频| 后入福利| 国产精品自产拍在线观看社区| 2019AV天堂| 丰满人妻-区二区三区| 久久精品店| 欧美色997| 9久精品| 久久久精品国产亚洲AV无码| 1024手机看片欧美日韩| 免费一级性爱久久| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 中文字幕 人妻不满 在线视频| 99精品伊人| 国产一区二区啪啪视频| 亚洲天堂日本| 国产三级多多影院2022国产AA一级毛片无码| 97WW精品| 极品销魂美女一区二区 | 无毛精品| 亚洲暴力强奸AV| 九九九久久久久| 中国AV美女| 在线天堂999| 啊啊嗯嗯好爽| 极品粉嫩一区二区| 一级黄色性爱裸体视频| 老女人爆菊| 男人天堂东京热| 丁香五月性| 欧美午夜熟妇黑人精品91| 久久夜黄色无码A级大片| 天天天天天天天天综合| 午夜爽爽爽在线观看永久入口姬片| 天天日日本| 久久透逼视频| 蜜臀久久在线视频| 视频分类 国内精品| Julia Annxxxxx| 一区二区三区精品视频| 青青久草| 精品久久99| 人人操人人插 - 百度 - 百度| 91在线美女| 中文字幕欧美丝袜07资源| 玖玖97综合| 日韩欧美大片免费高清啪啪| 亚洲性少妇| 黄片免费看黄片免费看| 色综合国产在线观看| 热久日综合| 黄色高清无码无码破解免费暗网| 性爱乱伦视频免费| 电家庭影院午夜69久久夜色精品国产69乱 | 欧美 亚洲 在线| 香港日本韩国人妇99www.wccm20| 日韩性爱再线视频| 免费观看网黄| 欧美性第1页| 97色在线观看| 留下AⅤ黄色片| 婷婷综合伊人一区| 自拍第一页| 蜜色网色哟哟| 99亚洲天堂| 激情五月天插| 精品欧美老熟女一二区| 另类图片五月天| 久久的网站啊啊啊啊啊| 欧美一区二区亚洲天堂| 91看黄片| 东北熟女91| 好舒服视频| 黄色大片一区二区密桃丝袜| 91精品久久久久久综合五月天| AVE乱伦| 91美女片在线| 91精品操美女| 日本久久久久久久久久| 国产性爱欧美性爱在线| 九九亚洲精品| 九九九九九九九九九九九免费国产| 思思热免费视频观看| 伊人操你| 青娱乐国产剧情av一区| 亚洲一区中文字幕| 欧美成人精品一区| 一区二区无码视频| 亚洲 另类 丝袜 自拍 动漫| 欧美在线啊啊啊 | 日韩无码a片| 91狠狠| 欧美色图91| 不卡六六在线91| 色综合20p| 九九久久99| 中日无幕一二三四区| 99九九久久| 欧美精品1区2区3区| 岛国艾薇凹凸视频天堂| 亚洲二区精品在线观看 | 女性91网站| 密臀在线一区尤物| 精品一区二区三区18| 亚洲成人帖图| 亚洲成人在线乱码色午夜| 天天爽入口| 四虎影视永久在线观看精品免费网站 | 亚洲第一狼人丝袜美女另类| 免费人成在线观看网站品爱网| 国产 日韩 欧美一区| 丰满人妻一区二区三区色-百度| 这里都是精品| 亚洲国产精品无码AV久久| 天天射日日干| 亚洲天堂欧美| 丰满人妻无码一区二区三区| 亚洲最新a在线观看| 美女写真| 97五月天| 欧美色图天堂网m| 欧美 青青草| 殴洲老熟女| 91久久久久久久| 死我十八禁| 日韩无码人妻中字久久三区四区| 精品对白久久不卡| 中文字幕美女91| 无码丰满熟妇一区二区浪潮AV| 久综合国内精品自在自线| 亚欧免费| 亚洲精品美女久久久久久久久| 日韩啪啪网| 99热这里只有精| 台湾佬中文娱乐自偷自拍| 欧美性,色九九| 免费亚洲国产精品久久一区| 啊啊啊啊好爽好舒服一区二区易域| 97精| 淫荡少妇免费| oumeisetu综合| 美女91在线观看| 2019午夜福利视频| a男人的天堂久久一级A毛片| 大香网站| 六月婷激情福利天堂69| 天美一区在线| 久九色| 欧美国产欧美在线观看| 国产欧美精品日韩区二区麻豆天美| 啊嗯好大视频在线观看| 丰满人妻一区二区中文| 国产极品馒头逼| 亚洲欧洲精品视频发布| 久久久久久中文字幕中文字幕最新| 91美女视频在线| 久草精品在线| 93人人操人人| 91人人看| 人妻夜爽夜夜爽| 亚洲欧美日韩免费观看| 日欧操屄视频| 亚洲91大片| 白丝AV| 蜜臀操逼黄色视频操的好爽| 久久这里精品国产99丫e6| 天天综合站| 两女互慰AV高潮喷水在线观看| 蜜乳av首页| 9久久美女首页| 亚洲色电影在线| 国产成人综合在线播放| 日日日啊啊啊| 色综合一区二区三区| 女人喷水视频在线观看| 激情视频一二三| 亚洲美女av无码| 亚洲一区中文字幕一区| 2019午夜福利视频| 澳门黄片一香蕉视频| 9久精品| 热的中文 热的有码 热的国产| 久久9久| 色色操| 中文字幕色AV| 久久国内| 九久久精品| 亚洲国产尤物yw在线观看| 一本正道久久熟女| 亚洲天堂五月天国产| 国产精品一二三区福利| 久久尹人大香焦视| 天天爽夜夜操| 久久久555| 一起草精品人妻| 人妻少妇久久中文| 欧亚在线视频| 欧美综合色图片| 综合久久欧美| 麻豆天天躁天天揉揉AV| 人妻激情偷乱视三区频一区二区| 国产精品乱码久久久久久久| 国产a级午夜毛片| 亚洲综合夜色| 91精品丝袜久久久久久| 亚洲综合在线91| 久久思思热| 色97干| 成人情色一区二区| 91色拍| 91人妻超碰| 人妻少妇久久中文字幕一区二区 麻豆| 美女刺激久久国产欧美| 黄骗免费网站| 一区中文字幕二区日韩| 成人性爱av| 精品午夜福利| 东北女人av| 国内精品嫩模A∨私拍小视频| 欧美精品另类人妖xxxx| 国产精品人人爽人人做可爱福利| 插入粉嫩少妇视频| 色婷婷久久| 97干97色| 一区| 丁香六月婷婷综合| 蜜臀无码视频在线观看| 天天操人人操骚逼网站| 午夜一区| 国产女s强制榨精视频| 中文字幕第23区| 91久久久久久久久18| 好吊色综合| 日韩精彩免费| 干干干天天| 三级色影综合网| 岛国AV一区二区电影| 99国产在线 精品 视频| 日本女人久久久| 欧美色997| 久久男女激情视频网站 | 97精品久久久久久久| 91艹B视频| 一卡二卡三卡| 东京热精品97综合网| 婷婷亚洲色| 日本熟女不卡视频| 色偷偷综合91久久噜噜| 色狠狠综合噜一二三区| 天天日天天干天天整| 色欧洲| av72网| 小草精彩毛片| 99re久久| 又大又长又粗又爽又黄| 亚洲熟女av中文字幕| 日本不卡二三区| 激情五月婷| 激情抓乳插进去啪啪啪日韩 | 亚洲精品蜜桃久久久| 超碰性爱97| 成人欧美一区二区三区黑人一| 国产传媒午夜理伦精品| 天美传媒AV在线播放| 色阁阁AV综合网| 日韩乱码Av| 国产精品久久久久综合| 性爱乱伦视频免费| 国产无码久久高清| 91少妇人妻| 日韩亚洲97| 91欧美美女日韩国产婷婷| 天天干少妇| 亚洲免费人妻在| 国产精品福利资源在线尤物| 人妻三级在线中文字幕| 中国91AV| av橘色网站| 精品9区| 人人操天天爽| 淫色网综合| 粉嫩国产精品久久粉嫩| 99无码| 激情五月天视频| 精品区国产区一区二区三区| 极品尤物女神在线观看| 美女尤物人人操| 亚洲AV成人无码一二三久久| 91在线视频国产网站| 久久内射| 伊人操| 熟女精品日韩一区二区三区| 午夜啊啊| 国产精品农村妇女精品| 东京热毛片调教| 天美传媒精品久久视频| 亚洲成人AB| 日韩欧美三级| 激情小说在线视频| 中国农村熟妇毛片视频| 无码外流操逼视频| 日韩无码三级影院| 国产大学生口爆吞精合集| 精品人妻一区二区视频| 九九九久千久久激情蜜桃在线看 | 蜜臀av在线播放一区二区三区| 91五月天| 国产欧美精品日韩区二区麻豆天美| 淮穴色AV| 日本 免费 一区二区三区 久久香蕉 | 把腿张开老子CAO烂你| 三级网色| 丁香色婷婷| 久久五月份| 日韩美女久久一区二区三区| 丝袜av一区二区三区| 久久草视频污视频| 男人天堂毛片| 亚洲人妻在线精品| 高清无码在线播放网站| 亚洲欧美在线观看免费| 爱射综合| 亚洲另类久操网| baiduhicn.com。| 久久久久久裸体| 色欲久久99精品久久| 五十路成人在线视频二区三区| 亚洲图片欧美偷拍| 大香蕉综合网| a片久久久久久久久久久久 | 日本不卡高清免v欧美日韩在线观看| 日韩性色b| 91殴美大片| 69丨亚洲丨精品丨入口免费播放| 亚洲久久天堂| 欧美亚洲天堂| 欧美色性爱| 欧美在线播放aaaa| 人人色97| 国产精品乱码久久久久久| 后入式999| 天天综合97| 国产精品无码av在线 | 人妻精品视频一区二区三区 | 国产精品69久久久久孕妇欧美| 91天堂| WWW操逼| 麻豆这里只有精品| 欧美一区二区在线资源| 午夜精品久久久久久久| 久久伊人最新网址视频| 日本高清有码网址视频| 一品道视频一区二区三区| 色天堂综合| 九七超碰人人乐| 97色伦97色伦国产欧美| 超碰在线人妻| 乱精品一区字幕二区| 日本999精品| 亚洲色图A| 91足交| 蜜色网色哟哟| 大白逼三四级| 黄色AAAAA欧美| 香蕉综合网| www.av不卡中文字幕| 久久婷婷亚洲| 久久久久9999妇女| 另类欧美色| 中文字幕日韩人妻视频一区二区三区| 啊啊啊不要好疼视频| 亚洲精品国产熟女久久久| 加勒比综合| 嗯啊视频免费在线观看| 亚洲国产剧情少妇激情| 久久久极品| 五月天婷精品激情| 精品国产污一区二区三区| 麻豆视频一区二区| 九色婷婷| 男人的天堂com| 国产AV激情无码久久无码 | 欧洲一级性爱视频在线观看| 天堂岛av| 久久岛国| 亚洲操逼网| 91天堂丝袜美腿| 国产aⅴ无码片毛片一级网站| 亚洲一区二区三区久久 亚洲一区二区| 美女91网址| 亚洲成?V人片在线观看福利| 色阁阁AV综合网| 91精品久久久久五月天精品| 116美女午夜| 亚洲情色欧美| 偷窥自拍亚洲色图| 亚洲激情视频| 国产精品小视频一区二区三区| 亚洲人妻色图| 天天色综合图片| 久久久青青草| 五月婷丁香| 欧美日韩久久精品爱爱| 99色在线视频| …亚洲黄色厕厕女女在线播…| 婷婷五月天久久久| 0755午夜福利视频| 欧美久久九九| 久久久97| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 日韩精品人妻中文字幕久久久| 亚洲国产综合图区中文字幕 | 在线A日本| 九九亚洲色在线观看| 国产黄色av大片网站| 日本孕妇孕交| 天天躁日日躁AAAXX| 97碰碰色| 亚洲性综合9| 日韩强奸av| x97av| 中文一区在线视频| 欧美 亚洲 在线| 国产又粗又长又爽又色| 天天噜| 9久热| 97日韩| 色好看av| 综合久久欧美| 久夜视频| a人片中文字幕一区二区| AAAAAAAAA黄片| 蜜臀va69| 18岁禁 茉莉成人久久| 国产精品一区午夜福利| 欧美激情 一区| 国产精品亚洲免费| 呦呦一区| 欧美亚洲厕所精品偷拍91 | 蜜臀久久久99久久久久| 久久久久久久久久黄色网| 福利视频一区二区微拍| 人妻丝袜美腿中文字幕| 激情小说亚洲| 久久视频,这里只有精品 | www熟女乱伦com| 亚洲日本天堂| 夜夜嗨AV蜜臀av| 亚洲 暴爽 AV人人爽日日碰| 夜夜夜夜爽| 久久久人体| 亚洲砖码砖专无区2023| 亚洲精品97| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 国产91会所女技师在线观看| 久久精品一区二区三区蜜桃臀| 99999无码| 无码人妻丰满热妇又大又粗| 国产婷婷综合在线观看| 国产视频97| 白丝1区2区3区| 久久精品店| A级国产欧美激情在线| 后入人妻无码| 91性感网站| 好爽,再快点啊哈嗯嗯嗯嗯| 色爱三区| 最近2018中文字幕在线高清第一页| 91热| 日韩色女精品| 欧美日动态视频| 天天看少妇| 五月天婷婷色| 播播亚洲小说亚洲| 色狠狠 - 百度| 欧美日本成人一区二区| 成人久久精品| 成人A片男人的天堂| 伊人成人中文字幕久久网| 亚洲熟女av日韩熟女| 亚洲黄色视频在线观看视频| 麻豆国产97在线| 草久在线| 97在线播放 | 熟妇人妻一区二区三区| 国内外色色色色色成人视频| 激情四射五月天| 亚洲国产一级精品毛一级精品看免费视频| 久久首页| 亚洲日本激情| 日韩性爱人人爱人人操| a片自拍直播视频| 久久久久久999| 亚洲欧美清纯| 大香蕉草草| 啪啪自拍九九综合| 加勒比aⅴ| 日日操夜夜操天天操免费观看麻豆| 果冻传媒A片一二三区| 国产精品久久久999| 欧洲亚洲人人爽爽视频| www.男人天堂| 欧美色图自拍| 亚洲成人在线资源| 大逼色网站| 91亚洲最新在线| 黄页网站成人免费| 97爱亚洲| 99久久久无码国产精品性啊聊| 黄色成人网久久久久久| 操逼无码操逼| 国产成人一级av88| 久久亚洲AV无码专区国产精品| 亚洲最新Av| 操逼片国产| 国模艳艳啪啪一区| 毛片电影一区二区三区| 开心五月天激情网| 蜜臀亚洲中文| 日韩久久艹| 一卡二卡在线播放| 亚洲欧美在线丝袜| 呦呦一区| 日韩国产乱子伦App| 久久精视频美日韩在线视频| 亚洲天堂综合AV| 99re6国产精品99re在线| 国产乱弄免费在线视频。| 国产25页| 性高潮久久久久久久久久久| 亚洲高清91| 偷拍精品一区二区三区| 老司机老司机午夜影院| 91亚洲狠狠色| 天美传媒婬乱在| J?P?NESEHD熟女熟妇伦| 日本色色色视频| 婷婷色综合| 欧美在线啊啊啊 | 久久9精品视频| 嗯嗯啊啊好大好爽| 男人天堂新| 精品国产无码中文| 人人透人人操| 野狼激情网| 伊人久久亚洲中文字幕不卡| 久久有码视频| 99热99在线播放激情| www.色婷婷.com| 小草av不卡亚洲二区 | 啊啊啊啊二区好大| 91日韩网站| wwwxxx日本爽| 黄污污污污| 色五月AV在线| 香蕉欧美| 亚洲国产第一页综合视频| 97超碰色屌| 男人的午夜天堂| 家庭乱伦性爱av| 天堂蜜桃无码视频一区二区| 欧美综合在线第一页| 尤物视频视频官网| 激情第四色| 久久久少妇诱惑精品视频| 99999精品| 伊人影院综合是一个与深夜成人在线| 熟女人妻av在线资源,黄色的资源| 干B| 欧美精品69性爱| 99热综合| 日韩综合第八区国产精品| 91被操| 天天看少妇| 欧美丝袜91| 国产吞精a级片激情电影| 后入人妻一区| 国产在线综合福利网站| www.99视频| 亚洲区小说| 一线黄色免费性爱片| 九九英色视频| 中文字幕丰满子伦无码专区在线视频最新| 美国人人操人人操| 女生自91网站| 青娱乐二区免费| 超碰 另类 欧美 | 日韩特一级久久| 思思热免费在线视频| 人妻加勒比东京热| 999久久久国产精品| 日韩乱插| www男人天堂| 操婷婷逼| 国产视频第二页| 天天插天天操| 97视频免费播放| 色情综合| 五月天伊人网| 婷婷尹人大香蕉免费| 欧美色图综合网| 久久99视频| 欧美啪啪色吧在线| 亚洲欧美精品91| 91天天| 奸色色 男人天堂 天天射| 激情小说亚洲| 综合国产97| 日本操逼视频不卡直接放| 欧美在线色图| 狠狠中文字幕| 久久精品高清无码一区| 亚洲欧洲国产综合av| 婷婷探花久久精品一区| 9 9精品一区二区三区| 久草这里只有精品 | 男人的天堂va| 日本97久久久精品| 吖在线不卡一区二区国产剧情| 射丝袜大香蕉| 日韩av影片在线观看| 超碰在线91| 国产精品久久久久久夜夜夜| 少妇厨房愉情理伦片bd在线观看| 日日嗨AV一区二区夜夜| 无色无码| 啊啊嗯嗯好爽| 久久av色| 动漫爆乳3D奶水一区在线观看 | 五月天激情小说网| 大香蕉久| 欧美性xxxxx狂欢| 在线小视频| 我要看免费韩日黄片| 好色综合| 老熟妇综合| 成人精品在线观看| 成人五月天丁香激情综合| 久久夜精品一区二区三区| 亚欧韩av| 国产男女边吃边摸视频网站| 欧美亚州色的图| 夜夜嗨一区二区| 大香蕉www.超碰| 久久伊人影院| 狠狠夜色午夜久久综合在线| 成人精品在线| 中文字幕天堂在线| 日本道人妻久久久在线不卡色视频| 日韩精品区二区三区不卡| 岛国大片在线观看网站入口| 老熟女综合网| 91爱看| 欧美在线视频99| 性爱Av免费| 天堂成人网| 国产不卡的视频 | 久久久久亚洲三级电影| 久久久九九| 亚洲 se图 欧美电影| 日韩精品一区二区日韩| 欧美亚洲首页| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 日韩美女久久一区二区三区| 囯产乱伦一区二区三女| 久久二| 日韩有码回春沙龙第一页| 婷婷丁香六月天| 欧美大香蕉专区网| 色网亚洲人| 久久久久久少妇| 人人妻人人操人人乐| 亚洲精品日韩国产欧美| 亚洲最新av无码成人精品区| 探花精品 一区二区| 亚洲成人AB| 久久同城AV| 国产精品久久久777| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 国产精品成久久久久午夜午夜| 精品女同一区二区三区| 亚洲欧美一区二区不卡视频播放| 欧美色图中文字幕| 99精彩视频| 亚洲色欲天天人妻无码系列专区| av在线观看不卡网站| 三级精品三级在线观看| 亚欧美色| 老熟女综合| 久久激情视频| 四虎免费在线播放| 一二三四视频在线社区中文字幕| 欧亚久久偷拍视频| 欧美色图天堂网m| 色香阁在线| 欧美色图亚洲色图成人在在线| 韩日精品四区| 色玖玖| 中文字幕第页| 校园春色制服丝袜中文字亚洲| 日本网色| 五月婷婷激情网| 99视频自拍| 婷婷五月天影院| 免费黄色片子| 色色无码| 丁香六月综合激情| 亚洲AV无码天美传媒一区| 白嫩嫩一区| 亚洲图片 91| 人妻在线中出视频| 国产精品一区二区在钱播放| 久久25| 91色五月俺来也| 艳尻美人妻| 免费看污网址| 蜜臀av网址| 久久久久久裸体| 99rre在线精品99re8| 欧美综色欧| 九九热AV| 国产又黄又爽又刺激久久久久久 | 在线小说视频一区| 一级AAA片一区二区三区| 人妻熟女一区二区| 久久精品国产亚洲av水密被窝| 欧美综合另类| 色欲Av人妻精品一区二| 国产精品999zyz| 国产福利小视频高清在线观看| 日韩无码成人电影| 五月天色图影视| 欧美大香蕉97| 91被操| 中日亚韩免费视频| 综合免费无码中文| 亚洲色诱惑| 91九色丨国产丨爆乳| 久插综合| 亚洲高潮影院| 97超碰超碰| 日韩 欧美 另类 人妻| 秋霞一级视频在线观看免费| 视频在线观看一二三区| 激激五月| 久热大香蕉网站| 久操免费在线| 99老司机精品视频在线观看| 色综合婷婷| 台湾佬激情综合| 伊人色综合欧美| 91性感在线| 国产操操日韩三级黄| 老司机射| 亚洲中文人妻色| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 亚州色站 日韩电影| 久久影视二区三区行押| 新怡红院| 男人的天堂午夜av| 亚洲日本加勒比在线| 亚欧中文字幕在线视频| 9久久久久久| 欧美在线永久天堂| 狠狠操天天干| 九九九九九九九九九五码| 亚洲男人的天堂va亚洲男人社| 人人操人人插人www| 99热66| 免费99精品国产自在在线| 日日夜夜精品视频| 国产精品老师| 97超碰逼| 伊人国产成人av网站| 人妻精品免费一二三区| 五月天开心网| WWW美腿丝袜香蕉中文| 97啪啪| 婷婷五月天伊人| 亚洲国内精品成人不卡| 亚洲影院365| 浪人综合网| A啊啊在线观看| 翔田千里A片一区二区| 日韩av乱伦| 97天天插| 老子午夜伦不卡影院| 嗯啊不要啊啊在线观看视频| 色妇综合网| 亚洲强奸乱伦影视网| 老司机免费视频在线91| 96精品久久久久久久久久| 美日韩成人| 久久偷偷色综合蜜桃| av强奸乱轮| 成人A片男人的天堂| 91亚洲高清| 花野真衣| 加勒比海人人操超碰在线| 大香蕉乱伦视频网| 夜夜春夜夜操| 国产日韩欧美亚洲精品95 | 最近二区三区视频大全| 凸凹视频在线观看| 九九自拍伦理| 草草影院最新网址| 999日韩中文精品观看视频。| 亚洲人妻爽爽爽| 99re视频在线观看这里只有精品| 日韩欧美蜜桃精品久久中文字幕久久| 凹凸久久人人| 嗯嗯啊好大| blacked精品一区国产| 日日妻色网| 97超碰站| 午夜男人天堂| 久伊人网78| 精品人妻美妇91job| 殴美日韩m| 天堂69亚洲精品中文字| 久久偷拍人| 人摸人人操人| 超碰精品人妻狠狠干| 国产 丝袜 欧美中文 另类| 99热大香蕉伊在线| 国产免费一区在线观看| 97超碰9| 素人播放一区| 波多野结衣AV无码一区| 亚洲成人精品久久久| 国产女乱淫真高清免费视频| 亚州欧美综合| 丰满的三级少妇欧美久久久| 97这里有精品| 成人综合色网| 色色网91| 91热色| 狠狠色丁香| 国产高清午夜成人在线观看| 日日夜夜干| 人人操人人插 - 百度 - 百度| 日韩精品操少妇| 国产 亚洲 丝袜 制服| 欧美午夜熟妇黑人精品91| 91超碰人人操| 亚洲一二三四区| 色综和网| 国产成人www免费人成看片| 久久啊啊| 五十路熟女工口 | 国产馆极品诱惑| 99re国产精品视频| 无码二级三级| 五月天丁香欧洲日韩| 思思热免费在线视频| 中文字幕av一区二区三区人妻少妇 | 无码抄逼网| 四虎884| 观看视频图片一区二区三区| 国产乱人伦AVA麻豆软件.| 性欧美| 曰本熟女视频| 日本色色色视频| A 天堂| 欧日韩一二三f区| 啪啪91| 九九无码视频| 色婷婷六月丁香七月婷婷| 2017天天透天天通天天擦| 91亚洲人电影| 四虎国产精品永久在线囯在线| 俺也射| 久草资源欧美在线视频| aⅴ日韩成人电影av在线免费看av大全 | 又黄又爽在线观看视频| 18禁无码永久免费无限制| 91欧美经典| 夜夜嗨绯色| 亚洲不卡不卡中文字幕不卡| 大地资源在线观看中文第二页| 久久久97| 国内一级精品| 伊人久久亚洲色欲综合网站 | 欧美性爱第一页久久| 老司机香蕉| 青青草玖玖爱| 男女打扑克高清网站| 九九黄色视频在线观看| 加勒比中文av| 91丝袜人妻| 欧美在线干| 哈哈操电影AV| 久久天天摸| 婷婷激情五月综合| 青娱乐亚洲自拍| 欧美A片中文字幕| 啊啊啊好想要| 好爽视频在线观看| 久久久久久久久久久久欧美日| 日本丝袜美腿人妻九九| 蜜臀久久一区二区| www.色婷婷色综合| 成人免费不卡在线视频| 手机在线中文字幕国产| 久久夜夜| 久久69| 青操影院| 欧美综合网1| 伊人aaa| 97人人爱人人做人人乐| 日韩影片中文字幕一区二区三区| 91N欧美| 五月婷婷啪啪| 亚洲精品第一| 中文字幕中文字幕一区二区| 国语对白露脸XXXXXX| 东北毛片| 夜色97| 中文字幕av久久爽Av| 色欲天天综合网| 少妇被c 黄 免费观看| 青草一区二区| 男人久久天堂| 丝袜美腿亚洲| 快灬快灬 一下爽蜜桃在线观看| julia国产在线| 亚洲欧美日韩国产丝袜自拍中文| 精品无码人妻一区二区免费蜜桃| 久久爽爽精品| 爱啪精品一区| 91欧美综合在线| 国产精品乱码久久久、久久| 乱久久久| 羞答答AV中文字| 欧洲精品二区| 久久久久久九九九九九| 欧美色图 色综合图| 丁香色狠狠色综合久久小说| 日韩无码人妻中字久久三区四区| 欧美日韩狠狠爱| 丰满熟女一区二区三区在线播放| 亚欧美色图| 欧美激情精品| 老熟女乱伦片| 久久久久久精| 国产又黄又粗的视频| 日韩性爱免费视频在线网站| 中文字幕91页| 色噜噜人妻丝袜a∨先锋影| 深夜激情无码| 久久九九99| 久久天天摸| www.男人天堂| 国产精品农村妇女| 熟女人妻一区二区三区免费看| 粉嫩av平台| 国产女人操逼视频| 国产精品视频精品一二| 天天综合网国产| 天天看高清麻豆| 91处女视频在线观看| 国产一区二区精品久久久不卡蜜臀| 中文字幕三四区| 中文字幕精品日韩中文字幕| 久久鲁干| 亚洲、日韩、综合、另类|