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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

如何将MySQL去重

發(fā)布時間:2023/12/19 综合教程 34 生活家
生活随笔 收集整理的這篇文章主要介紹了 如何将MySQL去重 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這篇文章給大家分享的是有關如何將MySQL去重的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

?問題提出

源表t_source結構如下:

item_idint,
created_timedatetime,
modified_timedatetime,
item_namevarchar(20),
othervarchar(20)

要求:

1.源表中有100萬條數(shù)據(jù),其中有50萬created_time和item_name重復。
2.要把去重后的50萬數(shù)據(jù)寫入到目標表。
3.重復created_time和item_name的多條數(shù)據(jù),可以保留任意一條,不做規(guī)則限制。

?實驗環(huán)境

Linux虛機:CentOS release 6.4;8G物理內(nèi)存(MySQL配置4G);100G機械硬盤;雙物理CPU雙核,共四個處理器;MySQL 8.0.16。

?建立測試表和數(shù)據(jù)

--建立源表
createtablet_source
(item_idint,
created_timedatetime,
modified_timedatetime,
item_namevarchar(20),
othervarchar(20)
);
--建立目標表
createtablet_targetliket_source;
--生成100萬測試數(shù)據(jù),其中有50萬created_time和item_name重復
delimiter//
createproceduresp_generate_data()
begin
set@i:=1;
while@i<=500000do
set@created_time:=date_add('2017-01-01',interval@isecond);
set@modified_time:=@created_time;
set@item_name:=concat('a',@i);
insertintot_source
values(@i,@created_time,@modified_time,@item_name,'other');
set@i:=@i+1;
endwhile;
commit;
set@last_insert_id:=500000;
insertintot_source
selectitem_id+@last_insert_id,
created_time,
date_add(modified_time,interval@last_insert_idsecond),
item_name,
'other'
fromt_source;
commit;
end
//
delimiter;
callsp_generate_data();

--源表沒有主鍵或唯一性約束,有可能存在兩條完全一樣的數(shù)據(jù),所以再插入一條記錄模擬這種情況。
insertintot_sourceselect*fromt_sourcewhereitem_id=1;

源表中有1000001條記錄,去重后的目標表應該有500000條記錄。
mysql>selectcount(*),count(distinctcreated_time,item_name)fromt_source;
+----------+----------------------------------------+
|count(*)|count(distinctcreated_time,item_name)|
+----------+----------------------------------------+
|1000001|500000|
+----------+----------------------------------------+
1rowinset(1.92sec)

一、巧用索引與變量

1. 無索引對比測試

(1)使用相關子查詢

truncatet_target;
insertintot_target
selectdistinctt1.*fromt_sourcet1whereitem_idin
(selectmin(item_id)fromt_sourcet2wheret1.created_time=t2.created_timeandt1.item_name=t2.item_name);

這個語句很長時間都出不來結果,只看一下執(zhí)行計劃吧。

mysql>explainselectdistinctt1.*fromt_sourcet1whereitem_idin
->(selectmin(item_id)fromt_sourcet2wheret1.created_time=t2.created_timeandt1.item_name=t2.item_name);
+----+--------------------+-------+------------+------+---------------+------+---------+------+--------+----------+------------------------------+
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
+----+--------------------+-------+------------+------+---------------+------+---------+------+--------+----------+------------------------------+
|1|PRIMARY|t1|NULL|ALL|NULL|NULL|NULL|NULL|997282|100.00|Usingwhere;Usingtemporary|
|2|DEPENDENTSUBQUERY|t2|NULL|ALL|NULL|NULL|NULL|NULL|997282|1.00|Usingwhere|
+----+--------------------+-------+------------+------+---------------+------+---------+------+--------+----------+------------------------------+
2rowsinset,3warnings(0.00sec)

主查詢和相關子查詢都是全表掃描,一共要掃描100萬*100萬數(shù)據(jù)行,難怪出不來結果。

(2)使用表連接

truncatet_target;
insertintot_target
selectdistinctt1.*fromt_sourcet1,
(selectmin(item_id)item_id,created_time,item_namefromt_sourcegroupbycreated_time,item_name)t2
wheret1.item_id=t2.item_id;

這種方法用時14秒,查詢計劃如下:

mysql>explainselectdistinctt1.*fromt_sourcet1,(selectmin(item_id)item_id,created_time,item_namefromt_sourcegroupbycreated_time,item_name)t2wheret1.item_id=t2.item_id;
+----+-------------+------------+------------+------+---------------+-------------+---------+-----------------+--------+----------+------------------------------+
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
+----+-------------+------------+------------+------+---------------+-------------+---------+-----------------+--------+----------+------------------------------+
|1|PRIMARY|t1|NULL|ALL|NULL|NULL|NULL|NULL|997282|100.00|Usingwhere;Usingtemporary|
|1|PRIMARY|<derived2>|NULL|ref|<auto_key0>|<auto_key0>|5|test.t1.item_id|10|100.00|Distinct|
|2|DERIVED|t_source|NULL|ALL|NULL|NULL|NULL|NULL|997282|100.00|Usingtemporary|
+----+-------------+------------+------------+------+---------------+-------------+---------+-----------------+--------+----------+------------------------------+
3rowsinset,1warning(0.00sec)

?內(nèi)層查詢掃描t_source表的100萬行,建立臨時表,找出去重后的最小item_id,生成導出表derived2,此導出表有50萬行。
?MySQL會在導出表derived2上自動創(chuàng)建一個item_id字段的索引auto_key0。
?外層查詢也要掃描t_source表的100萬行數(shù)據(jù),在與導出表做鏈接時,對t_source表每行的item_id,使用auto_key0索引查找導出表中匹配的行,并在此時優(yōu)化distinct操作,在找到第一個匹配的行后即停止查找同樣值的動作。

(3)使用變量

set@a:='1000-01-0100:00:00';
set@b:='';
set@f:=0;
truncatet_target;
insertintot_target
selectitem_id,created_time,modified_time,item_name,other
from
(selectt0.*,if(@a=created_timeand@b=item_name,@f:=0,@f:=1)f,@a:=created_time,@b:=item_name
from
(select*fromt_sourceorderbycreated_time,item_name)t0)t1wheref=1;

這種方法用時13秒,查詢計劃如下:

mysql>explainselectitem_id,created_time,modified_time,item_name,other
->from
->(selectt0.*,if(@a=created_timeand@b=item_name,@f:=0,@f:=1)f,@a:=created_time,@b:=item_name
->from
->(select*fromt_sourceorderbycreated_time,item_name)t0)t1wheref=1;
+----+-------------+------------+------------+------+---------------+-------------+---------+-------+--------+----------+----------------+
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
+----+-------------+------------+------------+------+---------------+-------------+---------+-------+--------+----------+----------------+
|1|PRIMARY|<derived2>|NULL|ref|<auto_key0>|<auto_key0>|4|const|10|100.00|NULL|
|2|DERIVED|<derived3>|NULL|ALL|NULL|NULL|NULL|NULL|997282|100.00|NULL|
|3|DERIVED|t_source|NULL|ALL|NULL|NULL|NULL|NULL|997282|100.00|Usingfilesort|
+----+-------------+------------+------------+------+---------------+-------------+---------+-------+--------+----------+----------------+
3rowsinset,5warnings(0.00sec)

?最內(nèi)層的查詢掃描t_source表的100萬行,并使用文件排序,生成導出表derived3。
?第二層查詢要掃描derived3的100萬行,生成導出表derived2,完成變量的比較和賦值,并自動創(chuàng)建一個導出列f上的索引auto_key0。
?最外層使用auto_key0索引掃描derived2得到去重的結果行。

與上面方法2比較,總的掃描行數(shù)不變,都是200萬行。只存在一點微小的差別,這次自動生成的索引是在常量列 f 上,而表關聯(lián)自動生成的索引是在item_id列上,所以查詢時間幾乎相同。

至此,我們還沒有在源表上創(chuàng)建任何索引。無論使用哪種寫法,要查重都需要對created_time和item_name字段進行排序,因此很自然地想到,如果在這兩個字段上建立聯(lián)合索引,利用索引本身有序的特性消除額外排序,從而提高查詢性能。

2. 建立created_time和item_name上的聯(lián)合索引對比測試

--建立created_time和item_name字段的聯(lián)合索引
createindexidx_sortont_source(created_time,item_name,item_id);
analyzetablet_source;

(1)使用相關子查詢

truncatet_target;
insertintot_target
selectdistinctt1.*fromt_sourcet1whereitem_idin
(selectmin(item_id)fromt_sourcet2wheret1.created_time=t2.created_timeandt1.item_name=t2.item_name);

本次用時19秒,查詢計劃如下:

mysql>explainselectdistinctt1.*fromt_sourcet1whereitem_idin
->(selectmin(item_id)fromt_sourcet2wheret1.created_time=t2.created_timeandt1.item_name=t2.item_name);
+----+--------------------+-------+------------+------+---------------+----------+---------+----------------------------------------+--------+----------+------------------------------+
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
+----+--------------------+-------+------------+------+---------------+----------+---------+----------------------------------------+--------+----------+------------------------------+
|1|PRIMARY|t1|NULL|ALL|NULL|NULL|NULL|NULL|997281|100.00|Usingwhere;Usingtemporary|
|2|DEPENDENTSUBQUERY|t2|NULL|ref|idx_sort|idx_sort|89|test.t1.created_time,test.t1.item_name|2|100.00|Usingindex|
+----+--------------------+-------+------------+------+---------------+----------+---------+----------------------------------------+--------+----------+------------------------------+
2rowsinset,3warnings(0.00sec)

?外層查詢的t_source表是驅動表,需要掃描100萬行。

?對于驅動表每行的item_id,通過idx_sort索引查詢出兩行數(shù)據(jù)。

(2)使用表連接

truncatet_target;
insertintot_target
selectdistinctt1.*fromt_sourcet1,
(selectmin(item_id)item_id,created_time,item_namefromt_sourcegroupbycreated_time,item_name)t2
wheret1.item_id=t2.item_id;

本次用時13秒,查詢計劃如下:

mysql>explainselectdistinctt1.*fromt_sourcet1,
->(selectmin(item_id)item_id,created_time,item_namefromt_sourcegroupbycreated_time,item_name)t2
->wheret1.item_id=t2.item_id;
+----+-------------+------------+------------+-------+---------------+-------------+---------+-----------------+--------+----------+------------------------------+
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
+----+-------------+------------+------------+-------+---------------+-------------+---------+-----------------+--------+----------+------------------------------+
|1|PRIMARY|t1|NULL|ALL|NULL|NULL|NULL|NULL|997281|100.00|Usingwhere;Usingtemporary|
|1|PRIMARY|<derived2>|NULL|ref|<auto_key0>|<auto_key0>|5|test.t1.item_id|10|100.00|Distinct|
|2|DERIVED|t_source|NULL|index|idx_sort|idx_sort|94|NULL|997281|100.00|Usingindex|
+----+-------------+------------+------------+-------+---------------+-------------+---------+-----------------+--------+----------+------------------------------+
3rowsinset,1warning(0.00sec)

和沒有索引相比,子查詢雖然從全表掃描變?yōu)榱巳饕龗呙瑁€是需要掃描100萬行記錄。因此查詢性能提升并不是明顯。

(3)使用變量

set@a:='1000-01-0100:00:00';
set@b:='';
set@f:=0;
truncatet_target;
insertintot_target
selectitem_id,created_time,modified_time,item_name,other
from
(selectt0.*,if(@a=created_timeand@b=item_name,@f:=0,@f:=1)f,@a:=created_time,@b:=item_name
from
(select*fromt_sourceorderbycreated_time,item_name)t0)t1wheref=1;

本次用時13秒,查詢計劃與沒有索引時的完全相同。可見索引對這種寫法沒有作用。能不能消除嵌套,只用一層查詢出結果呢?

(4)使用變量,并且消除嵌套查詢

set@a:='1000-01-0100:00:00';
set@b:='';
truncatet_target;
insertintot_target
select*fromt_sourceforceindex(idx_sort)
where(@a!=created_timeor@b!=item_name)and(@a:=created_time)isnotnulland(@b:=item_name)isnotnull
orderbycreated_time,item_name;

本次用時12秒,查詢計劃如下:

mysql>explainselect*fromt_sourceforceindex(idx_sort)
->where(@a!=created_timeor@b!=item_name)and(@a:=created_time)isnotnulland(@b:=item_name)isnotnull
->orderbycreated_time,item_name;
+----+-------------+----------+------------+-------+---------------+----------+---------+------+--------+----------+-------------+
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
+----+-------------+----------+------------+-------+---------------+----------+---------+------+--------+----------+-------------+
|1|SIMPLE|t_source|NULL|index|NULL|idx_sort|94|NULL|997281|99.00|Usingwhere|
+----+-------------+----------+------------+-------+---------------+----------+---------+------+--------+----------+-------------+
1rowinset,3warnings(0.00sec)

該語句具有以下特點:

?消除了嵌套子查詢,只需要對t_source表進行一次全索引掃描,查詢計劃已達最優(yōu)。
?無需distinct二次查重。
?變量判斷與賦值只出現(xiàn)在where子句中。
?利用索引消除了filesort。

在MySQL 8之前,該語句是單線程去重的最佳解決方案。仔細分析這條語句,發(fā)現(xiàn)它巧妙地利用了SQL語句的邏輯查詢處理步驟和索引特性。一條SQL查詢的邏輯步驟為:

1.執(zhí)行笛卡爾乘積(交叉連接)
2.應用ON篩選器(連接條件)
3.添加外部行(outer join)
4.應用where篩選器
5.分組
6.應用cube或rollup
7.應用having篩選器
8.處理select列表
9.應用distinct子句
10.應用order by子句
11.應用limit子句

每條查詢語句的邏輯執(zhí)行步驟都是這11步的子集。拿這條查詢語句來說,其執(zhí)行順序為:強制通過索引idx_sort查找數(shù)據(jù)行 -> 應用where篩選器 -> 處理select列表 -> 應用order by子句。

為了使變量能夠按照created_time和item_name的排序順序進行賦值和比較,必須按照索引順序查找數(shù)據(jù)行。這里的force index (idx_sort)提示就起到了這個作用,必須這樣寫才能使整條查重語句成立。否則,因為先掃描表才處理排序,因此不能保證變量賦值的順序,也就不能確保查詢結果的正確性。order by子句同樣不可忽略,否則即使有force index提示,MySQL也會使用全表掃描而不是全索引掃描,從而使結果錯誤。索引同時保證了created_time,item_name的順序,避免了文件排序。force index (idx_sort)提示和order by子句缺一不可,索引idx_sort在這里可謂恰到好處、一舉兩得。

查詢語句開始前,先給變量初始化為數(shù)據(jù)中不可能出現(xiàn)的值,然后進入where子句從左向右判斷。先比較變量和字段的值,再將本行created_time和item_name的值賦給變量,按created_time、item_name的順序逐行處理。item_name是字符串類型,(@b:=item_name)不是有效的布爾表達式,因此要寫成(@b:=item_name) is not null。

最后補充一句,這里忽略了“insert into t_target select * from t_source group by created_time,item_name;”的寫法,因為它受“sql_mode='ONLY_FULL_GROUP_BY'”的限制。

二、利用窗口函數(shù)

MySQL 8中新增的窗口函數(shù)使得原來麻煩的去重操作變得很簡單。

truncatet_target;
insertintot_target
selectitem_id,created_time,modified_time,item_name,other
from(select*,row_number()over(partitionbycreated_time,item_name)asrn
fromt_source)twherern=1;

這個語句執(zhí)行只需要12秒,而且寫法清晰易懂,其查詢計劃如下:

mysql>explainselectitem_id,created_time,modified_time,item_name,other
->from(select*,row_number()over(partitionbycreated_time,item_name)asrn
->fromt_source)twherern=1;
+----+-------------+------------+------------+------+---------------+-------------+---------+-------+--------+----------+----------------+
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
+----+-------------+------------+------------+------+---------------+-------------+---------+-------+--------+----------+----------------+
|1|PRIMARY|<derived2>|NULL|ref|<auto_key0>|<auto_key0>|8|const|10|100.00|NULL|
|2|DERIVED|t_source|NULL|ALL|NULL|NULL|NULL|NULL|997281|100.00|Usingfilesort|
+----+-------------+------------+------------+------+---------------+-------------+---------+-------+--------+----------+----------------+
2rowsinset,2warnings(0.00sec)

該查詢對t_source表進行了一次全表掃描,同時用filesort對表按分區(qū)字段created_time、item_name進行了排序。外層查詢從每個分區(qū)中保留一條數(shù)據(jù)。因為重復created_timeitem_name的多條數(shù)據(jù)中可以保留任意一條,所以oevr中不需要使用order by子句。

從執(zhí)行計劃看,窗口函數(shù)去重語句似乎沒有消除嵌套查詢的變量去重好,但此方法實際執(zhí)行是最快的。

MySQL窗口函數(shù)說明參見“https://dev.mysql.com/doc/refman/8.0/en/window-functions.html”。

三、多線程并行執(zhí)行

前面已經(jīng)將單條查重語句調(diào)整到最優(yōu),但還是以單線程方式執(zhí)行。能否利用多處理器,讓去重操作多線程并行執(zhí)行,從而進一步提高速度呢?比如我的實驗環(huán)境是4處理器,如果使用4個線程同時執(zhí)行查重SQL,理論上應該接近4倍的性能提升。

1. 數(shù)據(jù)分片

在生成測試數(shù)據(jù)時,created_time采用每條記錄加一秒的方式,也就是最大和在最小的時間差為50萬秒,而且數(shù)據(jù)均勻分布,因此先把數(shù)據(jù)平均分成4份。

(1)查詢出4份數(shù)據(jù)的created_time邊界值

mysql>selectdate_add('2017-01-01',interval125000second)dt1,
->date_add('2017-01-01',interval2*125000second)dt2,
->date_add('2017-01-01',interval3*125000second)dt3,
->max(created_time)dt4
->fromt_source;
+---------------------+---------------------+---------------------+---------------------+
|dt1|dt2|dt3|dt4|
+---------------------+---------------------+---------------------+---------------------+
|2017-01-0210:43:20|2017-01-0321:26:40|2017-01-0508:10:00|2017-01-0618:53:20|
+---------------------+---------------------+---------------------+---------------------+
1rowinset(0.00sec)

(2)查看每份數(shù)據(jù)的記錄數(shù),確認數(shù)據(jù)平均分布

mysql>selectcasewhencreated_time>='2017-01-01'
->andcreated_time<'2017-01-0210:43:20'
->then'2017-01-01'
->whencreated_time>='2017-01-0210:43:20'
->andcreated_time<'2017-01-0321:26:40'
->then'2017-01-0210:43:20'
->whencreated_time>='2017-01-0321:26:40'
->andcreated_time<'2017-01-0508:10:00'
->then'2017-01-0321:26:40'
->else'2017-01-0508:10:00'
->endmin_dt,
->casewhencreated_time>='2017-01-01'
->andcreated_time<'2017-01-0210:43:20'
->then'2017-01-0210:43:20'
->whencreated_time>='2017-01-0210:43:20'
->andcreated_time<'2017-01-0321:26:40'
->then'2017-01-0321:26:40'
->whencreated_time>='2017-01-0321:26:40'
->andcreated_time<'2017-01-0508:10:00'
->then'2017-01-0508:10:00'
->else'2017-01-0618:53:20'
->endmax_dt,
->count(*)
->fromt_source
->groupbycasewhencreated_time>='2017-01-01'
->andcreated_time<'2017-01-0210:43:20'
->then'2017-01-01'
->whencreated_time>='2017-01-0210:43:20'
->andcreated_time<'2017-01-0321:26:40'
->then'2017-01-0210:43:20'
->whencreated_time>='2017-01-0321:26:40'
->andcreated_time<'2017-01-0508:10:00'
->then'2017-01-0321:26:40'
->else'2017-01-0508:10:00'
->end,
->casewhencreated_time>='2017-01-01'
->andcreated_time<'2017-01-0210:43:20'
->then'2017-01-0210:43:20'
->whencreated_time>='2017-01-0210:43:20'
->andcreated_time<'2017-01-0321:26:40'
->then'2017-01-0321:26:40'
->whencreated_time>='2017-01-0321:26:40'
->andcreated_time<'2017-01-0508:10:00'
->then'2017-01-0508:10:00'
->else'2017-01-0618:53:20'
->end;
+---------------------+---------------------+----------+
|min_dt|max_dt|count(*)|
+---------------------+---------------------+----------+
|2017-01-01|2017-01-0210:43:20|249999|
|2017-01-0210:43:20|2017-01-0321:26:40|250000|
|2017-01-0321:26:40|2017-01-0508:10:00|250000|
|2017-01-0508:10:00|2017-01-0618:53:20|250002|
+---------------------+---------------------+----------+
4rowsinset(4.86sec)

4份數(shù)據(jù)的并集應該覆蓋整個源數(shù)據(jù)集,并且數(shù)據(jù)之間是不重復的。也就是說4份數(shù)據(jù)的created_time要連續(xù)且互斥,連續(xù)保證處理全部數(shù)據(jù),互斥確保了不需要二次查重。實際上這和時間范圍分區(qū)的概念類似,或許用分區(qū)表更好些,只是這里省略了重建表的步驟。

2. 建立查重的存儲過程

有了以上信息我們就可以寫出4條語句處理全部數(shù)據(jù)。為了調(diào)用接口盡量簡單,建立下面的存儲過程。

delimiter//
createproceduresp_unique(ismallint)
begin
set@a:='1000-01-0100:00:00';
set@b:='';
if(i<4)then
insertintot_target
select*fromt_sourceforceindex(idx_sort)
wherecreated_time>=date_add('2017-01-01',interval(i-1)*125000second)
andcreated_time<date_add('2017-01-01',intervali*125000second)
and(@a!=created_timeor@b!=item_name)
and(@a:=created_time)isnotnull
and(@b:=item_name)isnotnull
orderbycreated_time,item_name;
else
insertintot_target
select*fromt_sourceforceindex(idx_sort)
wherecreated_time>=date_add('2017-01-01',interval(i-1)*125000second)
andcreated_time<=date_add('2017-01-01',intervali*125000second)
and(@a!=created_timeor@b!=item_name)
and(@a:=created_time)isnotnull
and(@b:=item_name)isnotnull
orderbycreated_time,item_name;
endif;
end
//

查詢語句的執(zhí)行計劃如下:

mysql>explainselect*fromt_sourceforceindex(idx_sort)
->wherecreated_time>=date_add('2017-01-01',interval(1-1)*125000second)
->andcreated_time<date_add('2017-01-01',interval1*125000second)
->and(@a!=created_timeor@b!=item_name)
->and(@a:=created_time)isnotnull
->and(@b:=item_name)isnotnull
->orderbycreated_time,item_name;
+----+-------------+----------+------------+-------+---------------+----------+---------+------+--------+----------+-----------------------+
|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
+----+-------------+----------+------------+-------+---------------+----------+---------+------+--------+----------+-----------------------+
|1|SIMPLE|t_source|NULL|range|idx_sort|idx_sort|6|NULL|498640|100.00|Usingindexcondition|
+----+-------------+----------+------------+-------+---------------+----------+---------+------+--------+----------+-----------------------+
1rowinset,3warnings(0.00sec)

MySQL優(yōu)化器進行索引范圍掃描,并且使用索引條件下推(ICP)優(yōu)化查詢。

3. 并行執(zhí)行

下面分別使用shell后臺進程和MySQL Schedule Event實現(xiàn)并行。

(1)shell后臺進程

?建立duplicate_removal.sh文件,內(nèi)容如下:

#!/bin/bash
mysql-vvv-uroot-p123456test-e"truncatet_target"&>/dev/null
date'+%H:%M:%S'
foryin{1..4}
do
sql="callsp_unique($y)"
mysql-vvv-uroot-p123456test-e"$sql"&>par_sql1_$y.log&
done
wait
date'+%H:%M:%S'

?執(zhí)行腳本文件

./duplicate_removal.sh

執(zhí)行輸出如下:

[mysql@hdp2~]$./duplicate_removal.sh
14:27:30
14:27:35

這種方法用時5秒,并行執(zhí)行的4個過程調(diào)用分別用時為4.87秒、4.88秒、4.91秒、4.73秒:

[mysql@hdp2~]$catpar_sql1_1.log|sed'/^$/d'
mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
--------------
callsp_unique(1)
--------------
QueryOK,124999rowsaffected(4.87sec)
Bye
[mysql@hdp2~]$catpar_sql1_2.log|sed'/^$/d'
mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
--------------
callsp_unique(2)
--------------
QueryOK,125000rowsaffected(4.88sec)
Bye
[mysql@hdp2~]$catpar_sql1_3.log|sed'/^$/d'
mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
--------------
callsp_unique(3)
--------------
QueryOK,125000rowsaffected(4.91sec)
Bye
[mysql@hdp2~]$catpar_sql1_4.log|sed'/^$/d'
mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
--------------
callsp_unique(4)
--------------
QueryOK,125001rowsaffected(4.73sec)
Bye
[mysql@hdp2~]$

可以看到,每個過程的執(zhí)行時間均4.85,因為是并行執(zhí)行,總的過程執(zhí)行時間為最慢的4.91秒,比單線程速度提高了2.5倍。

(2)MySQL Schedule Event

?建立事件歷史日志表

--用于查看事件執(zhí)行時間等信息
createtablet_event_history(
dbnamevarchar(128)notnulldefault'',
eventnamevarchar(128)notnulldefault'',
starttimedatetime(3)notnulldefault'1000-01-0100:00:00',
endtimedatetime(3)defaultnull,
issuccessint(11)defaultnull,
durationint(11)defaultnull,
errormessagevarchar(512)defaultnull,
randnoint(11)defaultnull
);

?為每個并發(fā)線程創(chuàng)建一個事件

delimiter//
createeventev1onscheduleatcurrent_timestamp+interval1houroncompletionpreservedisabledo
begin
declarer_codechar(5)default'00000';
declarer_msgtext;
declarev_errorinteger;
declarev_starttimedatetimedefaultnow(3);
declarev_randnointegerdefaultfloor(rand()*100001);
insertintot_event_history(dbname,eventname,starttime,randno)
#作業(yè)名
values(database(),'ev1',v_starttime,v_randno);
begin
#異常處理段
declarecontinuehandlerforsqlexception
begin
setv_error=1;
getdiagnosticscondition1r_code=returned_sqlstate,r_msg=message_text;
end;
#此處為實際調(diào)用的用戶程序過程
callsp_unique(1);
end;
updatet_event_historysetendtime=now(3),issuccess=isnull(v_error),duration=timestampdiff(microsecond,starttime,now(3)),errormessage=concat('error=',r_code,',message=',r_msg),randno=nullwherestarttime=v_starttimeandrandno=v_randno;
end
//
createeventev2onscheduleatcurrent_timestamp+interval1houroncompletionpreservedisabledo
begin
declarer_codechar(5)default'00000';
declarer_msgtext;
declarev_errorinteger;
declarev_starttimedatetimedefaultnow(3);
declarev_randnointegerdefaultfloor(rand()*100001);
insertintot_event_history(dbname,eventname,starttime,randno)
#作業(yè)名
values(database(),'ev2',v_starttime,v_randno);
begin
#異常處理段
declarecontinuehandlerforsqlexception
begin
setv_error=1;
getdiagnosticscondition1r_code=returned_sqlstate,r_msg=message_text;
end;
#此處為實際調(diào)用的用戶程序過程
callsp_unique(2);
end;
updatet_event_historysetendtime=now(3),issuccess=isnull(v_error),duration=timestampdiff(microsecond,starttime,now(3)),errormessage=concat('error=',r_code,',message=',r_msg),randno=nullwherestarttime=v_starttimeandrandno=v_randno;
end
//
createeventev3onscheduleatcurrent_timestamp+interval1houroncompletionpreservedisabledo
begin
declarer_codechar(5)default'00000';
declarer_msgtext;
declarev_errorinteger;
declarev_starttimedatetimedefaultnow(3);
declarev_randnointegerdefaultfloor(rand()*100001);
insertintot_event_history(dbname,eventname,starttime,randno)
#作業(yè)名
values(database(),'ev3',v_starttime,v_randno);
begin
#異常處理段
declarecontinuehandlerforsqlexception
begin
setv_error=1;
getdiagnosticscondition1r_code=returned_sqlstate,r_msg=message_text;
end;
#此處為實際調(diào)用的用戶程序過程
callsp_unique(3);
end;
updatet_event_historysetendtime=now(3),issuccess=isnull(v_error),duration=timestampdiff(microsecond,starttime,now(3)),errormessage=concat('error=',r_code,',message=',r_msg),randno=nullwherestarttime=v_starttimeandrandno=v_randno;
end
//
createeventev4onscheduleatcurrent_timestamp+interval1houroncompletionpreservedisabledo
begin
declarer_codechar(5)default'00000';
declarer_msgtext;
declarev_errorinteger;
declarev_starttimedatetimedefaultnow(3);
declarev_randnointegerdefaultfloor(rand()*100001);
insertintot_event_history(dbname,eventname,starttime,randno)
#作業(yè)名
values(database(),'ev4',v_starttime,v_randno);
begin
#異常處理段
declarecontinuehandlerforsqlexception
begin
setv_error=1;
getdiagnosticscondition1r_code=returned_sqlstate,r_msg=message_text;
end;
#此處為實際調(diào)用的用戶程序過程
callsp_unique(4);
end;
updatet_event_historysetendtime=now(3),issuccess=isnull(v_error),duration=timestampdiff(microsecond,starttime,now(3)),errormessage=concat('error=',r_code,',message=',r_msg),randno=nullwherestarttime=v_starttimeandrandno=v_randno;
end
//

為了記錄每個事件執(zhí)行的時間,在事件定義中增加了操作日志表的邏輯,因為每個事件中只多執(zhí)行了一條insert,一條update,4個事件總共多執(zhí)行8條很簡單的語句,對測試的影響可以忽略不計。執(zhí)行時間精確到毫秒。

?觸發(fā)事件執(zhí)行

mysql-vvv-uroot-p123456test-e"truncatet_target;altereventev1onscheduleatcurrent_timestampenable;altereventev2onscheduleatcurrent_timestampenable;altereventev3onscheduleatcurrent_timestampenable;altereventev4onscheduleatcurrent_timestampenable;"

該命令行順序觸發(fā)了4個事件,但不會等前一個執(zhí)行完才執(zhí)行下一個,而是立即向下執(zhí)行。這可從命令的輸出可以清除看到:

[mysql@hdp2~]$mysql-vvv-uroot-p123456test-e"truncatet_target;altereventev1onscheduleatcurrent_timestampenable;altereventev2onscheduleatcurrent_timestampenable;altereventev3onscheduleatcurrent_timestampenable;altereventev4onscheduleatcurrent_timestampenable;"
mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
--------------
truncatet_target
--------------
QueryOK,0rowsaffected(0.06sec)
--------------
altereventev1onscheduleatcurrent_timestampenable
--------------
QueryOK,0rowsaffected(0.02sec)
--------------
altereventev2onscheduleatcurrent_timestampenable
--------------
QueryOK,0rowsaffected(0.00sec)
--------------
altereventev3onscheduleatcurrent_timestampenable
--------------
QueryOK,0rowsaffected(0.02sec)
--------------
altereventev4onscheduleatcurrent_timestampenable
--------------
QueryOK,0rowsaffected(0.00sec)
Bye
[mysql@hdp2~]$

?查看事件執(zhí)行日志

mysql>select*fromtest.t_event_history;
+--------+-----------+-------------------------+-------------------------+-----------+----------+--------------+--------+
|dbname|eventname|starttime|endtime|issuccess|duration|errormessage|randno|
+--------+-----------+-------------------------+-------------------------+-----------+----------+--------------+--------+
|test|ev1|2019-07-3114:38:04.000|2019-07-3114:38:09.389|1|5389000|NULL|NULL|
|test|ev2|2019-07-3114:38:04.000|2019-07-3114:38:09.344|1|5344000|NULL|NULL|
|test|ev3|2019-07-3114:38:05.000|2019-07-3114:38:09.230|1|4230000|NULL|NULL|
|test|ev4|2019-07-3114:38:05.000|2019-07-3114:38:09.344|1|4344000|NULL|NULL|
+--------+-----------+-------------------------+-------------------------+-----------+----------+--------------+--------+
4rowsinset(0.00sec)

可以看到,每個過程的執(zhí)行均為4.83秒,又因為是并行執(zhí)行的,因此總的執(zhí)行之間為最慢的5.3秒,優(yōu)化效果和shell后臺進程方式幾乎相同。

總結

以上是生活随笔為你收集整理的如何将MySQL去重的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

国产无遮挡又黄又爽在线观看 | 99久久综合狠狠综合久久 | 在线免费黄色片 | 欧美另类高清 | 91秒拍国产福利一区 | 日韩高清一二区 | 91av在线电影| 久久午夜电影网 | 久久黄色影视 | 成年人在线免费看视频 | 夜夜天天干 | 日韩视频欧美视频 | 九九欧美视频 | 欧美久久精品 | 亚洲男男gⅴgay双龙 | 4p变态网欧美系列 | 97精品国产97久久久久久春色 | 在线观看视频在线 | 国产一区免费看 | 亚洲a免费| av高清网站在线观看 | 96av视频| 美女视频黄色免费 | 草久久精品 | 99精品国产视频 | 香蕉视频在线看 | 中文字幕在线观看资源 | 一区二区三区韩国免费中文网站 | 国内一区二区视频 | 这里只有精品视频在线观看 | 色婷婷激情电影 | 欧美性直播 | 色噜噜日韩精品欧美一区二区 | 99在线观看视频网站 | 免费观看高清 | 综合色亚洲| 国产无套精品久久久久久 | 成年人国产精品 | 黄色小说视频网站 | 成人av网站在线观看 | 亚洲精品免费看 | 天天舔天天射天天操 | 超碰在线94 | 国产午夜av | 免费看三片 | 久草视频在 | 国产精品嫩草55av | 狂野欧美激情性xxxx欧美 | 国内精品久久久久久久久久久 | 91免费看片黄| 日韩高清www | 精品一区91 | a天堂免费 | 久久69av| 久久99久久99精品免视看婷婷 | 国产乱对白刺激视频在线观看女王 | 天天综合狠狠精品 | 高潮久久久久久久久 | av片中文字幕 | 免费黄色在线 | 精品国产aⅴ麻豆 | 亚洲精品玖玖玖av在线看 | 日本中文乱码卡一卡二新区 | 国产一级电影免费观看 | 欧美精品一区二区蜜臀亚洲 | 成人黄色在线电影 | 久久久久国产成人免费精品免费 | 日韩免费观看av | 99热亚洲精品 | 日韩精品中文字幕有码 | 麻豆91精品 | 久久精品一区 | а天堂中文最新一区二区三区 | 国产高清视频在线播放 | 日本久久精 | 超碰在线色 | 韩国av免费观看 | 激情视频综合网 | 欧洲亚洲女同hd | 亚洲国产精品推荐 | 91免费观看网站 | 超碰97国产 | 国产在线精品区 | 91麻豆.com| 日韩欧美在线观看 | 久久精品视频免费播放 | 在线观看91精品视频 | 视频二区在线 | 午夜精品福利影院 | 精品国产123| 91传媒91久久久 | 免费福利片2019潦草影视午夜 | 日韩精品在线视频 | 99久久精品日本一区二区免费 | 成年人免费电影 | av 在线观看 | 久久天天躁夜夜躁狠狠躁2022 | 91福利试看 | 国产高清免费av | 狠狠色狠狠色综合系列 | av在线进入| 国产高清黄色 | 欧美日韩一区二区久久 | 青青网视频 | 免费观看午夜视频 | 亚洲免费在线视频 | 麻豆一精品传二传媒短视频 | 亚洲精品乱码久久久久 | 国色天香在线 | 亚洲 综合 激情 | 国产成人a亚洲精品v | 五月天婷婷免费视频 | 韩日电影在线免费看 | 亚洲欧洲中文日韩久久av乱码 | 久操视频在线播放 | 国产精品久久久久久久99 | 国产视频一区在线免费观看 | 日韩在线视频免费看 | 欧美一级片在线观看视频 | 成人国产精品一区 | 欧美日韩一级视频 | 成人app在线播放 | 亚洲国产精品视频在线观看 | 久久影院午夜论 | 久操中文字幕在线观看 | 成人午夜在线电影 | 激情视频二区 | 国产精品一区二区你懂的 | 国产亚洲精品久久久久久电影 | 久艹在线播放 | 国产香蕉视频在线观看 | 亚洲黄色免费在线看 | 久久久69| 深爱激情亚洲 | 亚洲精品乱码久久久久久蜜桃动漫 | 日韩av网页| 521色香蕉网站在线观看 | 99久久婷婷 | 在线精品国产 | 欧洲精品在线视频 | 免费日韩三级 | 日日操夜| 国产精品福利av | 精品国产一区二区三区久久久蜜臀 | 丁香激情五月婷婷 | 日女人电影 | 片网站 | 成人综合婷婷国产精品久久免费 | 国产精品久久久久久久久久三级 | 97伊人网| 手机在线看永久av片免费 | 亚洲日韩中文字幕在线播放 | 免费看麻豆 | 特黄一级毛片 | 在线免费黄色毛片 | 久久久天天操 | 成人网看片 | 91视频免费播放 | 天天天综合网 | 国产在线a视频 | 国产视频不卡 | 国产精品中文久久久久久久 | 91久久久久久久 | 国产精品一区二区在线看 | 91久久国产露脸精品国产闺蜜 | 成人在线播放免费观看 | 最新91在线视频 | 99热超碰| 色五月激情五月 | 日本中文字幕视频 | 久久免费的精品国产v∧ | 在线观看久草 | 国产精品毛片久久久久久久 | www日韩| 亚洲久在线| 黄色一级网 | 免费视频久久 | 欧美成年黄网站色视频 | 91久久国产综合精品女同国语 | 久久国产高清视频 | 天天射一射| 欧美一区二区在线免费看 | 国产精品69av | 精品国产一区二区三区久久久蜜月 | 日韩欧美视频在线免费观看 | 正在播放国产91 | 亚洲欧美日韩国产一区二区三区 | 国产精品麻豆一区二区三区 | 国产一二区在线观看 | 日本资源中文字幕在线 | 久久精品综合一区 | 日韩av一区二区在线 | 人人看人人爱 | 一区二区高清在线 | 狠狠婷婷| 五月婷在线 | 日韩在线视频观看免费 | 中文字幕成人在线观看 | 成人av午夜 | 九色自拍视频 | 久久激情视频 | 国产精品美女www爽爽爽视频 | 久精品视频 | 欧美日韩国语 | 亚洲精品美女在线观看播放 | 国产精品免费在线视频 | 欧美资源 | 色视频在线免费观看 | 色播五月激情综合网 | 免费看黄色毛片 | 999抗病毒口服液 | 欧美 日韩 视频 | 日日夜色| 天天插天天干天天操 | 国产a网站 | 91丨九色丨国产丨porny精品 | 久久久香蕉视频 | 亚洲成a人片在线www | 午夜电影久久久 | 国产va饥渴难耐女保洁员在线观看 | 欧美精品久久久久久久久老牛影院 | 婷婷丁香导航 | 91在线视频网址 | 亚洲人成人天堂h久久 | 久草在线免费看视频 | 日韩欧美电影 | 国产欧美中文字幕 | 天天射天天干天天操 | 免费在线看v | 人人网人人爽 | 国产a级片免费观看 | 51久久成人国产精品麻豆 | www亚洲精品 | 久久伊99综合婷婷久久伊 | 激情丁香月 | 偷拍区另类综合在线 | 国产在线精品观看 | a国产精品| 99r在线观看 | av一级网站 | 国产午夜亚洲精品 | 激情亚洲综合在线 | 成人网444ppp| 亚洲无人区小视频 | 精品视频中文字幕 | 国产精品 欧美 日韩 | 在线视频你懂 | 99视频精品视频高清免费 | 久99视频| www.亚洲视频.com | 久9在线 | 偷拍区另类综合在线 | 国产国产人免费人成免费视频 | 欧美黑人巨大xxxxx | 亚洲色影爱久久精品 | 久草com| 国产99在线免费 | 亚洲精品av中文字幕在线在线 | 我要看黄色一级片 | 久久免费国产精品1 | 999视频网 | 九九免费在线看完整版 | 国产一区二区在线精品 | 久久精品亚洲综合专区 | 国产高清在线 | 色婷婷狠狠五月综合天色拍 | 98久久| 日韩电影在线一区二区 | 欧美一级小视频 | 免费视频国产 | 色播五月激情综合网 | 四月婷婷在线观看 | 黄色成人影视 | 国产精品18久久久久久久久久久久 | 欧美日韩视频 | aaa日本高清在线播放免费观看 | 久久人人爽人人爽人人片av免费 | 色999精品 | 一区二区三区四区精品视频 | 免费看黄在线 | 婷婷丁香激情 | 色综合久久88色综合天天 | 亚洲精品视频在线观看免费视频 | 四虎国产精品永久在线国在线 | 久久99精品久久久久蜜臀 | 久久久片 | 99精品乱码国产在线观看 | 高潮毛片无遮挡高清免费 | 97超碰人人在线 | 2017狠狠干 | 亚洲精品中文在线 | 特级黄色一级 | 国产视频在线观看免费 | 99爱这里只有精品 | 久久国内免费视频 | 99热官网 | 国内一区二区视频 | 亚洲精品在线资源 | 久草剧场 | 色.com| 国内精品久久久久影院优 | 色99在线 | 韩国中文三级 | 亚州国产视频 | 中文字幕日本在线 | 久久99国产精品自在自在app | 国产精品美女久久久 | a在线v | 91夫妻自拍 | 岛国精品一区二区 | 狠狠狠色丁香婷婷综合久久88 | 亚州国产精品 | 久久精品一二三区白丝高潮 | 午夜久久久精品 | 高清av影院| 人人干免费 | 91插插插网站 | 国产免费嫩草影院 | 亚洲精品视频久久 | 精品中文字幕视频 | 亚洲精品视频免费观看 | 午夜精品久久久久久久99 | 黄色特级毛片 | 亚洲精品国产精品久久99 | 丁香婷婷深情五月亚洲 | 在线观看一二三区 | 在线观看色网站 | 色wwww| 亚洲精品999 | 亚洲网站在线看 | 国产精选视频 | 69国产盗摄一区二区三区五区 | 久久伊99综合婷婷久久伊 | 国内三级在线 | 免费色婷婷 | 国产成人av在线影院 | 人人澡人人澡人人 | 精品久久久久免费极品大片 | 久久精品久久精品久久39 | 国产中文在线视频 | 免费色黄| 日韩在线观看视频网站 | 国产亚洲在线 | 日韩欧美有码在线 | 亚洲视频免费在线 | 成人精品福利 | 日韩av午夜| 亚洲黄色高清 | 亚洲精品国产精品久久99 | 午夜久久久久久久久久久 | 国产午夜麻豆影院在线观看 | 人人讲 | 美女av电影 | 国产精品淫片 | 婷婷.com| 久久tv | 亚洲精选在线观看 | 五月婷婷黄色 | 婷婷色 亚洲| 午夜在线免费观看 | 黄色毛片在线看 | 婷婷丁香狠狠爱 | 97在线观看 | 中文在线免费视频 | 69av免费视频 | 久久这里只有精品1 | 三级黄免费看 | 在线观看911视频 | 精品99免费视频 | 国产午夜精品一区二区三区四区 | 国产免费影院 | 日韩在线视频在线观看 | 国产日本在线 | 色中色资源站 | 国产色视频123区 | 日韩av资源在线观看 | 激情欧美日韩一区二区 | www色综合 | 亚洲欧洲精品久久 | 香蕉视频导航 | 五月开心六月伊人色婷婷 | 黄网站污 | 九九久久成人 | 成人黄色大片在线观看 | 国产精品av在线 | 成人影片在线免费观看 | 久久精品久久精品久久 | 日日爽| 麻豆91网站 | 亚洲人成精品久久久久 | 久久综合视频网 | 亚洲一级特黄 | 九色在线| 黄色av电影在线观看 | 国产91精品一区二区麻豆亚洲 | 97超碰在线免费观看 | 亚洲国产片色 | 亚洲免费永久精品国产 | 女人18毛片a级毛片一区二区 | 91亚洲精品久久久蜜桃借种 | 国产精品视频免费观看 | 国产麻豆视频免费观看 | 丁香激情五月 | 91夫妻视频 | 日韩精品一区二区三区中文字幕 | 国产成人精品日本亚洲999 | 91丝袜美腿 | 欧美综合色在线图区 | 天堂在线视频中文网 | 亚洲日本va午夜在线影院 | 久久综合影视 | 国产麻豆视频免费观看 | .国产精品成人自产拍在线观看6 | 国产精品免费久久久久影院仙踪林 | 天天曰 | 免费人成在线观看网站 | 亚洲天堂网视频在线观看 | 四虎在线免费 | 91精品视频在线 | 日本中文字幕在线免费观看 | 亚洲第一中文字幕 | 国产成人精品一区二区在线观看 | 日韩免费一级a毛片在线播放一级 | avove黑丝 | 国产亚洲精品成人av久久影院 | 青草视频免费观看 | 久久精品国产精品亚洲 | 天天草综合网 | 美女久久久久久久久久 | 国产一区免费在线观看 | 在线看片视频 | 日韩av电影网站在线观看 | 狠狠干天天射 | 91在线小视频 | 亚洲欧洲中文日韩久久av乱码 | 五月婷婷综合在线视频 | 国产精品日韩在线观看 | 欧美日韩中文另类 | 久久久网址 | 色婷婷狠狠五月综合天色拍 | 成人国产精品一区 | 欧美一级艳片视频免费观看 | 亚洲人成免费网站 | 欧美日韩3p | av中文字幕在线播放 | www.狠狠操.com| 日韩乱码中文字幕 | 伊人资源视频在线 | 黄在线免费观看 | 91精品播放| 99热高清 | 国产精品一区二区三区电影 | 中文字幕在线一区二区三区 | 久草精品在线播放 | 国产一级免费观看视频 | 黄色性av | 一本一本久久aa综合精品 | 三级av在线 | 久久国产精品影视 | 天天摸天天舔天天操 | 国产盗摄精品一区二区 | av成人免费| 日韩中文字幕电影 | 一区二区视频免费在线观看 | 丁香婷婷综合激情五月色 | 96精品高清视频在线观看软件特色 | 外国av网| 久久黄色免费视频 | 日日夜夜中文字幕 | 国产最新91 | 国产 成人 久久 | 国内精品视频一区二区三区八戒 | 免费69视频| av888av.com| 色诱亚洲精品久久久久久 | 欧美激情视频一区二区三区 | 中文字幕日韩有码 | 91成人免费看片 | 久久久久久免费毛片精品 | 色婷婷激情五月 | 激情小说 五月 | 国产免费三级在线观看 | 亚洲人久久 | 日韩在线观看视频中文字幕 | 国产精品a久久 | 国产精品1区 | 国产精品va | 亚洲 欧美 综合 在线 精品 | 免费十分钟 | 最新超碰 | 在线视频精品播放 | www黄色软件| 97视频免费在线看 | 免费看毛片在线 | 久久久国产精品一区二区三区 | 中文字幕在线免费97 | 色在线国产 | 国产精品久久久久久久久久久久午 | 一区二区三区不卡在线 | 蜜臀av性久久久久av蜜臀妖精 | 精品国产一区二区三区日日嗨 | 久久一区国产 | 91在线精品视频 | 中文字幕乱码日本亚洲一区二区 | 黄p网站在线观看 | 色天天综合久久久久综合片 | 国精产品一二三线999 | 国产一二区在线观看 | 天天拍天天操 | 99久久夜色精品国产亚洲96 | 91在线观看视频 | 在线观看视频日韩 | 欧美怡红院 | 在线观看亚洲成人 | 91视频免费观看 | 久久艹中文字幕 | 二区三区中文字幕 | 亚洲在线视频免费观看 | 久久电影国产免费久久电影 | 日本久久久久久久久久 | 日韩视| 97看片| 久久久久久久久久久网站 | 欧美aaa视频 | 日日夜夜精品网站 | 一级性av| 综合久久久久 | 久久久久久久久电影 | 日韩在线欧美在线 | 免费视频久久 | 日日精品 | 99久久精品久久久久久清纯 | 国产麻豆精品在线观看 | 男女精品久久 | 久久这里只有精品久久 | 国产三级久久久 | 天天插天天色 | 精品一区二区精品 | 欧美色图一区 | 日韩精品久久久久久久电影竹菊 | 亚洲三级毛片 | 久久婷婷视频 | 一级片免费在线 | 99久久久久久久久久 | 99久久99久久精品国产片 | 啪啪肉肉污av国网站 | 黄色三几片 | 久久高清免费 | 日韩精品视频在线观看免费 | 激情欧美一区二区三区 | 女人18毛片a级毛片一区二区 | 亚洲精品白浆高清久久久久久 | 亚洲影院一区 | 久草91视频| 色综合激情网 | 永久免费av在线播放 | 亚洲在线 | 午夜在线观看影院 | 国产黄色a | 国产精品麻豆99久久久久久 | 不卡的av在线 | 东方av免费在线观看 | 黄色在线观看网站 | 日韩在线视频免费看 | 最近高清中文在线字幕在线观看 | 色综合天天色综合 | 国产黄免费看 | 日韩极品在线 | a在线视频v视频 | 日本公妇在线观看高清 | 免费a级观看 | 黄色a级片在线观看 | 91资源在线视频 | 亚洲日本欧美 | 亚洲最新在线视频 | 手机在线小视频 | 日韩中午字幕 | 亚洲天堂免费视频 | 干狠狠 | 婷婷六月综合亚洲 | 久久亚洲福利视频 | www.在线观看av | 69视频永久免费观看 | 日韩va在线观看 | 国产97视频在线 | 91精品一区二区三区蜜臀 | 亚洲91视频 | 中文在线www | 超碰在线观看av.com | 日本久久高清视频 | 久久久综合九色合综国产精品 | 中文字幕色综合网 | 91精品视频免费 | 国产精品久久久久久久久久久不卡 | 欧美在线视频精品 | 天天干天天草天天爽 | 911国产在线观看 | 日韩免费观看一区二区三区 | 久久免费国产精品1 | 伊人射 | 99精品在线视频观看 | 中文字幕在线播放一区二区 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 高清免费av在线 | 97色狠狠 | 亚洲免费一级 | 久久艹人人 | 91成年视频 | 91精品夜夜 | 欧美成人猛片 | 日本在线观看视频一区 | 色网av| 久久亚洲成人网 | 国产97色| 国产女v资源在线观看 | 99久久久国产精品 | 国产在线精品区 | 国产精品99精品久久免费 | 69国产成人综合久久精品欧美 | 91av原创 | 日本久久中文 | 国产成人精品一区二区三区免费 | 国产午夜精品一区二区三区嫩草 | 欧美精品久久99 | 蜜桃传媒一区二区 | 涩av在线| 国产免费xvideos视频入口 | 久久视频国产精品免费视频在线 | 色综合天天天天做夜夜夜夜做 | 国产精品精品国产婷婷这里av | 欧美日本日韩aⅴ在线视频 插插插色综合 | 久久看免费视频 | 婷婷六月天在线 | 国产一级高清 | 国产精品99久久久久人中文网介绍 | 国产精品成人自产拍在线观看 | 欧美日韩精品二区第二页 | 久久综合中文字幕 | 中文字幕在线看视频国产中文版 | 亚洲一区二区视频在线播放 | 成人久久 | 999视频网站| a特级毛片| 美女精品在线 | 亚洲一级二级 | 黄色小说网站在线 | 国产v在线播放 | 国产免费av一区二区三区 | 成人欧美日韩国产 | 一区二区三区日韩视频在线观看 | 成人精品电影 | 亚洲精品久久激情国产片 | 婷婷色六月天 | 综合网中文字幕 | 嫩草伊人久久精品少妇av | 天天操天天是 | 亚洲精品在线视频网站 | 97网在线观看 | 日黄网站 | 一区二区 精品 | 久久精品欧美视频 | 久久久精品国产一区二区三区 | 国产一级二级视频 | 99久久久久久久久久 | 亚洲影院一区 | 久久免费精品国产 | 天天操天天干天天操天天干 | 国产成人免费网站 | 91在线影视| 91精品久久香蕉国产线看观看 | 国产精品99久久久久人中文网介绍 | 日韩a级免费视频 | 婷婷亚洲综合五月天小说 | 又黄又爽又无遮挡的视频 | 欧美亚洲免费在线一区 | 东方av在线免费观看 | 成人av动漫在线观看 | 日韩欧美精品一区二区 | 在线观看av的网站 | 91精品一 | 日本在线成人 | 99热国产在线观看 | 久久视频在线观看 | 国产丝袜美腿在线 | 豆豆色资源网xfplay | 在线观看av片 | 久久久久久久久久久成人 | 成人av一级片 | 日韩在线观看第一页 | 色婷婷综合久久久 | 在线播放 一区 | 久久久香蕉视频 | 九九天堂 | 午夜精品久久一牛影视 | 免费三级a | 国产不卡一 | 91视频91蝌蚪 | 午夜aaaa | 97人人澡人人爽人人模亚洲 | 国产精品一区二区视频 | 日韩中文字幕第一页 | 97超碰中文字幕 | 久久五月婷婷丁香社区 | 亚洲欧美少妇 | 日本特黄特色aaa大片免费 | 成人精品影视 | 国产分类视频 | 久久五月激情 | 欧美国产不卡 | 黄色大片日本 | 亚洲女欲精品久久久久久久18 | 欧美日韩国产一区二区三区 | 国产精品久久久久四虎 | 日日夜精品| 天天综合狠狠精品 | 精品国偷自产国产一区 | www.色午夜.com | 国产精品国产三级在线专区 | 国内视频 | 欧美另类高清 | 国产亚洲精品久久久久久 | 四虎www | 国产精品成人自产拍在线观看 | 国产美女精品人人做人人爽 | 日韩激情视频在线观看 | 人人干97 | 日本巨乳在线 | 日韩中文在线视频 | 九九视频这里只有精品 | 国产视频在线观看一区 | 国产一二三区在线观看 | 日本中文字幕系列 | 国产精品淫 | 午夜精品一区二区三区免费 | 亚洲激情一区二区三区 | 国产精品一区二区在线播放 | 久久国语露脸国产精品电影 | 五月亚洲综合 | 97视频免费在线看 | 人人舔人人舔 | 又黄又刺激又爽的视频 | 成人资源网| 欧美综合色在线图区 | 天堂av一区二区 | 免费a视频| 欧美在线视频日韩 | 亚洲欧洲精品在线 | 久久天天躁夜夜躁狠狠85麻豆 | 综合五月 | 成人一级片视频 | 99c视频在线| 欧美一级日韩免费不卡 | 中文字幕中文字幕在线中文字幕三区 | 成人观看视频 | 在线看中文字幕 | av一区二区在线观看中文字幕 | 国产黄色精品在线 | 久久精品视频免费观看 | 久久精品男人的天堂 | 中文免费观看 | 69精品 | 夜夜爽天天爽 | 日韩在线观看中文字幕 | 亚洲自拍偷拍色图 | 91亚色在线观看 | 天无日天天操天天干 | 国产美腿白丝袜足在线av | 免费观看日韩av | 91视频啊啊啊 | 天天爱综合 | 久久黄色小说 | 一区二区视频免费在线观看 | 久久se视频 | 国产精品免费一区二区三区在线观看 | 免费看片成年人 | 在线观看你懂的网站 | 在线国产能看的 | 久久国精品 | 日韩久久在线 | www.夜夜夜| 欧美成a人片在线观看久 | 一级特黄aaa大片在线观看 | 国产拍揄自揄精品视频麻豆 | 1000部国产精品成人观看 | 伊人狠狠色丁香婷婷综合 | 久草在线这里只有精品 | 欧美日韩首页 | 99精品视频免费观看视频 | 免费又黄又爽 | 在线免费精品视频 | 午夜精品成人一区二区三区 | 国产伦精品一区二区三区照片91 | 国产精品99久久久久久有的能看 | 天天玩天天干天天操 | 二区三区精品 | 九九九在线观看 | 91看片麻豆| 久久精品国产亚洲aⅴ | 国产一区二区三区在线 | 天天色天天射天天操 | 久久精品99国产精品日本 | 97在线看片| 国产精品久久久毛片 | 免费成人黄色av | 国产精品成人在线观看 | 蜜臀久久99精品久久久久久网站 | 国产精品99精品久久免费 | 精品国产久 | 亚洲女人天堂成人av在线 | 成人免费观看视频大全 | 欧美日韩国产伦理 | 午夜精品一区二区三区四区 | 久久久精品小视频 | 狠狠色丁香婷婷综合橹88 | 久久福利剧场 | 精品国产一区二区三区久久久蜜月 | 不卡电影免费在线播放一区 | 伊人电影在线观看 | 天天操夜夜操天天射 | 黄色a视频免费 | 一区二区成人国产精品 | 久热电影 | 日韩欧美在线综合网 | 久久99网站 | 国产精品日韩高清 | 视频在线观看一区 | 亚洲乱码久久久 | 免费看一级特黄a大片 | 欧美一区二区三区不卡 | 麻豆免费视频网站 | 国产美女精品视频免费观看 | 国内成人综合 | 亚洲欧美日韩精品一区二区 | 亚洲成人av影片 | 91久久国产自产拍夜夜嗨 | 日韩久久一区二区 | 99精品欧美一区二区蜜桃免费 | 日韩精品电影在线播放 | 国产香蕉视频在线播放 | 国产很黄很色的视频 | 特黄特色特刺激视频免费播放 | 久久人人爽人人爽人人片 | 99久久久国产精品 | 国内外激情视频 | 午夜精品三区 | 亚洲视频在线播放 | 免费合欢视频成人app | 亚洲永久精品国产 | 国产精品一区久久久久 | 国产一区二区三区免费观看视频 | 日韩精品亚洲专区在线观看 | 婷婷久久综合九色综合 | 久草在线在线视频 | 99久热在线精品视频观看 | 亚洲国产影院av久久久久 | 成 人 黄 色 视频播放1 | 国产麻豆精品一区 | 色婷婷婷| 欧美aa在线| 国内揄拍国内精品 | 久久综合久久综合这里只有精品 | 中文字幕乱在线伦视频中文字幕乱码在线 | 国产精久久 | 蜜臀av性久久久久蜜臀av | 久久久久电影网站 | 人人干人人超 | 三级视频片 | 婷婷国产v亚洲v欧美久久 | 免费网站在线 | a级国产乱理论片在线观看 伊人宗合网 | 特级xxxxx欧美| 色综合久久88 | 激情五月视频 | 一级成人在线 | 日日摸日日碰 | 中文字幕日韩一区二区三区不卡 | 国产精品一区二区久久 | 国产精品高潮呻吟久久久久 | 在线精品观看 | 青草视频免费观看 | 国产在线一区观看 | 美女视频a美女大全免费下载蜜臀 | 麻豆系列在线观看 | 欧美精品国产综合久久 | 国产在线精品观看 | 91在线视频在线观看 | 日日夜夜骑 | 久久精品波多野结衣 | 国产麻豆果冻传媒在线观看 | 精品视频9999| 国产精品久久久久9999 | 亚洲最大av | 国产精品久久久久三级 | 国产高清在线永久 | 97超视频免费观看 | 91黄色免费看| 亚洲国产小视频在线观看 | 免费在线观看一区二区三区 | 在线小视频 | 99中文字幕视频 | 精品一二区 | 久久私人影院 | 亚洲精品合集 | 五月天中文字幕mv在线 | 91黄色小网站 | 成人va天堂 | 国产色综合天天综合网 | 亚洲爽爽网 | 色99在线| 成人av一区二区兰花在线播放 | 五月天久久狠狠 | 亚洲综合色网站 | 激情在线网站 | 国产精品久久久久久久午夜片 | 婷婷av色综合 | 欧美在线1区 | 日韩电影在线看 | 免费看黄视频 | 韩日精品在线观看 | 日日日操| 97成人资源| 日韩高清一 | 欧美成年人在线观看 | www免费视频com━ | 日本久久免费电影 | 欧美最猛性xxx| 高清国产在线一区 | 国产精品综合久久久久久 | 日日爽天天 | 97国产大学生情侣白嫩酒店 | 天天操天天射天天 | 国产日韩欧美视频 | 国产一二区视频 | 亚洲观看黄色网 | 色橹橹欧美在线观看视频高清 | 91在线视频免费播放 | 午夜12点 | 久久黄色免费视频 | av成人在线电影 | 色综合久久88色综合天天人守婷 | 国产91精品一区二区绿帽 | 国产一区二区成人 | 日韩欧美一区二区三区在线观看 | 精品久久久网 | 色综合天天天天做夜夜夜夜做 | 久久久免费精品国产一区二区 | 99久免费精品视频在线观看 | 亚洲国产精彩中文乱码av | 国产高清av免费在线观看 | 中文字幕国内精品 | 亚洲美女免费精品视频在线观看 | 国产精品无| 国际av在线 | 手机版av在线 | 免费在线观看国产黄 | 成人在线播放网站 | 毛片基地黄久久久久久天堂 | 五月开心六月伊人色婷婷 | 美女激情影院 | 最新国产精品亚洲 | 99亚洲国产精品 | 五月天久久婷婷 | www黄色软件 | 在线欧美小视频 | 奇米导航| 国产精品va | 96香蕉视频| 日日操天天射 | 最新日韩在线观看 | 国产成人精品久久久久蜜臀 | 人人草在线视频 | 免费特级黄色片 | 亚洲另类视频 | 日韩中文字幕在线不卡 | 国产精品久久久久久一区二区三区 | 久久精品亚洲 | 在线观看av免费观看 | 激情五月看片 | 日韩av偷拍 | 久久午夜羞羞影院 | 久久精品久久精品久久39 | 亚洲激情小视频 | 黄色免费高清视频 | 91九色老 | 久久久久www | 久久综合久久鬼 | 日日操日日 | 日韩欧美在线观看一区二区三区 | 久久久综合精品 | 97热视频| 六月丁香激情综合 | 日韩 在线a| 特黄一级毛片 | 国产成人三级 | av黄色国产 | 天天综合天天做天天综合 | av大全免费在线观看 | 不卡av免费在线观看 |