日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql深入浅出学习

發(fā)布時間:2023/12/10 数据库 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql深入浅出学习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • MySQL邏輯架構(gòu)圖
  • redo log
    • 為什么要redo log?
  • binLog
    • 為什么會有兩份日志?
    • 兩種日志的區(qū)別
  • 簡單update語句執(zhí)行流程
  • 兩階段提交
  • 事務隔離
    • 什么是事務?
    • 隔離性與隔離級別
    • 事務隔離的實現(xiàn)?
  • 索引
    • InnoDB的索引模型
    • 覆蓋索引
    • 最左前綴原則
    • 索引下推
    • 鎖的類型有哪些?
    • 全局鎖
    • 表級鎖
    • 行鎖
    • 死鎖和死鎖檢測
  • 普通索引和唯一索引,怎么選?
  • MySQL為什么有時候會選錯索引?
  • 怎么給字符串字段加索引?
  • SQL語句突然“變慢”?
  • 為什么表數(shù)據(jù)刪掉一半,表文件大小不變?
  • 為什么count(*)這么慢?
  • 不同的count用法
  • “order by”是怎么工作的?
    • 按字段排序
    • rowid排序
  • 查詢響應慢排查
    • MDL鎖
    • flush
    • 等行鎖
    • 一致性讀原因?qū)е?/li>
    • 什么是幻讀?
    • 幻讀有什么問題?
    • 如何解決幻讀?
  • MySQL加鎖規(guī)則解讀
    • MySQL加鎖原則
    • 案例一:等值查詢間隙鎖
    • 案例二:非唯一索引等值鎖
    • 案例三:主鍵索引范圍鎖
    • 案例四:非唯一索引范圍鎖
    • 案例五:唯一索引范圍鎖bug
    • 案例六:非唯一索引上存在“等值”的例子
    • 案例七:非唯一索引上存在“等值”的例子
    • 案例八:死鎖例子
  • 索引失效反面案例
    • 條件字段函數(shù)操作
    • 隱式類型轉(zhuǎn)換
    • 隱式字符編碼轉(zhuǎn)換
  • 慢查詢處理技巧
    • 索引沒有設(shè)計好
    • 語句沒寫好
    • MySQL選錯了索引

學習自jdh莫老師

MySQL邏輯架構(gòu)圖

redo log

為什么要redo log?

如果每一次的更新操作都需要寫進磁盤,然后磁盤也要找到對應的那條記錄,然后再更新,整個過程 IO 成本、查找成本都很高。為了解決這個問題,MySQL 的設(shè)計者采用了WAL技術(shù)(Write-Ahead Logging),關(guān)鍵點就是先寫日志,再寫磁盤,這個日志就是redo log。redo log是InnoDB引擎特有的日志。

binLog

為什么會有兩份日志?

redo log 是 InnoDB 引擎特有的日志,而 Server 層也有自己的日志,稱為 binlog(歸檔日志)。那為什么會有兩份日志呢?因為最開始 MySQL 里并沒有 InnoDB 引擎。MySQL 自帶的引擎是 MyISAM,但是 MyISAM 沒有 crash-safe 的能力,binlog 日志只能用于歸檔。而 InnoDB 是另一個公司以插件形式引入 MySQL 的,既然只依靠 binlog 是沒有 crash-safe 能力的,所以 InnoDB 使用另外一套日志系統(tǒng)——也就是 redo log 來實現(xiàn) crash-safe 能力。

兩種日志的區(qū)別

redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 層實現(xiàn)的,所有引擎都可以使用。
redo log 是物理日志,記錄的是“在某個數(shù)據(jù)頁上做了什么修改”;binlog 是邏輯日志,記錄的是這個語句的原始邏輯,比如“給 ID=2 這一行的 c 字段加 1 ”。
redo log 是循環(huán)寫的,空間固定會用完;binlog 是可以追加寫入的。“追加寫”是指 binlog 文件寫到一定大小后會切換到下一個,并不會覆蓋以前的日志。

簡單update語句執(zhí)行流程

update T set c=c+1 where ID=2

兩階段提交

由于 redo log 和 binlog 是兩個獨立的邏輯,如果不用兩階段提交,數(shù)據(jù)庫的狀態(tài)就有可能和用它的日志恢復出來的庫的狀態(tài)不一致。redo log 和 binlog 都可以用于表示事務的提交狀態(tài),而兩階段提交就是讓這兩個狀態(tài)保持邏輯上的一致。假設(shè)不用兩階段提交,會出現(xiàn)如下情況

  • 先寫 redo log 后寫 binlog。假設(shè)在 redo log 寫完,binlog 還沒有寫完的時候,MySQL 進程異常重啟。由于我們前面說過的,redo log 寫完之后,系統(tǒng)即使崩潰,仍然能夠把數(shù)據(jù)恢復回來,所以恢復后這一行 c 的值是 1。但是由于 binlog 沒寫完就 crash 了,這時候 binlog 里面就沒有記錄這個語句。因此,之后備份日志的時候,存起來的 binlog 里面就沒有這條語句。然后你會發(fā)現(xiàn),如果需要用這個 binlog 來恢復臨時庫的話,由于這個語句的 binlog 丟失,這個臨時庫就會少了這一次更新,恢復出來的這一行 c 的值就是 0,與原庫的值不同。先寫 binlog 后寫 redo log。如果在 binlog 寫完之后 crash,由于 redo log 還沒寫,崩潰恢復以后這個事務無效,所以這一行 c 的值是 0。但是 binlog 里面已經(jīng)記錄了“把 c 從 0 改成 1”這個日志。所以,在之后用 binlog 來恢復的時候就多了一個事務出來,恢復出來的這一行 c 的值就是 1,與原庫的值不同。
  • 先寫 binlog 后寫 redo log。如果在 binlog 寫完之后 crash,由于 redo log
    還沒寫,崩潰恢復以后這個事務無效,所以這一行 c 的值是 0。但是 binlog 里面已經(jīng)記錄了“把 c 從 0 改成1”這個日志。所以,在之后用 binlog 來恢復的時候就多了一個事務出來,恢復出來的這一行 c 的值就是 1,與原庫的值不同。

事務隔離

什么是事務?

簡單來說,事務就是要保證一組數(shù)據(jù)庫操作,要么全部成功,要么全部失敗。MySQL 是一個支持多引擎的系統(tǒng),但并不是所有的引擎都支持事務。比如 MySQL 原生的 MyISAM 引擎就不支持事務,這也是 MyISAM 被 InnoDB 取代的重要原因之一。

隔離性與隔離級別

隔離性是事務ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔離性、持久性)中的I,當數(shù)據(jù)庫上有多個事務同時執(zhí)行的時候,就可能出現(xiàn)臟讀(dirty read)、不可重復讀(non-repeatable read)、幻讀(phantom read)的問題,為了解決這些問題,就有了“隔離級別”的概念。SQL 標準的事務隔離級別包括:讀未提交(read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(serializable )
讀未提交是指,一個事務還沒提交時,它做的變更就能被別的事務看到。
讀提交是指,一個事務提交之后,它做的變更才會被其他事務看到。
可重復讀是指,一個事務執(zhí)行過程中看到的數(shù)據(jù),總是跟這個事務在啟動時看到的數(shù)據(jù)是一致的。當然在可重復讀隔離級別下,未提交變更對其他事務也是不可見的。
串行化,顧名思義是對于同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”。當出現(xiàn)讀寫鎖沖突的時候,后訪問的事務必須等前一個事務執(zhí)行完成,才能繼續(xù)執(zhí)行。

Oracle 數(shù)據(jù)庫的默認隔離級別是“讀提交”,MySQL則是“可重復讀”

事務隔離的實現(xiàn)?

在 MySQL 中,實際上每條記錄在更新的時候都會同時記錄一條回滾操作。記錄上的最新值,通過回滾操作,都可以得到前一個狀態(tài)的值。假設(shè)一個值從 1 被按順序改成了 2、3、4,在回滾日志里面就會有類似下面的記錄。當前值是 4,但是在查詢這條記錄的時候,不同時刻啟動的事務會有不同的 read-view。如圖中看到的,在視圖 A、B、C 里面,這一個記錄的值分別是 1、2、4,同一條記錄在系統(tǒng)中可以存在多個版本,就是數(shù)據(jù)庫的多版本并發(fā)控制(MVCC)


索引

InnoDB的索引模型

在 MySQL 中,索引是在存儲引擎層實現(xiàn)的,所以并沒有統(tǒng)一的索引標準,即不同存儲引擎的索引的工作方式并不一樣。在 InnoDB 中,表都是根據(jù)主鍵順序以索引的形式存放的,這種存儲方式的表稱為索引組織表。InnoDB 使用了 B+ 樹索引模型,所以數(shù)據(jù)都是存儲在 B+ 樹中的。每一個索引在 InnoDB 里面對應一棵 B+ 樹。
create table T(id int primary key, k int not null, name varchar(16),index (k))engine=InnoDB;表中 R1~R5 的 (ID,k) 值分別為 (100,1)、(200,2)、(300,3)、(500,5) 和 (600,6),兩棵樹的示例示意圖如下。

覆蓋索引

在一個查詢里面,索引 k 已經(jīng)“覆蓋了”我們的查詢需求,我們稱為覆蓋索引。由于覆蓋索引可以減少樹的搜索次數(shù),顯著提升查詢性能,所以使用覆蓋索引是一個常用的性能優(yōu)化手段。例如如果有一個高頻請求,要根據(jù)市民的身份證號查詢他的姓名,建立一個(身份證號、姓名)的聯(lián)合索引就有意義了,可以在這個高頻請求上用到覆蓋索引,不再需要回表查整行記錄,減少語句的執(zhí)行時間。

最左前綴原則

B+ 樹這種索引結(jié)構(gòu),可以利用索引的“最左前綴”,來定位記錄。比如說已經(jīng)有了(name,age)這個聯(lián)合索引,SQL 語句的條件是"where name like ‘張 %’"。這時,你也能夠用上這個索引,查找到第一個符合條件的記錄是 ID3,然后向后遍歷,直到不滿足條件為止。這個最左前綴可以是聯(lián)合索引的最左 N 個字段,也可以是字符串索引的最左 M 個字符。已經(jīng)有了 (a,b) 這個聯(lián)合索引后,一般就不需要單獨在 a 上建立索引了

索引下推

MySQL 5.6 引入的索引下推優(yōu)化(index condition pushdown), 可以在索引遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數(shù)。

鎖的類型有哪些?

根據(jù)加鎖的范圍,MySQL 里面的鎖大致可以分成全局鎖、表級鎖和行鎖三類。

全局鎖

全局鎖就是對整個數(shù)據(jù)庫實例加鎖。MySQL 提供了一個加全局讀鎖的方法,命令是 Flush tables with read lock (FTWRL)。當你需要讓整個庫處于只讀狀態(tài)的時候,可以使用這個命令,之后其他線程的以下語句會被阻塞:數(shù)據(jù)更新語句(數(shù)據(jù)的增刪改)、數(shù)據(jù)定義語句(包括建表、修改表結(jié)構(gòu)等)和更新類事務的提交語句。全局鎖的典型使用場景是,做全庫邏輯備份。一般只有不支持事務的數(shù)據(jù)庫引擎才會用到這種鎖,如MyISAM

表級鎖

MySQL 里面表級別的鎖有兩種:一種是表鎖,一種是元數(shù)據(jù)鎖(meta data lock,MDL)。表鎖的語法是 lock tables … read/write。在 MySQL 5.5 版本中引入了 MDL鎖,每執(zhí)行一條DML、DDL語句時都會申請MDL鎖,DML操作需要MDL讀鎖,DDL操作需要MDL寫鎖(MDL加鎖過程是系統(tǒng)自動控制,無法直接干預,讀讀共享,讀寫互斥,寫寫互斥)。MDL讀鎖之間不互斥,因此可以有多個線程同時對一張表增刪改查。MDL讀寫鎖之間、寫鎖之間是互斥的,用來保證變更表結(jié)構(gòu)操作的安全性。因此,如果有兩個線程要同時給一個表加字段,其中一個要等另一個執(zhí)行完才能開始執(zhí)行。

行鎖

MySQL 的行鎖是在引擎層由各個引擎自己實現(xiàn)的。但并不是所有的引擎都支持行鎖,比如 MyISAM 引擎就不支持行鎖。不支持行鎖意味著并發(fā)控制只能使用表鎖,對于這種引擎的表,同一張表上任何時刻只能有一個更新在執(zhí)行,這就會影響到業(yè)務并發(fā)度。InnoDB 是支持行鎖的,這也是 MyISAM 被 InnoDB 替代的重要原因之一。
在 InnoDB 事務中,行鎖是在需要的時候才加上的,但并不是不需要了就立刻釋放,而是要等到事務結(jié)束時才釋放。這個就是兩階段鎖協(xié)議。如果事務中需要鎖多個行,要把最可能造成鎖沖突、最可能影響并發(fā)度的鎖盡量往后放。

死鎖和死鎖檢測

當并發(fā)系統(tǒng)中不同線程出現(xiàn)循環(huán)資源依賴,涉及的線程都在等待別的線程釋放資源時,就會導致這幾個線程都進入無限等待的狀態(tài),稱為死鎖。針對死鎖,InnoDB有兩種解決策略
一種策略是,直接進入等待,直到超時。這個超時時間可以通過參數(shù) innodb_lock_wait_timeout 來設(shè)置。在 InnoDB 中,innodb_lock_wait_timeout 的默認值是 50s,意味著如果采用這個策略,當出現(xiàn)死鎖以后,第一個被鎖住的線程要過 50s 才會超時退出,然后其他線程才有可能繼續(xù)執(zhí)行。對于在線服務來說,這個等待時間往往是無法接受的。但是超時時間設(shè)置太短的話,會出現(xiàn)很多誤傷。
另一種策略是,發(fā)起死鎖檢測,發(fā)現(xiàn)死鎖后,主動回滾死鎖鏈條中的某一個事務,讓其他事務得以繼續(xù)執(zhí)行。將參數(shù) innodb_deadlock_detect 設(shè)置為 on,表示開啟這個邏輯。

普通索引和唯一索引,怎么選?

這兩類索引在查詢能力上是沒差別的,主要考慮的是對更新性能的影響。對唯一索引來說,所有的更新操作都要先判斷這個操作是否違反唯一性約束。比如,要插入 (4,400) 這個記錄,就要先判斷現(xiàn)在表中是否已經(jīng)存在 k=4 的記錄,而這必須要將數(shù)據(jù)頁讀入內(nèi)存才能判斷。如果都已經(jīng)讀入到內(nèi)存了,那直接更新內(nèi)存會更快,就沒必要使用 change buffer 了。因此,唯一索引的更新就不能使用 change buffer,實際上也只有普通索引可以使用。將數(shù)據(jù)從磁盤讀入內(nèi)存涉及隨機 IO 的訪問,是數(shù)據(jù)庫里面成本最高的操作之一。
綜上所述,建議盡量選擇普通索引,如果所有的更新后面,都馬上伴隨著對這個記錄的查詢,應該關(guān)閉 change buffer。而在其他情況下,change buffer 都能提升更新性能。在實際使用中,普通索引和 change buffer 的配合使用,對于數(shù)據(jù)量大的表的更新優(yōu)化還是很明顯的。

MySQL為什么有時候會選錯索引?

隨著表數(shù)據(jù)的不斷增刪,可能會出現(xiàn)MySQL 選錯索引,根本原因是MySQL沒能準確地判斷出掃描行數(shù)或者錯誤地計算了執(zhí)行成本,這種是低概率事件,但是某些場景下有可能觸發(fā)MySQL的這個bug,解決方法一般有以下幾種
由于索引統(tǒng)計信息不準確導致的問題,可以用 analyze table 來解決
采用 force index 強行選擇一個索引,不過這個弊端也很明顯,一來這么寫不優(yōu)雅,二來如果索引改了名字,這個語句也得改,顯得很麻煩。而且如果以后遷移到別的數(shù)據(jù)庫的話,這個語法還可能會不兼容。
修改語句,引導 MySQL 使用我們期望的索引。 如把select * from t where (a between 1 and 1000) and (b between 50000 and 100000) order by b limit 1改成select * from t where (a between 1 and 1000) and (b between 50000 and 100000) order by b,a limit 1
新建一個更合適的索引,來提供給優(yōu)化器做選擇,或刪掉誤用的索引。

怎么給字符串字段加索引?

主要看該字段的區(qū)分度是不是足夠大,建索引是否有必要。如果有必要,建索引有兩種方法,一種是整個字段索引,如果字段值普遍較長,則可能會消耗較大的存儲空間,另一種是使用前綴索引,定義好長度,就可以做到既節(jié)省空間,又不用額外增加太多的查詢成本。如:alter table SUser add index index2(email(7))。那問題來了,當要給字符串創(chuàng)建前綴索引時,有什么方法能夠確定應該使用多長的前綴呢?
select count(distinct email) as L from SUser;
select count(distinct left(email,4))as L4, count(distinct left(email,5))as L5, count(distinct left(email,6))as L6, count(distinct left(email,7))as L7,from SUser;

但是使用前綴索引,就用不上覆蓋索引對查詢性能的優(yōu)化了

小技巧:倒序存儲和使用 hash 字段

SQL語句突然“變慢”?

InnoDB 在處理更新語句的時候,只做了寫日志這一個磁盤操作,這個日志叫作 redo log(重做日志)。平時執(zhí)行很快的更新操作,其實就是在寫內(nèi)存和日志,而 MySQL 偶爾“抖”一下的那個瞬間,可能就是在刷臟頁(flush)。MySQL在下面這些情境下會做flush操作
InnoDB 的 redo log 寫滿了。這時候系統(tǒng)會停止所有更新操作,把 checkpoint 往前推進,redo log 留出空間可以繼續(xù)寫。這種情況是 InnoDB 要盡量避免的。因為出現(xiàn)這種情況的時候,整個系統(tǒng)就不能再接受更新了
系統(tǒng)內(nèi)存不足。當需要新的內(nèi)存頁,而內(nèi)存不夠用的時候,就要淘汰一些數(shù)據(jù)頁,空出內(nèi)存給別的數(shù)據(jù)頁使用。如果淘汰的是“臟頁”,就要先將臟頁寫到磁盤。這種情況其實是常態(tài)。但是出現(xiàn)以下這兩種情況,都是會明顯影響性能的
一個查詢要淘汰的臟頁個數(shù)太多,會導致查詢的響應時間明顯變長;
日志寫滿,更新全部堵住,寫性能跌為 0,這種情況對敏感業(yè)務來說,是不能接受的。
要用到 innodb_io_capacity 這個參數(shù)了,它會告訴 InnoDB 數(shù)據(jù)庫主機的磁盤能力。這個值建議設(shè)置成磁盤的 IOPS。磁盤的 IOPS 可以通過 fio 這個工具來測試。并且平時要多關(guān)注臟頁比例(innodb_max_dirty_pages_pct),不要讓它經(jīng)常接近 75%。如果是SSD盤,innodb_flush_neighbors參數(shù)設(shè)置成0
MySQL 認為系統(tǒng)“空閑”的時候。
MySQL 正常關(guān)閉

為什么表數(shù)據(jù)刪掉一半,表文件大小不變?

delete 命令其實只是把記錄的位置,或者數(shù)據(jù)頁標記為了“可復用”,但磁盤文件的大小是不會變的。也就是說,通過 delete 命令是不能回收表空間的。這些可以復用,而沒有被使用的空間,看起來就像是“空洞”。不止是刪除數(shù)據(jù)會造成空洞,插入數(shù)據(jù)也會。也就是說,經(jīng)過大量增刪改的表,都是可能是存在空洞的。所以,如果能夠把這些空洞去掉,就能達到收縮表空間的目的。而重建表,就可以達到這樣的目的。
MySQL 5.6 版本開始引入的 Online DDL,對表重建操作流程做了優(yōu)化,可以通過執(zhí)行alter table t engine=InnoDB對表進行重建。通過日志文件記錄和重放操作,在重建表的過程中,允許對表做增刪改操作。重建方法都會掃描原表數(shù)據(jù)和構(gòu)建臨時文件。對于很大的表來說,這個操作是很消耗 IO 和 CPU 資源的。因此,如果是線上服務,需要很小心地控制操作時間。

為什么count(*)這么慢?

為什么 InnoDB 不跟 MyISAM 一樣,也把記錄總數(shù)存起來呢,查詢的時候直接返回?這是因為即使是在同一個時刻的多個查詢,由于多版本并發(fā)控制(MVCC)的原因,InnoDB 表“應該返回多少行”也是不確定的。對于 count(*) 這樣的操作,遍歷哪個索引樹得到的結(jié)果邏輯上都是一樣的。因此,MySQL 優(yōu)化器會找到最小的那棵樹來遍歷,但是如果表的數(shù)據(jù)十分巨大,因為是整棵樹遍歷,所以性能會非常差。如果有高頻需要獲取大表記錄總數(shù)的場景,需要自己進行計數(shù)。
比如可以在數(shù)據(jù)庫里面建一張表,把高頻需要獲取記錄總數(shù)的大表的記錄數(shù)自己進行維護,獲取總數(shù)時候直接從該表獲取。

不同的count用法

對于 count(主鍵 id) 來說,InnoDB 引擎會遍歷整張表,把每一行的 id 值都取出來,返回給 server 層。server 層拿到 id 后,判斷是不可能為空的,就按行累加。
對于 count(1) 來說,InnoDB 引擎遍歷整張表,但不取值。server 層對于返回的每一行,放一個數(shù)字“1”進去,判斷是不可能為空的,按行累加。count(1) 執(zhí)行得要比 count(主鍵 id) 快。因為從引擎返回 id 會涉及到解析數(shù)據(jù)行,以及拷貝字段值的操作。
對于 count(字段) 來說,如果這個“字段”是定義為 not null 的話,一行行地從記錄里面讀出這個字段,判斷不能為 null,按行累加;如果這個“字段”定義允許為 null,那么執(zhí)行的時候,判斷到有可能是 null,還要把值取出來再判斷一下,不是 null 才累加。
所以結(jié)論是:按照效率排序的話,count(字段)<count(主鍵 id)<count(1)≈count(),所以建議盡量使用 count()。

“order by”是怎么工作的?

按字段排序

select city,name,age from t where city='杭州' order by name limit 1000 ;


圖中“按 name 排序”這個動作,可能在內(nèi)存中完成,也可能需要使用外部排序,這取決于排序所需的內(nèi)存和參數(shù)sort_buffer_size。sort_buffer_size,就是 MySQL 為排序開辟的內(nèi)存(sort_buffer)的大小。如果要排序的數(shù)據(jù)量小于 sort_buffer_size,排序就在內(nèi)存中完成。但如果排序數(shù)據(jù)量太大,內(nèi)存放不下,則不得不利用磁盤臨時文件輔助排序。

rowid排序

剛說的按字段排序算法有一個問題,就是如果查詢要返回的字段很多的話,那么 sort_buffer 里面要放的字段數(shù)太多,這樣內(nèi)存里能夠同時放下的行數(shù)很少,要分成很多個臨時文件,排序的性能會很差。所以rowid排序的思想是減少查詢字段的數(shù)量,節(jié)省排序內(nèi)存,但是缺點是有可能需要回到原表去取數(shù)據(jù)。對于 InnoDB 表來說,rowid 排序會要求回表多造成磁盤讀,因此不會被優(yōu)先選擇。

查詢響應慢排查

MDL鎖

使用 show processlist 命令查看 Waiting for table metadata lock 的示意圖。MySQL 啟動時需要設(shè)置 performance_schema=on,通過查詢 sys.schema_table_lock_waits 這張表,就可以直接找出造成阻塞的 process id,把這個連接用 kill 命令斷開即可。

flush

出現(xiàn) Waiting for table flush 狀態(tài)的可能情況是:有一個 flush tables 命令被別的語句堵住了,然后它又堵住了select 語句。

等行鎖

select * from t where id=1 lock in share mode;由于訪問 id=1 這個記錄時要加讀鎖,如果這時候已經(jīng)有一個事務在這行記錄上持有一個寫鎖,select 語句就會被堵住。這個問題并不難分析,但問題是怎么查出是誰占著這個寫鎖。如果是 MySQL 5.7 版本,可以通過 sys.innodb_lock_waits 表查到。查詢語句:select * from t sys.innodb_lock_waits where locked_table=‘test.t’\G

一致性讀原因?qū)е?/h2>

session A 先用 start transaction with consistent snapshot 命令啟動了一個事務,之后 session B 才開始執(zhí)行 update 語句。session B 更新完 100 萬次,生成了 100 萬個回滾日志 (undo log)。
帶 lock in share mode 的 SQL 語句,是當前讀,因此會直接讀到 1000001 這個結(jié)果,所以速度很快;而 select * from t where id=1 這個語句,是一致性讀,因此需要從 1000001 開始,依次執(zhí)行 undo log,執(zhí)行了 100 萬次以后,才將 1 這個結(jié)果返回。所以后者的執(zhí)行時間大概是前者的4000倍

什么是幻讀?

在可重復讀隔離級別下,普通的查詢是快照讀,是不會看到別的事務插入的數(shù)據(jù)的。因此,幻讀在“當前讀”下才會出現(xiàn)。上面 session B 的修改結(jié)果,被 session A 之后的 select 語句用“當前讀”看到,不能稱為幻讀。幻讀僅專指“新插入的行”。

幻讀有什么問題?

  • 語義被破壞

session A 在 T1 時刻就聲明了,“我要把所有 d=5 的行鎖住,不準別的事務進行讀寫操作”。而實際上,這個語義被破壞了。

  • 數(shù)據(jù)一致性問題

如何解決幻讀?

產(chǎn)生幻讀的原因是,行鎖只能鎖住行,但是新插入記錄這個動作,要更新的是記錄之間的“間隙”。因此,為了解決幻讀問題,InnoDB 只好引入新的鎖,也就是間隙鎖 (Gap Lock)。顧名思義,間隙鎖,鎖的就是兩個值之間的空隙。跟間隙鎖存在沖突關(guān)系的,是“往這個間隙中插入一個記錄”這個操作。間隙鎖之間都不存在沖突關(guān)系。間隙鎖的引入,雖然解決了幻讀的問題,但是可能會導致同樣的語句鎖住更大的范圍,這其實是影響了并發(fā)度的。間隙鎖是在可重復讀隔離級別下才會生效的。所以,如果把隔離級別設(shè)置為讀提交的話,就沒有間隙鎖了。但同時,要解決可能出現(xiàn)的數(shù)據(jù)和日志不一致問題,需要把 binlog 格式設(shè)置為 row。這,也是現(xiàn)在不少公司使用的配置組合。
next-key lock:間隙鎖和行鎖合稱 next-key lock,每個 next-key lock 是前開后閉區(qū)間。表 t(下圖上方數(shù)字是主鍵值) 初始化以后,如果用 select * from t for update 要把整個表所有記錄鎖起來,就形成了 7 個 next-key lock,分別是 (-∞,0]、(0,5]、(5,10]、(10,15]、(15,20]、(20, 25]、(25, +supremum]。

MySQL加鎖規(guī)則解讀

MySQL加鎖原則

原則 1:加鎖的基本單位是 next-key lock。
原則 2:查找過程中訪問到的對象才會加鎖。
優(yōu)化 1:索引上的等值查詢,給唯一索引加鎖的時候,next-key lock 退化為行鎖。
優(yōu)化 2:索引上的等值查詢,向右遍歷時且最后一個值不滿足等值條件的時候,next-key lock 退化為間隙鎖。
一個 bug:唯一索引上的范圍查詢會訪問到不滿足條件的第一個值為止。

案例一:等值查詢間隙鎖

由于表 t 中沒有 id=7 的記錄,加鎖單位是 next-key lock(),session A 加鎖范圍就是 (5,10];這是一個等值查詢 (id=7),而 id=10 不滿足查詢條件,根據(jù)優(yōu)化2,next-key lock 退化成間隙鎖,因此最終加鎖的范圍是 (5,10)。

案例二:非唯一索引等值鎖

session A 要給索引 c 上 c=5 的這一行加上讀鎖。根據(jù)原則 1,加鎖單位是 next-key lock,因此會給 (0,5]加上 next-key lock。要注意 c 是普通索引,因此僅訪問 c=5 這一條記錄是不能馬上停下來的,需要向右遍歷,查到 c=10 才放棄。根據(jù)原則 2,訪問到的都要加鎖,因此要給 (5,10]加 next-key lock。但是同時這個符合優(yōu)化 2:等值判斷,向右遍歷,最后一個值不滿足 c=5 這個等值條件,因此退化成間隙鎖 (5,10)。根據(jù)原則 2 ,只有訪問到的對象才會加鎖,這個查詢使用覆蓋索引,并不需要訪問主鍵索引,所以主鍵索引上沒有加任何鎖,這就是為什么 session B 的 update 語句可以執(zhí)行完成。但 session C 要插入一個 (7,7,7) 的記錄,就會被 session A 的間隙鎖 (5,10) 鎖住。在這個例子中,lock in share mode 只鎖覆蓋索引,但是如果是 for update 就不一樣了。 執(zhí)行 for update 時,系統(tǒng)會認為接下來要更新數(shù)據(jù),因此會順便給主鍵索引上滿足條件的行加上行鎖。這個例子說明,鎖是加在索引上的。如果要用 lock in share mode 來給行加讀鎖避免數(shù)據(jù)被更新的話,就必須得繞過覆蓋索引的優(yōu)化。

案例三:主鍵索引范圍鎖

開始執(zhí)行的時候,要找到第一個 id=10 的行,因此本該是 next-key lock(5,10]。 根據(jù)優(yōu)化 1, 主鍵 id 上的等值條件,退化成行鎖,只加了 id=10 這一行的行鎖。范圍查找就往后繼續(xù)找,找到 id=15 這一行停下來,因此需要加 next-key lock(10,15]。所以,session A 這時候鎖的范圍就是主鍵索引上,行鎖 id=10 和 next-key lock(10,15]。這樣,session B 和 session C 的結(jié)果就能理解了。

案例四:非唯一索引范圍鎖

session A 用字段 c 來判斷,加鎖規(guī)則跟案例三唯一的不同是:在第一次用 c=10 定位記錄的時候,索引 c 上加了 (5,10]這個 next-key lock 后,由于索引 c 是非唯一索引,沒有優(yōu)化規(guī)則,也就是說不會蛻變?yōu)樾墟i,因此最終 sesion A 加的鎖是,索引 c 上的 (5,10] 和 (10,15] 這兩個 next-key lock。

案例五:唯一索引范圍鎖bug

session A 是一個范圍查詢,按照原則 1 的話,應該是索引 id 上只加 (10,15]這個 next-key lock,并且因為 id 是唯一鍵,所以循環(huán)判斷到 id=15 這一行就應該停止了。但是實現(xiàn)上,InnoDB 會往前掃描到第一個不滿足條件的行為止,也就是 id=20。而且由于這是個范圍掃描,因此索引 id 上的 (15,20]這個 next-key lock 也會被鎖上。

案例六:非唯一索引上存在“等值”的例子

session A 在遍歷的時候,先訪問第一個 c=10 的記錄。同樣地,根據(jù)原則 1,這里加的是 (c=5,id=5) 到 (c=10,id=10) 這個 next-key lock。然后,session A 向右查找,直到碰到 (c=15,id=15) 這一行,循環(huán)才結(jié)束。根據(jù)優(yōu)化 2,這是一個等值查詢,向右查找到了不滿足條件的行,所以會退化成 (c=10,id=10) 到 (c=15,id=15) 的間隙鎖。也就是說,這個 delete 語句在索引 c 上的加鎖范圍,就是下圖中藍色區(qū)域覆蓋的部分。

案例七:非唯一索引上存在“等值”的例子

session A 的 delete 語句加了 limit 2。表 t 里 c=10 的記錄其實只有兩條,因此加不加 limit 2,刪除的效果都是一樣的,但是加鎖的效果卻不同。可以看到,session B 的 insert 語句執(zhí)行通過了,跟案例六的結(jié)果不同。這是因為,案例七里的 delete 語句明確加了 limit 2 的限制,因此在遍歷到 (c=10, id=30) 這一行之后,滿足條件的語句已經(jīng)有兩條,循環(huán)就結(jié)束了。因此,索引 c 上的加鎖范圍就變成了從(c=5,id=5) 到(c=10,id=30) 這個前開后閉區(qū)間,如下圖所示:
這個例子的指導意義就是,在刪除數(shù)據(jù)的時候盡量加 limit。這樣不僅可以控制刪除數(shù)據(jù)的條數(shù),讓操作更安全,還可以減小加鎖的范圍。

案例八:死鎖例子

session A 啟動事務后執(zhí)行查詢語句加 lock in share mode,在索引 c 上加了 next-key lock(5,10] 和間隙鎖 (10,15);session B 的 update 語句也要在索引 c 上加 next-key lock(5,10] ,進入鎖等待;然后 session A 要再插入 (8,8,8) 這一行,被 session B 的間隙鎖鎖住。由于出現(xiàn)了死鎖,InnoDB 讓 session B 回滾。你可能會問,session B 的 next-key lock 不是還沒申請成功嗎? 其實是這樣的,session B 的“加 next-key lock(5,10] ”操作,實際上分成了兩步,先是加 (5,10) 的間隙鎖,加鎖成功;然后加 c=10 的行鎖,這時候才被鎖住的。

索引失效反面案例

條件字段函數(shù)操作

select count(*) from tradelog where month(t_modified)=7;
對索引字段做函數(shù)操作,可能會破壞索引值的有序性,因此優(yōu)化器就決定放棄走樹搜索功能而遍歷整個索引的所有值。需要注意的是,即使是對于不改變有序性的函數(shù),也不會考慮使用索引。比如,對于 select * from tradelog where id + 1 = 10000 這個 SQL 語句,這個加 1 操作并不會改變有序性,但是 MySQL 優(yōu)化器還是不能用 id 索引快速定位到 9999 這一行。所以,需要在寫 SQL 語句的時候,手動改寫成 where id = 10000 -1 才可以。

隱式類型轉(zhuǎn)換

select * from tradelog where tradeid=110717;
tradeid 的字段類型是 varchar(32),而輸入的參數(shù)卻是整型,所以需要做類型轉(zhuǎn)換,導致走了全表掃描。MySQL默認是將字符串轉(zhuǎn)換成數(shù)字進行比較,所以上面的語句等價于select * from tradelog where CAST(tradid AS signed int) = 110717;觸發(fā)了上面說到的規(guī)則:對索引字段做函數(shù)操作,優(yōu)化器會放棄走樹搜索功能。

隱式字符編碼轉(zhuǎn)換

select d.* from tradelog l, trade_detail d where d.tradeid=l.tradeid and l.id=2; 由于tradelog表的tradeid字符集編碼是utf8mb4,而trade_detail表的tradeid是utf8,utf8mb4是utf8的超集,所以發(fā)生了隱式轉(zhuǎn)換,該語句等價于select d.* from tradelog l, trade_detail d where d.tradeid=CONVERT(d.traideid USING utf8mb4) and l.id=2; 觸發(fā)了上面說到的規(guī)則:對被驅(qū)動表索引字段做函數(shù)操作,優(yōu)化器會放棄走樹搜索功能。
思考題:不調(diào)整字段編碼的情況下怎么改才能走對索引?

慢查詢處理技巧

慢查詢導致性能問題的三種可能情況如下

索引沒有設(shè)計好

這種場景一般就是通過緊急創(chuàng)建索引來解決。MySQL 5.6 版本以后,創(chuàng)建索引都支持 Online DDL 了,對于那種高峰期數(shù)據(jù)庫已經(jīng)被這個語句打掛了的情況,最高效的做法就是直接執(zhí)行 alter table 語句。比較理想的是能夠在備庫先執(zhí)行。假設(shè)你現(xiàn)在的服務是一主一備,主庫 A、備庫 B,這個方案的大致流程是這樣的:在備庫 B 上執(zhí)行 set sql_log_bin=off,也就是不寫 binlog,然后執(zhí)行 alter table 語句加上索引;執(zhí)行主備切換;這時候主庫是 B,備庫是 A。在 A 上執(zhí)行 set sql_log_bin=off,然后執(zhí)行 alter table 語句加上索引。

語句沒寫好

這種就要通過分析explain命令分析語句的執(zhí)行計劃,并進行優(yōu)化,典型反面案例參考上一頁的索引失效反面案例。MySQL 5.7 提供了 query_rewrite 功能,可以把輸入的一種語句改寫成另外一種模式,當出現(xiàn)線上業(yè)務bug導致QPS暴漲,數(shù)據(jù)庫也面臨宕機風險的時候,可以用這個把壓力最大的SQL直接重寫為“select 1”返回,以解燃眉之急

MySQL選錯了索引

這種是低概率事件,具體解決方案參考上面的“MySQL為什么有時候會選錯索引”這節(jié)

慢查詢導致性能問題的三種可能情況,實際上出現(xiàn)最多的是前兩種,一般在測試環(huán)境可以通過以下手段盡量規(guī)避
上線前,在測試環(huán)境,把慢查詢?nèi)罩?#xff08;slow log)打開,并且把 long_query_time 設(shè)置成 0,確保每個語句都會被記錄入慢查詢?nèi)罩?#xff1b;
在測試表里插入模擬線上的數(shù)據(jù),做一遍回歸測試;觀察慢查詢?nèi)罩纠锩款愓Z句的輸出,特別留意 Rows_examined 字段是否與預期一致。

總結(jié)

以上是生活随笔為你收集整理的Mysql深入浅出学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

亚洲成av人影院 | 国产精品视频永久免费播放 | 成人精品999| 久草久| 日本性生活免费看 | a在线一区| 国产欧美日韩精品一区二区免费 | 久久最新| 久久精品aaa | 91九色九色| 91视频啪| 国产91精品在线播放 | 探花视频免费观看高清视频 | 精品在线观看一区二区 | 国产亚洲精品久久久久久电影 | 欧美一区二视频在线免费观看 | 成年免费在线视频 | 亚洲一区二区视频 | av中文天堂 | 欧美激情视频在线免费观看 | 黄色天堂在线观看 | 91久久久久久久一区二区 | 久久视频精品在线观看 | 午夜精品一区二区三区在线观看 | 天堂网中文在线 | 日韩电影中文字幕 | 亚洲国产精品一区二区久久,亚洲午夜 | 五月婷婷在线观看视频 | 久久久久久久99精品免费观看 | 天天弄天天操 | 免费在线观看视频一区 | 日日爱网站| 日韩在线激情 | 欧美a级在线免费观看 | 亚洲午夜精品一区 | 日韩久久一区 | 成人免费视频视频在线观看 免费 | 欧美日韩国产二区三区 | 人人草网站 | 久久久网址 | 五月婷婷天堂 | 天天插天天狠 | 欧美日韩国产一二三区 | 狠狠干在线 | 欧美一级大片在线观看 | 日韩一级黄色av | 国产中文字幕久久 | 久久久久国产成人精品亚洲午夜 | 日本最大色倩网站www | 中文字幕资源站 | 成人免费一区二区三区在线观看 | 国产高清av免费在线观看 | 黄色com| 中文字幕一区二区三区精华液 | 国产99久久久国产精品免费看 | 久久精品最新 | 97人人网| 91看片淫黄大片一级在线观看 | 婷婷伊人综合亚洲综合网 | 精品亚洲欧美一区 | 精品久久久久一区二区国产 | 日韩在线观看你懂的 | 日韩精品一区在线播放 | 久久久久久久国产精品 | 国产精久久久 | 五月婷婷综合激情网 | 黄色网址av| 国产黄免费看 | 国产免费作爱视频 | 91精品亚洲影视在线观看 | 欧美韩日在线 | 97国产情侣爱久久免费观看 | 亚洲精品国产精品久久99热 | 国产亚洲久一区二区 | 美州a亚洲一视本频v色道 | 久草新在线| 97电影院网 | 日韩电影在线观看一区二区 | 一本一本久久aa综合精品 | 免费的国产精品 | 91视频免费视频 | 久久久久国产精品厨房 | 天天干天天操天天入 | 欧美成人久久 | 99精品在线播放 | 91中文字幕在线观看 | 久久视频在线 | 在线看的毛片 | 99精品在线免费视频 | 久久你懂得 | 久久无码av一区二区三区电影网 | 日韩不卡高清 | 免费a视频在线 | 国产亚洲午夜高清国产拍精品 | 国产成人久久77777精品 | 国内精品久久久久影院男同志 | 亚洲无吗视频在线 | av色网站| 午夜精品一区二区三区在线 | 91精品少妇偷拍99 | 五月激情丁香 | 国产色黄网站 | 久久任你操 | 午夜精品三区 | 日产中文字幕 | 久久一区二区三区日韩 | 久久久精品高清 | 国产专区一 | 国产精品入口a级 | 久久99久久99精品免视看婷婷 | 久久综合久久久 | av成人动漫在线观看 | 国产一区欧美日韩 | 亚洲精品一区二区18漫画 | av大全在线观看 | 91在线观看高清 | 久久福利国产 | 一级成人免费视频 | 亚州精品在线视频 | 2019免费中文字幕 | 国产69久久精品成人看 | 亚洲成人高清在线 | ,午夜性刺激免费看视频 | 久久黄色免费视频 | 9ⅰ精品久久久久久久久中文字幕 | 国产成人精品综合久久久 | 欧美热久久 | 精品在线观看免费 | 日韩av片无码一区二区不卡电影 | 开心激情五月婷婷 | 9999亚洲| 精品久久久久久久久中文字幕 | 国产精品免费观看视频 | 中文在线天堂资源 | 亚洲视频观看 | 亚洲欧美日韩国产一区二区三区 | av中文字幕在线免费观看 | 日韩av看片| 欧美日韩观看 | av日韩av| 精品一区二区三区久久久 | 91九色视频在线观看 | 亚洲欧洲精品在线 | 成人h视频在线播放 | 亚洲国产手机在线 | 美女福利视频 | 国产精品免费一区二区三区 | 黄色网址中文字幕 | 免费一级特黄录像 | 国产在线色视频 | 国产91九色视频 | 国产在线播放一区二区三区 | 五月天欧美精品 | 国产91全国探花系列在线播放 | 免费在线观看国产黄 | 又黄又网站 | 婷婷中文字幕 | 午夜精品久久久久久久99无限制 | 伊人干综合| 91桃色在线播放 | 一区中文字幕电影 | 青春草国产视频 | 91av蜜桃| 香蕉视频在线看 | 精品久久久久久一区二区里番 | 日日干夜夜骑 | 97视频精品 | 国产精品成人久久久久久久 | 亚洲日韩精品欧美一区二区 | 日韩一二三在线 | 国产成人精品午夜在线播放 | 国产小视频在线观看 | 日韩三级不卡 | 精品国偷自产国产一区 | 久久久久久久久久久网站 | 日韩电影中文字幕在线 | 日韩免费视频 | 亚洲精品高清在线观看 | 天天插综合 | 97麻豆视频| 成人av播放 | 欧美网址在线观看 | 国产高清视频在线观看 | 国产欧美精品一区二区三区四区 | 久久最新视频 | 黄网站色视频 | 日本99热| 黄色在线观看污 | 日本久久不卡视频 | 国产日本在线播放 | www.神马久久 | 四虎影视国产精品免费久久 | 人人澡超碰碰 | 色999精品 | 国产视频在线观看一区二区 | 日本精品中文字幕在线观看 | 午夜久久福利视频 | 四虎影视国产精品免费久久 | 在线黄色国产 | 天天曰天天曰 | 中文字幕亚洲高清 | 国产只有精品 | 亚洲在线视频免费观看 | 999久久久久久久久久久 | 草草草影院 | 国产日韩欧美视频 | 成人性生交视频 | 一本一道久久a久久综合蜜桃 | 欧美性精品 | 欧美激情另类文学 | 日韩在线中文字幕视频 | 久久久免费电影 | 久久成人免费 | www.午夜色.com | 免费在线电影网址大全 | 久久www免费人成看片高清 | 99九九99九九九视频精品 | 亚洲免费精品一区二区 | 久草手机视频 | 黄色av电影免费观看 | 国产午夜三级一区二区三 | 99久久精品免费看国产免费软件 | 免费av网址在线观看 | 欧美一区二区伦理片 | 黄p网站在线观看 | 视频91| 亚洲激情精品 | www.伊人网.com| 最近高清中文在线字幕在线观看 | 97福利视频| 国产成人三级在线观看 | 亚洲 欧美 变态 国产 另类 | 成人97人人超碰人人99 | 首页国产精品 | 日本黄色免费电影网站 | 久草视频精品 | 毛片精品免费在线观看 | 日韩欧美一区视频 | 99久久精品日本一区二区免费 | 日韩1级片 | 国产精品成久久久久三级 | 欧美极度另类性三渗透 | 亚洲午夜久久久久 | 亚洲综合在线播放 | 午夜精品电影 | 国产精品久久久久久久毛片 | 91网址在线观看 | 亚洲一区二区黄色 | 亚洲午夜精品久久久久久久久久久久 | 免费日韩高清 | 天天射天天色天天干 | 麻豆av一区二区三区在线观看 | 激情校园亚洲 | av在线8 | 国产精品久久久久国产精品日日 | 国产高清一区二区 | 久久综合九色 | 丁香久久婷婷 | 91爱看片| 欧美男同视频网站 | 91免费试看 | 99这里只有精品99 | 国产a视频免费观看 | 欧美日韩在线观看一区 | 丁香 久久 综合 | 一区二区精品 | 97在线观看视频免费 | 激情五月色播五月 | 狠狠色噜噜狠狠 | 国产精品96久久久久久吹潮 | 麻豆av一区二区三区在线观看 | 国产资源在线免费观看 | 成人午夜黄色影院 | 国产精品久久久久久久久久ktv | 日日干av| 一级电影免费在线观看 | 免费看搞黄视频网站 | 毛片网免费 | 欧美精品久久人人躁人人爽 | 亚洲精品中文字幕在线 | 久久精品在线视频 | 天天色天天操综合网 | 综合久久综合久久 | 欧美激情精品久久久久久免费 | 亚洲人成影院在线 | 国产小视频你懂的 | 天天射天天干天天 | 国产黄色精品在线 | 午夜久久久久久久 | 成人久久免费视频 | 国产福利专区 | 99c视频高清免费观看 | 久久电影中文字幕视频 | 全黄色一级片 | 香蕉视频免费看 | av中文字幕第一页 | 色噜噜日韩精品一区二区三区视频 | 去看片 | 国产精品毛片一区二区三区 | 超碰在线日本 | 国产在线v| 免费亚洲一区二区 | 精品a视频 | 精品影院一区二区久久久 | 免费在线看v | 国产又粗又长又硬免费视频 | 久久丁香 | 丁香电影小说免费视频观看 | 91精品久久久久久综合五月天 | 波多野结衣精品在线 | 中文字幕亚洲欧美日韩 | 久久黄色免费观看 | 超碰在线中文字幕 | 国产美女在线精品免费观看 | 6080yy午夜一二三区久久 | 97色婷婷成人综合在线观看 | 成人午夜黄色影院 | 欧美激情xxxx性bbbb | 久久r精品| 在线免费看黄网站 | 日韩大片在线播放 | 狠狠干.com | 国产免费观看av | 成人午夜电影免费在线观看 | 91麻豆看国产在线紧急地址 | 日韩视频一区二区三区在线播放免费观看 | 免费看一级特黄a大片 | 亚洲第一色 | 又色又爽又黄 | 国产又黄又爽无遮挡 | 黄色av免费电影 | 日韩久久精品 | 国产在线1区 | 九色91视频| 国产精品网站一区二区三区 | 在线黄色免费av | 在线成人中文字幕 | 伊人五月天综合 | av亚洲产国偷v产偷v自拍小说 | 91成人精品 | 久久精品8| 免费观看91 | 成人精品电影 | 婷婷色五| 欧美巨乳网 | www.天天操.com| 亚洲免费不卡 | 97超碰福利久久精品 | 九九视频一区 | 亚洲春色成人 | 免费福利视频网 | 国产原创在线观看 | 97成人资源| 天天射天天舔天天干 | 欧美aa级 | 日韩精品久久久久久久电影竹菊 | 亚洲电影第一页av | 久久全国免费视频 | 免费能看的黄色片 | 99久久精品国产免费看不卡 | 国产成人精品一区二区三区 | 亚洲成人第一区 | 91精品国产91p65 | 美女黄频| 精品国产aⅴ麻豆 | 天天综合中文 | 欧美激精品 | 韩国精品福利一区二区三区 | 国产一二三四在线观看视频 | 黄色在线免费观看网站 | 午夜精品一二三区 | 欧美激情第一区 | 中文av字幕在线观看 | 精品久久久久久综合 | 国产视频1区2区3区 久久夜视频 | 91大片网站 | 久久久综合色 | 亚洲精品午夜久久久 | 99久久婷婷国产 | 超碰九九| 国产又粗又长的视频 | 久久99国产精品自在自在app | 在线视频久 | 成人香蕉视频 | 日日躁夜夜躁aaaaxxxx | 精品一区二三区 | 国产精品久久久久久久久久久久久久 | 日韩有码中文字幕在线 | 国产小视频精品 | 天天色天天色天天色 | 国产精品乱码久久 | 探花视频在线版播放免费观看 | 免费看成人av | 久久五月婷婷丁香 | 最新三级在线 | 成人精品一区二区三区电影免费 | 日韩免费 | 欧美日韩性生活 | 国产精品国产亚洲精品看不卡15 | 免费看片网站91 | 国产v在线 | 久久免费视频2 | 97精品国产91久久久久久久 | 国产精品一区二区三区四 | 天天综合日 | 综合色亚洲 | 日韩理论片在线观看 | 91麻豆精品国产91 | av字幕在线| 国产精品国产三级在线专区 | 久久综合狠狠综合久久激情 | 日本久久不卡视频 | 黄色大片国产 | 91激情视频在线观看 | 91九色丨porny丨丰满6 | 成人午夜网址 | 成人av免费在线播放 | 丰满少妇一级 | 97在线成人 | 久久激情小说 | 国产精品欧美精品 | 97免费| 国产在线毛片 | 91热视频在线观看 | 91免费在线播放 | av免费看网站 | 婷婷六月中文字幕 | 国产中文在线观看 | 久热香蕉视频 | 国产第页 | 人人舔人人爱 | 一区二区三区四区五区六区 | 欧美 日韩 性 | 国产精品不卡在线观看 | 午夜精品久久久久久 | 亚洲乱码国产乱码精品天美传媒 | av在线免费播放网站 | 丁香在线视频 | 欧美aⅴ在线观看 | 探花视频免费观看 | 亚洲精品乱码久久久久久蜜桃欧美 | 亚洲人视频在线 | 91香蕉视频在线下载 | 亚洲精品小区久久久久久 | 黄色网址a | 国产精品欧美一区二区三区不卡 | 国内精品久久久久影院日本资源 | 国产黄色免费电影 | av动图 | 草久久久| 日韩美av在线 | 91福利视频网站 | 国产综合福利在线 | 91精品国产综合久久婷婷香蕉 | 一本一道久久a久久综合蜜桃 | 国产黄色免费观看 | 免费在线一区二区 | 国产在线p | 国产日韩三级 | 欧美日韩二区在线 | 男女免费视频观看 | 久久九九久久九九 | 久草线| 黄色avwww| 国产 在线观看 | 国产 精品 资源 | 午夜久久福利 | 婷婷在线观看视频 | 国产免码va在线观看免费 | 激情五月婷婷 | 91精品在线麻豆 | 视频一区在线免费观看 | 就色干综合 | 一区二区三区在线看 | 国内偷拍精品视频 | 国产视频在线观看免费 | 97网在线观看 | 久久99亚洲精品久久久久 | 亚洲乱码久久久 | 97免费在线观看视频 | 日日夜夜中文字幕 | 麻豆果冻剧传媒在线播放 | 国产一级在线 | 久久精品一区二区国产 | 久久兔费看a级 | 久久精品中文字幕一区二区三区 | 美女视频黄在线观看 | 九九热在线免费观看 | 精品国产综合区久久久久久 | 九九国产精品视频 | 五月天免费网站 | 综合网在线视频 | 日韩91精品 | 久久99精品一区二区三区三区 | 一本一本久久a久久精品综合 | 18+视频网站链接 | 在线 欧美 日韩 | 精品国产一区二区三区日日嗨 | 深爱激情av | 亚洲精品在线国产 | 黄色网www | 久久成人国产精品一区二区 | 黄色av网站在线观看 | 国产精品一区二区三区在线播放 | 国产视频观看 | 国产区av在线 | 成人黄色片在线播放 | 在线91网| 国产精品久久久久一区二区国产 | 国产精品69av | 免费看污在线观看 | 三级黄色三级 | 日韩在线视频网 | av电影一区 | 激情小说网站亚洲综合网 | 国产在线a | 97视频在线免费播放 | 麻豆国产精品va在线观看不卡 | 久久久久久久久久网站 | 国产精品成人av电影 | 日本免费一二三区 | 日韩免费在线视频 | 国产精品青青 | 国产成人在线免费观看 | 91精品国产91久久久久久三级 | 亚洲最新在线 | 国产精品久久久久久久免费大片 | 国产在线观看91 | 日本久久影视 | 午夜91在线 | 亚洲成人免费在线 | av短片在线| 天天曰天天爽 | av 一区二区三区四区 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 久久精品91视频 | 亚洲免费一级电影 | 日韩av在线资源 | 国产亚洲精品女人久久久久久 | 探花视频免费观看 | 欧美黄色软件 | 国产精品99久久久久久久久 | 欧美三级免费 | 中文字幕色婷婷在线视频 | 黄色成人av | 国产亚州av | 国产色就色 | 国产精品一区二区中文字幕 | 亚洲女欲精品久久久久久久18 | 婷婷福利影院 | 91亚洲网 | 久要激情网 | 国产精品午夜久久久久久99热 | 久久99久久久久久 | 久久久久精 | 色婷婷狠狠| 精品久久久久久久久久久久久 | 午夜 在线 | 婷婷精品| 在线视频成人 | a黄在线观看 | 色999视频 | 91av手机在线 | 天天干国产 | 久久激情视频 久久 | 九九在线免费视频 | 亚洲1区在线| 成人av高清在线观看 | 中文字幕 第二区 | 91精品999 | 激情综合色播五月 | 成人h视频在线 | av中文在线观看 | 操操操日日日干干干 | 狠狠干夜夜操 | 99精品视频免费在线观看 | 亚洲在线精品 | 亚洲精品视频在线观看免费 | 免费色视频在线 | 99视频久久 | 国产美女在线精品免费观看 | 在线看小早川怜子av | 99久在线精品99re8热视频 | 亚洲日本韩国一区二区 | 女人18毛片a级毛片一区二区 | 久久国产精品影视 | 免费精品 | 久久av一区二区三区亚洲 | www.天天成人国产电影 | 97超碰色| 欧美资源在线观看 | 看片网站黄 | www.色综合.com | 国产黄色av影视 | 欧美日韩高清 | av一级二级 | 九九免费精品视频在线观看 | 韩日成人av | 国产精品私人影院 | 天天操天天摸天天爽 | 久久人人艹 | 一区二区三区www | 久久成年人网站 | 婷婷深爱 | 欧美另类成人 | 婷婷精品 | 久久久久久久影院 | 国产一区二区在线观看视频 | 91爱爱电影| 美女黄网站视频免费 | 黄色中文字幕在线 | 国产九九九精品视频 | 欧美日韩一区二区三区不卡 | 久久只有精品 | 久久精品视频3 | 黄色在线成人 | 天天爽天天爽夜夜爽 | 日韩久久精品一区二区三区下载 | 午夜久久久精品 | 国产精品一区二区久久精品爱涩 | 国产色拍拍拍拍在线精品 | 国产成人av一区二区三区在线观看 | 国产操在线 | 久久亚洲区 | 亚洲精品男人天堂 | 99热九九这里只有精品10 | 久草线 | 欧美日韩精品久久久 | 国产永久免费观看 | 九九综合久久 | 亚洲三级精品 | 夜夜高潮夜夜爽国产伦精品 | 亚洲作爱视频 | 欧美成人精品欧美一级乱黄 | 久久综合九色综合久99 | 国产亚洲精品久久久久久电影 | 国产精品久久一区二区无卡 | 欧美a级一区二区 | 久久久国产精品亚洲一区 | 91av在线播放视频 | 国产99久久精品一区二区300 | 国产精品毛片一区二区三区 | 玖玖999| 国产高清在线不卡 | 五月婷婷视频 | 久久婷婷国产 | 国产不卡片 | 中文字幕在线电影 | 毛片1000部免费看 | 欧美一二三区播放 | 午夜国产在线 | 91禁在线看 | 久热久草| 欧美一二区视频 | 在线观看www91 | 久草在在线| 深爱激情五月婷婷 | 久久人人爽人人爽人人片av软件 | 精品国产精品一区二区夜夜嗨 | 伊人精品影院 | 国产一区二区三区四区大秀 | 国产精品免费不卡 | 97看片吧 | 国产经典av | 黄色精品久久 | 91视频免费国产 | 香蕉视频在线免费看 | 在线观看黄网站 | 免费福利视频网站 | 午夜精品电影 | 国产精品久久久久久久久久久免费看 | 九九av | 91九色视频网站 | 99热99re6国产在线播放 | 91精品国产乱码在线观看 | 黄色免费观看网址 | 丁香婷婷激情五月 | 在线观看成人小视频 | 天天天天天天天天操 | 狠狠躁日日躁夜夜躁av | 天天射天天添 | 亚洲 综合 专区 | 免费观看全黄做爰大片国产 | 日韩欧美黄色网址 | 精品在线观看国产 | 最新av网址大全 | 国产精品99久久久精品 | 91精品在线免费视频 | 日韩电影久久久 | 国产福利91精品一区二区三区 | 天天综合中文 | 一本一道久久a久久综合蜜桃 | 亚洲精品国偷拍自产在线观看 | 91自拍成人 | 国产网站色 | 正在播放国产一区二区 | 亚洲涩综合 | 亚洲人人网 | 十八岁以下禁止观看的1000个网站 | 亚洲精品麻豆视频 | 亚洲精品乱码久久久一二三 | 中文字幕在线专区 | 久久婷婷色综合 | 欧美日韩在线观看一区二区三区 | 成人av免费电影 | 免费观看一区二区三区视频 | www免费看片com| 亚洲精品在线一区二区三区 | 天天操夜夜摸 | 麻豆精品国产传媒 | 在线观看亚洲a | 女人高潮一级片 | 国产精品18久久久久vr手机版特色 | 日本中文一级片 | 亚洲精品美女久久久久 | 久久呀 | 国产精品区免费视频 | 天天舔夜夜操 | 日韩在线精品 | 亚洲综合爱 | 在线观看视频色 | 国产综合福利在线 | 色综合久久88色综合天天 | 麻豆传媒视频在线 | 日韩av中文在线观看 | a在线视频v视频 | 人操人| 中文字幕在线观看第三页 | 日本精品中文字幕在线观看 | 91九色蝌蚪视频 | 国产小视频在线观看免费 | 欧美日韩国产精品爽爽 | 国产精品va在线播放 | 欧美性黑人| 色激情在线 | 国产小视频国产精品 | 一二三区在线 | 中文字幕一区二区在线播放 | 欧美激情片在线观看 | 黄色国产在线 | 在线观看mv的中文字幕网站 | 97视频资源 | 西西444www大胆无视频 | 日韩色在线观看 | 国产在线a | 久久综合五月天 | 国产精品免费观看久久 | 亚洲国产精品500在线观看 | 亚洲精品视频免费在线观看 | 久久婷婷影视 | 黄色三级免费看 | 最新久久久 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 日本免费一二三区 | 91精品国产入口 | www.久久视频 | 亚洲伦理一区 | 在线观看中文字幕视频 | 久久香蕉国产精品麻豆粉嫩av | 国产青青青 | 丁香五婷 | 欧美日韩综合在线 | 制服丝袜亚洲 | a视频在线观看 | www五月天婷婷 | 久草视频免费在线观看 | 欧美-第1页-屁屁影院 | 中文字幕一区二区在线播放 | 亚洲欧洲国产视频 | 高清免费在线视频 | 黄色在线免费观看网站 | 欧美日韩久久久 | 美女视频永久黄网站免费观看国产 | 日本护士撒尿xxxx18 | 国产精品一区二区美女视频免费看 | 久久久精品亚洲 | 久久综合久久综合这里只有精品 | 亚洲日本在线视频观看 | 国产高清中文字幕 | 国产成人精品亚洲日本在线观看 | 天天天干 | 国产色婷婷精品综合在线手机播放 | 婷婷丁香九月 | 国产一级片免费视频 | 国产综合福利在线 | 国产麻豆精品久久 | 免费日韩 精品中文字幕视频在线 | 亚洲在线观看av | 天天爱天天射天天干天天 | www.在线观看视频 | 久久久久久久久久免费视频 | 欧美一级性生活片 | 免费看的黄网站软件 | 草久在线视频 | 欧美国产日韩一区 | 成人小视频在线观看免费 | 极品国产91在线网站 | 视频国产精品 | 日韩视频免费看 | 91精品国产99久久久久久红楼 | 成人四虎影院 | 天天人人 | av视屏在线 | 国产精品第一视频 | 亚洲日本色 | 激情丁香| 91少妇精拍在线播放 | 麻豆国产网站 | 国产视频九色蝌蚪 | 久久成人国产精品免费软件 | 丰满少妇麻豆av | 中文字幕一区二区三区在线视频 | 国产精品porn | 麻豆视频国产在线观看 | 欧美成人一二区 | 日日日日干| 久久久亚洲影院 | 国产免费美女 | 狠狠干婷婷| 最近中文字幕高清字幕免费mv | 日韩在线免费视频 | 免费三级黄色 | 婷婷在线观看视频 | 国产精品一区一区三区 | aaaaaa毛片| 亚洲 欧美 日韩 综合 | 精品国产乱码 | 久久手机免费观看 | 韩日精品中文字幕 | 丁香影院在线 | 久久视了 | 久久伊人五月天 | 国内精品视频在线播放 | 夜夜躁天天躁很躁波 | 久草网在线观看 | 久久久久伦理电影 | 天天操天天干天天 | 99视频+国产日韩欧美 | 国产精品福利在线观看 | 中文字幕123区 | 91成年人视频 | 国产一区免费在线观看 | 亚洲影视资源 | 美女精品网站 | 伊人首页 | 久久成人麻豆午夜电影 | 久久久久在线 | 亚洲视频电影在线 | 国产精品视频资源 | 去看片 | 国产精品免费久久久久影院仙踪林 | 99在线热播精品免费99热 | 波多野结衣电影一区二区 | 狠狠色伊人亚洲综合网站色 | 亚洲色图美腿丝袜 | 天天躁日日躁狠狠躁av麻豆 | www.福利 | 日本性久久 | 久久国产精品视频观看 | 激情五月播播久久久精品 | 精品久久久久久综合 | 国产成人精品网站 | 国产中出在线观看 | 麻豆视频免费播放 | 久草在线最新免费 | 久久久久欧美精品999 | 最近高清中文在线字幕在线观看 | 国产成人免费 | 国产午夜精品在线 | av在线播放亚洲 | 欧美一区二区三区免费观看 | 日韩影视精品 | av片中文字幕 | 国产一区欧美在线 | 欧美激情va永久在线播放 | 久久久久 免费视频 | 热久久视久久精品18亚洲精品 | 在线观看蜜桃视频 | av丝袜美腿 | 在线观看黄色免费视频 | 69热国产视频 | 免费在线精品视频 | 欧美日韩国产一区二区在线观看 | 国产欧美精品xxxx另类 | 精品国产乱码 | 欧美日韩在线精品一区二区 | 成年人免费av网站 | 午夜av色| 日韩欧美精品在线观看视频 | 国产精品永久久久久久久久久 | www.久久99| 亚洲成人在线免费 | 黄色电影在线免费观看 | 国产免费高清 | 91精品国产一区二区三区 | 国产精品igao视频网网址 | 美女黄久久 | 伊人婷婷久久 | 免费成人av在线 | 激情丁香久久 | 欧美aⅴ在线观看 | 夜夜躁狠狠躁日日躁 | 亚洲最新av在线 | 在线视频一区二区 | 久久99最新地址 | 国产一在线精品一区在线观看 | 一本一本久久a久久精品综合小说 | 国产高清精 | 午夜在线国产 | 国产免费精彩视频 | 成人午夜毛片 | 欧美网址在线观看 | 九草视频在线观看 | 色综合久久久久综合体 | 精品极品在线 | 午夜精品一区二区三区在线视频 | 日韩免费在线看 | 中文字幕在线视频免费播放 | 三级黄在线| 国产成人三级一区二区在线观看一 | 亚洲黄色一级视频 | 国产视频一区二区在线观看 | 亚洲免费视频观看 | 国产成人精品久久二区二区 | 一区二区三区免费在线播放 | 国产精品久久久久久久久久三级 | 国产女教师精品久久av | 国产国语在线 | 亚洲精品久久久久久久不卡四虎 | 久久精品亚洲精品国产欧美 | 91在线看 | 免费看v片网站 | 日韩性片 | 天天干天天射天天操 | 精品国产一二三四区 | 最近中文国产在线视频 | 日韩v欧美v日本v亚洲v国产v | 在线观看不卡视频 | 伊人日日干 | 中文在线免费一区三区 | 亚洲精品在线免费播放 | av成人免费网站 | 97精品国自产拍在线观看 | 国产视频在线观看一区二区 | av 在线观看 | 最新在线你懂的 | 91精品成人久久 | 在线免费观看成人 | 欧美专区日韩专区 | 99精品在线免费观看 | 欧美精品久久人人躁人人爽 | 中文乱幕日产无线码1区 | 国产精品成人av久久 | 精品国产日本 | 国产一级片视频 | 99精品视频免费在线观看 | 超碰公开在线观看 | 亚洲精品视频在线观看网站 | 亚洲美女视频在线 | 亚洲欧美日韩一级 | av综合av| 婷婷在线看 | 国产一级视频免费看 | 人人干人人做 | 久久视频国产精品免费视频在线 | 日韩在线观看第一页 | 国产精品成人一区二区三区吃奶 | 激情视频免费在线观看 | 91成人免费在线 | 久久69精品 | 97精品国产97久久久久久春色 | 欧美激情综合五月色丁香 | 在线观看av网 | 欧美日韩精品免费观看视频 | 免费在线观看污 | 日本在线观看一区二区三区 | 激情综合网五月婷婷 | 日韩欧美大片免费观看 | 丝袜网站在线观看 | 欧美亚洲成人免费 | 一区二区三区精品在线 | 四虎成人精品永久免费av | 久久精品人 | a v在线视频 | 亚州av免费 | 日韩欧美在线中文字幕 | 中文字幕在线看 | 亚洲精品中文字幕视频 | 中文av网站 | 久久亚洲影院 | 亚洲日本在线一区 | 欧美一级艳片视频免费观看 | 久久综合九色综合欧美狠狠 | 亚洲a资源 | 综合激情婷婷 | 青青草国产免费 | 一区视频在线 | 久久理论片 |