久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

用 Node + MySQL 處理 100G 數據

瀏覽:89日期:2023-10-16 14:41:54

通過這個 Node.js 和 MySQL 示例項目,我們將看看如何有效地處理 數十億行 占用 數百GB 存儲空間的數據。

本文的第二個目標是幫助你確定 Node.js + MySQL 是否適合你的需求,并為實現此類解決方案提供幫助。

本文章使用的實際代碼 可以在 GitHub 上找到 。

為什么使用 Node.js 和 MySQL?

我們使用 MySQL 來存儲我們的 Node.js監控和調試工具 用戶的分布式跟蹤數據 Trace。

我們選擇了 MySQL,因為在決定的時候,Postgres 并不是很擅長更新行,而對于我們來說,更新不可變數據是不合理的。

大多數人認為,如果有數百萬的數十億行,他們應該使用一個 NoSQL 解決方案,如 Cassandra 或 Mongo。

不幸的是,這些解決方案不 符合ACID ,當數據一致性非常重要時,這些解決方案就難以使用。

然而,通過良好的索引和適當的規劃,MySQL 可以作為上面提到的 NoSQL 的一種替代方案,很適合這樣的任務。

MySQL 有幾個存儲引擎。 InnoDB 是默認的,它功能最多。但是,應該考慮到 InnoDB 表是不可變的,這意味著每個 ALTER TABLE 語句都將所有的數據復制到一個新的表中。 當需要遷移已經存在的數據庫時,這會更加糟糕。

如果你有名義值,每個都有很多關聯的數據 —— 例如你的每個用戶都有數百萬個產品,并且你擁有大量用戶 —— 這可能是為每個用戶創建表格最簡單的方法,并給出如 <user_id>_<entity_name> 。 這樣可以顯著減少單個表的大小。

此外,在刪除帳戶的情況下,刪除用戶的數據是 O(1) 量級的操作。這是非常重要的,因為如果你需要從大表中刪除大量的值,MySQL可能會決定使用錯誤的索引或不使用索引。

因為不能使用索引提示 DELETE 會讓事情變得更復雜。你可能需要 ALTER 來刪除你的數據,但這意味著將每行復制到新表。

為每個用戶創建表格顯然增加了復雜性,但是當涉及到刪除具有大量相關數據的用戶或類似實體時,這可能是一個有效的辦法。

但是,在進行動態創建表之前,你應該嘗試刪除塊中的行,因為它也可能有幫助,可以減少附加復雜性。當然,如果你的添加數據速度比你刪除的速度更快,你可能會感覺上述解決方案是個坑。

但是,如果你的表在分離用戶后仍然很大,導致你還需要刪除過期的行呢?你添加數據速度仍然比你刪除的速度更快。 在這種情況下,你應該嘗試使用 MySQL 內置的表分區。 當你需要通過按順序或連續遞增的值(例如創建的時間戳)來切割表時,它很方便。

MySQL 表分區

MySQL 中一個表的表分區將像多個表一樣工作,但你可以使用與之前相同的界面,不需要更多應用程序的附加邏輯。這也意味著你可以像刪除表一樣刪除表分區。

這個 文檔 很好,但也很繁瑣(畢竟這不是一個簡單的話題),所以讓我們快速看一下如何創建一個表分區。

我們處理我們的分區的方式是從 Rick James 的文章中獲取的。他還深入探討了如何規劃你的數據表。

CREATE TABLE IF NOT EXISTS tbl ( id INTEGER NOT NULL AUTO_INCREMENT, data VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id, created_at) ) PARTITION BY RANGE (TO_DAYS(created_at)) ( start VALUES LESS THAN (0), from20170514 VALUES LESS THAN (TO_DAYS(’2017-05-15’)), from20170515 VALUES LESS THAN (TO_DAYS(’2017-05-16’)), from20170516 VALUES LESS THAN (TO_DAYS(’2017-05-17’)), future VALUES LESS THAN MAXVALUE );

PARTITION BY RANGE 之后才是我們關注的焦點。

在 MySQL 中,你可以通過 RANGE , LIST , COLUMN , HASH 和 KEY 進行分區,你可以在 文檔 中找到它們。請注意,分區鍵必須是主鍵或任何唯一的索引。

from<date> 開始的那些語句含義應該是不言自明的。每個分區都保存 created_at 列小于第二天的值。這也意味著從 from20120414 保留所有在 2012-04-15 以前的數據,所以這是執行清理時我們將刪除的分區。

future 和 start 分區需要一些解釋: future 持有我們尚未定義日期的數據。如果我們不能及時重新分區, 2017-05-17 以后的所有數據都將儲存在 future ,確保我們不會丟失任何數據。 start 也是一個安全網。我們期望所有行都有一個 DATETIME 和 created_at 值,但是我們需要為可能的錯誤做好準備。如果由于某種原因,有一行最終會出現 NULL ,那么它將在 start 分區中,這表示我們需要進行 debug。

當你使用分區時,MySQL 將該數據保存在磁盤的不同部分,就像它們是獨立的表一樣,并根據分區鍵自動組織數據。

要考慮到的一些限制:

不支持查詢緩存。 分區的 InnoDB 表不支持外鍵。 分區表不支持 FULLTEXT 索引或搜索。

還有 更多的限制 ,但是在 RisingStack 采用分區表之后,我們感觸最大的一個限制是。

如果要創建新分區,則需要重新組織一個現有分區,并將其分解以滿足你的需求:

ALTER TABLE tbl REORGANIZE PARTITION future INTO ( from20170517 VALUES LESS THAN (TO_DAYS(’2017-05-18’)), from20170518 VALUES LESS THAN (TO_DAYS(’2017-05-19’)), PARTITION future VALUES LESS THAN MAXVALUE );

刪除分區需要一個 alter table,盡管它會讓你感覺你是在刪除一個表:

ALTER TABLE tbl DROP PARTITION from20170517, from20170518;

你可以看到,你必須在語句中包括分區的實際名稱和描述。 它們不能由 MySQL 動態生成,所以你必須在應用程序邏輯中處理它。這就是我們接下來的內容。

Node.js 和 MySQL 的表分區示例

我們來看看實際的解決方案。對于這里的示例,我們將使用 knex ,它是為 JavaScript 而生的查詢構建器。如果你熟悉 SQL,應該對代碼感覺很熟悉。

首先,我們創建表:

const dedent = require(’dedent’) const _ = require(’lodash’) const moment = require(’moment’) const MAX_DATA_RETENTION = 7 const PARTITION_NAME_DATE_FORMAT = ’YYYYMMDD’ Table.create = function () { return knex.raw(dedent CREATE TABLE IF NOT EXISTS ${tableName} ( id INTEGER NOT NULL AUTO_INCREMENT, data VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id, created_at) ) PARTITION BY RANGE ( TO_DAYS(created_at)) ( PARTITION start VALUES LESS THAN (0), ${Table.getPartitionStrings()} PARTITION future VALUES LESS THAN MAXVALUE ); ) } Table.getPartitionStrings = function () { const days = _.range(MAX_DATA_RETENTION - 2, -2, -1) const partitions = days.map((day) => { const tomorrow = moment().subtract(day, ’day’).format(’YYYY-MM-DD’) const today = moment().subtract(day + 1, ’day’).format(PARTITION_NAME_DATE_FORMAT) return PARTITION from${today} VALUES LESS THAN (TO_DAYS(’${tomorrow}’)), }) return partitions.join(’n’) }

它實際上是我們前面看到的相同的語句,但是我們必須動態地創建分區的名稱和描述。這就是為什么我們創建了 getPartitionStrings 方法。

第一行是:

const days = _.range(MAX_DATA_RETENTION - 2, -2, -1)

MAX_DATA_RETENTION - 2 = 5 創建從 5 到 -2(最后一個值排除)-> [ 5, 4, 3, 2, 1, 0, -1 ] 的序列,然后從當前時間中減去這些值,并創建分區名稱的( today )及其限制( tomorrow )。順序是至關重要的,因為在語句中分區值不會增長時 MySQL 會拋出錯誤。

MySQL 和 Node.js 大規模數據刪除示例

現在我們來看一下數據刪除。你可以 在這里 看到整個代碼。

第一種方法, removeExpired 獲取當前分區的列表,然后將其傳遞給 repartition 。

const _ = require(’lodash’) Table.removeExpired = function (dataRetention) { return Table.getPartitions() .then((currentPartitions) => Table.repartition(dataRetention, currentPartitions)) } Table.getPartitions = function () { return knex(’information_schema.partitions’) .select(knex.raw(’partition_name as name’), knex.raw(’partition_description as description’)) // description holds the day of partition in mysql days .where(’table_schema’, dbName) .andWhere(’partition_name’, ’not in’, [ ’start’, ’future’ ]) .then((partitions) => partitions.map((partition) => ({ name: partition.name, description: partition.description === ’MAX_VALUE’ ? ’MAX_VALUE’ : parseInt(partition.description) }))) } Table.repartition = function (dataRetention, currentPartitions) { const partitionsThatShouldExist = Table.getPartitionsThatShouldExist(dataRetention, currentPartitions) const partitionsToBeCreated = _.differenceWith(partitionsThatShouldExist, currentPartitions, (a, b) => a.description === b.description) const partitionsToBeDropped = _.differenceWith(currentPartitions, partitionsThatShouldExist, (a, b) => a.description === b.description) const statement = dedent ${Table.reorganizeFuturePartition(partitionsToBeCreated)} ${Table.dropOldPartitions(partitionsToBeDropped)} return knex.raw(statement) }

首先,我們從 MySQL 維護的 information_schema.partitions 表中選擇所有當前存在的分區。

然后我們創建該表應該存在的所有分區。如果 A 是存在的分區集合, B 是應該存在的分區集合

partitionsToBeCreated = B A

partitionsToBeDropped = A B

getPartitionsThatShouldExist 創建集合 B

Table.getPartitionsThatShouldExist = function (dataRetention, currentPartitions) { const days = _.range(dataRetention - 2, -2, -1) const oldestPartition = Math.min(...currentPartitions.map((partition) => partition.description)) return days.map((day) => { const tomorrow = moment().subtract(day, ’day’) const today = moment().subtract(day + 1, ’day’) if (Table.getMysqlDay(today) < oldestPartition) { return null } return { name: from${today.format(PARTITION_NAME_DATE_FORMAT)}, description: Table.getMysqlDay(tomorrow) } }).filter((partition) => !!partition) } Table.getMysqlDay = function (momentDate) { return momentDate.diff(moment([ 0, 0, 1 ]), ’days’) // mysql dates are counted since 0 Jan 1 00:00:00 }

分區對象的創建與 CREATE TABLE ... PARTITION BY RANGE 非常相似。檢查我們即將創建的分區是否比當前最舊的分區更舊,這一點至關重要:可能需要隨時間更改 dataRetention 。

以下情況為例:

假設你的用戶開始保留 7 天的數據,但可以選擇將其升級到 10 天。開始時,用戶用以下順序覆蓋分區天數: [ start, -7, -6, -5, -4, -3, -2, -1, future ] 。一個月左右,用戶決定升級。在這種情況下,丟失的分區是 [ -10, -9, -8, 0 ] 。

在清理時,當前的腳本會嘗試重新組織 future 分區,使其在當前腳本 之后 附加它們。

在最開始時創建比 -7 天更老的分區是沒有意義的,因為那些數據注定是被拋棄的,并且還會導致如下的一個分區列表 [ start, -7, -6, -5, -4, -3, -2, -1, -10, -9, -8, 0, future ] ,由于不是單調增加,因此 MySQL 會拋出錯誤,清理將失敗。

MySQL的 TO_DAYS(date) 函數計算從公元元年( 0 年)1 月 1 日以來的天數,所以我們用 JavaScript 計算這個天數。

Table.getMysqlDay = function (momentDate) { return momentDate.diff(moment([ 0, 0, 1 ]), ’days’) }

現在我們有必須刪除的分區和必須創建的分區,我們先為新的一天創建我們的新分區。

Table.reorganizeFuturePartition = function (partitionsToBeCreated) { if (!partitionsToBeCreated.length) return ’’ // there should be only one every day, and it is run hourly, so ideally 23 times a day it should be a noop const partitionsString = partitionsToBeCreated.map((partitionDescriptor) => { return PARTITION ${partitionDescriptor.name} VALUES LESS THAN (${partitionDescriptor.description}), }).join(’n’) return dedent ALTER TABLE ${tableName} REORGANIZE PARTITION future INTO ( ${partitionsString} PARTITION future VALUES LESS THAN MAXVALUE ); }

我們只需準備一個創建新分區的語句。

我們每小時運行這個腳本,以確保沒有任何遺漏,我們能夠每天至少執行一次清理。

所以首先檢查一下是否有一個要創建的分區。這只應該在第一次運行時發生,然后剩余 23 次都不會發生。

我們還必須刪除過時的分區。

Table.dropOldPartitions = function (partitionsToBeDropped) { if (!partitionsToBeDropped.length) return ’’ let statement = ALTER TABLE ${tableName}nDROP PARTITIONn statement += partitionsToBeDropped.map((partition) => { return partition.name }).join(’,n’) return statement + ’;’ }

此方法創建了我們之前看到的 ALTER TABLE ... DROP PARTITION 語句。

最后,為重組做好了一切的準備。

const statement = dedent ${Table.reorganizeFuturePartition(partitionsToBeCreated)} ${Table.dropOldPartitions(partitionsToBeDropped)} return knex.raw(statement) 總結

如你所見,與流行的觀點相反,當你處理大量數據時,可以使用符合 ACID 的 DBMS 解決方案(如MySQL),因此你不一定需要放棄事務數據庫的功能。

符合 ACID 的 DBMS 解決方案(如 MySQL)可用于處理大量數據。

但是,表分區有很多限制,這意味著你將無法使用 InnoDB 提供的所有功能來保持數據的一致性。你可能還無法使用外鍵和 FULLTEXT 搜索來處理應用程序邏輯。

我希望這篇文章可以幫助你確定 MySQL 是否適合你的需求,并幫助你實現解決方案。

來自:http://www.zcfy.cc/article/node-js-mysql-example-handling-100-x27-s-of-gigabytes-of-data-risingstack-3130.html

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 91高清在线 | 欧洲亚洲精品久久久久 | 亚洲精品一区在线观看 | 国产v日产∨综合v精品视频 | 久久亚洲一区二区 | 一区不卡| 日本一区二区在线视频 | 亚洲综合大片69999 | 日韩在线欧美 | 天天爱天天草 | 成人精品视频99在线观看免费 | 国产欧美日韩 | 最新日韩av网址 | 久久国产一区二区 | 日韩毛片 | 黄色的视频免费 | 中文字幕在线欧美 | 精品九九 | 日韩日日夜夜 | 91精品国产福利在线观看 | 久久国产成人午夜av影院宅 | 99精品一区二区三区 | 日韩毛片在线视频 | 免费亚洲视频 | 一区二区三区四区免费 | 91丨九色丨国产在线 | 一级毛片色一级 | www.成人在线视频 | 国产精品国产精品国产专区不卡 | 欧美日韩精品一区二区三区在线观看 | 波多野结衣 一区二区三区 精品精品久久 | 91在线看 | 久久国产一 | 女同久久| 国产成人亚洲综合 | 日本理论片好看理论片 | 欧美激情小视频 | 在线视频91 | 在线欧美亚洲 | 久久精品国产亚洲一区二区三区 | 日韩成人在线一区 | 久久久亚洲一区 | 欧美激情综合色综合啪啪五月 | 超级碰在线 | 成人av观看 | 国产三级黄色毛片 | 国产精品久久久久久久一区探花 | 亚洲日韩中文字幕一区 | 国产毛片av| 成人免费一区二区三区视频网站 | 精品久久久久久久久久久 | 久久精品一区二区三区四区 | www.狠狠干 | 97精品久久 | 国产高清在线精品 | 久久9热| 91视频在线 | 91精品国产综合久久精品 | 日韩免费在线观看视频 | 国产视频一区在线 | 亚洲精品在线看 | 91麻豆精品国产91久久久久久久久 | 九九热在线视频免费观看 | 日韩精品一区二区在线观看 | 日韩成人影院 | 日韩精品亚洲专区在线观看 | 国产欧美久久久久久 | 午夜窝窝 | 在线成人www免费观看视频 | 欧美一级片在线 | 久久精品一区二区三区四区 | a毛片 | 欧美日韩精 | 亚洲人成人一区二区在线观看 | 成人午夜视频在线观看 | 久久成人国产精品 | 国产成人av在线 | 精品久久久久久久久久久久久久久久久久 | 国产成人一级片 | 国内精品久久久久久影视8 91一区二区在线观看 | 精品伊人 | 欧美在线视频一区 | 狠狠av | 国产激情一区二区三区成人免费 | 精品免费一区二区 | 亚洲一级黄色 | 久国产精品 | 亚洲国产一区视频 | www.天天操.com | 国产精品一区在线 | 精品国产乱码久久久久久闺蜜 | 国产精品夜夜春夜夜爽久久电影 | 免费 视频 1级 | 中文字幕本久久精品一区 | 亚洲一区二区三区久久 | 日韩成人免费在线 | 久久久999国产 | 男女av在线| 国产精品99久久久久久宅男 | 午夜羞羞| www.日韩在线观看 | 精品伊人久久 | 久久精品二区亚洲w码 | 99成人| 中文字幕在线第二页 | 亚洲久久久久久 | 99热国产在线观看 | 亚洲网在线 | 日韩一区二区在线免费 | 91麻豆精品国产91久久久久久 | 欧美日韩在线视频一区二区 | 欧美精品网| 国产在线观看一区 | 日韩成人精品在线 | 亚洲蜜臀av乱码久久精品蜜桃 | 99视频在线免费观看 | 91小视频 | 爱免费视频 | 日本精品网站 | 91免费电影 | 99热精品免费 | 久久99精品视频 | 成人久久精品 | 亚洲人成在线播放 | 亚洲国产精品久久 | 日韩欧美在线一区二区 | 欧美在线操 | 亚洲一区二区三区视频 | 欧美日韩亚洲视频 | 黄久久久 | 亚洲成av| 国产一级网站 | 夜夜av | 色综合色综合 | 精品久久一区 | 亚洲精品一区在线观看 | 一级毛片观看 | 久久久久久久久久影院 | 久久久久久精 | 龙珠z中文版普通话 | 日韩一区二区三区在线 | 国产成人精品一区二区三区四区 | 欧美日韩一区二区视频在线观看 | 日本精品免费在线观看 | 国产精品视频区 | 北条麻妃一区二区在线 | 韩国精品主播一区二区在线观看 | 成人欧美一区二区三区黑人孕妇 | 有码在线| 日韩性网站 | 精品久久影院 | 成人小视频在线观看 | 中文字幕一区二区三区四区 | 色悠久久久| 精品久久久久久国产 | 欧美日本国产一区 | 亚洲网站在线免费观看 | 精品福利在线视频 | 亚洲国产一区二区在线观看 | 欧美一级在线 | 国产精品高清在线观看 | 一区在线不卡 | 欧洲妇女成人淫片aaa视频 | 91精品国产色综合久久不卡98口 | 中国人xxxx片99ww| 欧美精品在线一区 | 久久国产久| 黄色免费在线观看网址 | 国产精品中文字幕在线 | 国产一区亚洲二区三区 | 精品成人 | 免费高清一级毛片 | 黄色片免费看. | 欧美日韩一区二区三区不卡视频 | 夜夜操av| 国产精品日韩欧美一区二区 | 久久99精品久久久久久园产越南 | 国产精品美女久久久久久久久久久 | 国产欧美综合一区二区三区 | 午夜影视在线观看 | 国产97人人超碰caoprom | 国产一级电影网 | 一级免费黄视频 | 日本中文字幕在线视频 | 欧美成人二区 | a在线观看免费视频 | 国产视频网 | 国产精品久久久久久久 | 北条麻妃一区二区三区在线 | 综合视频一区二区三区 | 91玖玖 | 日狠狠 | 精品成人免费一区二区在线播放 | av在线入口 | 久久99国产精一区二区三区 | 日本不卡视频 | 美女黄网 | 色玖玖综合 | 中文字幕在线观看一区二区三区 | 久久噜噜噜精品国产亚洲综合 | 国产精品一区2区 | 国产在线不卡一区 | 精品国产乱码久久久久久1区2区 | 黄色一级电影免费观看 | 999国内精品永久免费视频 | 国产裸体永久免费视频网站 | 成人在线免费 | 天天艹综合 | 一道本一区二区三区 | 欧美精品日韩 | 日韩精品成人 | 欧美性吧 | 自拍视频在线观看 | 国产亚洲精品久久久久久豆腐 | 一区二区三区无码高清视频 | 欧美日韩高清不卡 | 国产精品久久久久久二区 | 久草视频在线首页 | 国产不卡在线 | av国产精品 | 91av原创| 精品日韩一区二区 | 色婷婷综合久色 | 91亚洲一区 | 51ⅴ精品国产91久久久久久 | 免费一区二区三区视频在线 | 狠狠躁夜夜躁人人爽天天高潮 | 欧美精品在欧美一区二区少妇 | 精品超碰 | 国产91九色 | 日韩av在线免费电影 | a免费网站| 久草免费在线视频 | 国精品一区 | 亚洲精品乱码 | 在线免费观看成年人视频 | 久久综合色88 | 日韩av在线中文字幕 | 国产亚洲欧美一区二区三区 | 岛国a视频 | 中文久久| 有码在线| 日本久久网| 91亚色| 毛片久久久| 久久狠狠| 91社区在线播放 | av资源中文在线天堂 | 国产在线观看一区二区 | 久久精品视频免费 | 亚洲午夜视频 | 欧美与黑人午夜性猛交久久久 | 免费观看毛片 | 欧美日韩一区二区视频在线观看 | 嫩草私人影院 | 成人午夜小视频 | 亚洲国产精品一区二区三区 | 日韩一区二区三区在线观看 | 欧美精品中文字幕久久二区 | 性视频亚洲 | 精品少妇一区二区三区在线播放 | 91久久国产精品 | 永久av | 久久线视频 | 欧美日韩视频在线观看一区 | 成人精品一区二区三区中文字幕 | 国产999精品久久久久 | 成人在线观看免费视频 | 欧美成年黄网站色视频 | 中文字幕在线欧美 | 精品久久影院 | 可以免费看黄视频的网站 | 国产精品无码永久免费888 | 国产精品久久久久久久久久免费 | 久久精品这里热有精品 | 亚洲丶国产丶欧美一区二区三区 | 91国内 | 欧美日韩成人一区 | 日本激情在线 | 在线看91 | 欧美夜夜爽 | 久久国产精品电影 | 午夜视频免费网站 | 亚洲 欧美 日韩在线 | 久久全国免费视频 | 在线观看日韩精品 | 国产最新视频在线 | 欧美激情精品一区 | 日韩精品中文字幕一区二区三区 | 精品2区 | 韩国xxxx性hd极品| 亚洲精品无 | 欧美成人a | 久久女同互慰一区二区三区 | 午夜精品视频在线观看 | 97久久久国产精品 | 国产精品久久久久久久久久免费看 | 久久亚洲精品中文字幕 | 国产色网 | 日韩9999 | 日韩av免费在线观看 | 午夜国产一级 | 中文字幕日韩在线 | 2019国产精品 | 欧美一级h | 亚洲午夜激情网 | 亚洲精选一区 | 欧美性受 | 高清一区二区三区视频 | 米奇狠狠操| 亚洲成人一区 | 免费av手机在线观看 | 亚洲成人精品一区 | 一区二区在线视频免费观看 | 亚洲欧洲在线观看 | 国产人体视频 | 免费一级毛片 | 三级黄色片在线免费观看 | 午夜精品一区 | 成人美女免费网站视频 | 国产精品成人久久久久 | 精品久久久99 | 午夜在线视频 | 国产成人一区 | 国产区视频在线观看 | 一级片观看 | 欧日韩免费视频 | 91中文字幕在线观看 | 国产一区二区欧美 | 99视频网| 国产99免费 | 日韩欧美视频 | va在线观看| 欧美在线观看一区 | 国产精品国产三级国产aⅴ 精品91 | 国产精品久久久久影院色老大 | a级在线观看 | 国产一级免费在线观看 | 91精品国产欧美一区二区成人 | 久久国产精品久久久久久电车 | 日韩色av | 久草网站| 精品九九 | 91免费在线视频 | 久久视频免费 | 性色视频在线观看 | 中文成人无字幕乱码精品 | 亚洲视频精品一区 | 国产一级黄 | 国产激情偷乱视频一区二区三区 | 欧日韩免费视频 | 欧美日韩精品在线一区 | 一级日韩片 | 视频一区在线播放 | 粉嫩高清一区二区三区精品视频 | 国产成人在线视频 | 蜜桃视频一区二区三区 | 欧美国产精品一区 | 日韩三级 | 99久久综合精品五月天 | 精品久久影院 | 蜜桃视频网站在线观看 | 久久精品综合 | 7777久久 | 亚洲91精品 | 一级a性色生活片久久毛片 夜夜视频 | 久久成人国产视频 | 国产精品一二三区 | 欧美激情一区二区 | 欧美二区三区视频 | 国产午夜精品久久久 | 国产欧美一区二区视频 | 国产精品美女久久久久久免费 | 在线成人国产 | 欧美精品久 | 91精品久久久久久久久中文字幕 | 中文字幕日韩欧美一区二区三区 | 亚洲一区二区三区免费视频 | 精品国产乱码久久久久久1区二区 | 人人看人人草 | 亚洲色域网 | 日韩欧美精品一区二区三区 | 中文字幕在线看 | 欧美福利一区 | 国产91在线免费观看 | 欧美综合成人网 | 五月天婷婷免费视频 | 午夜精品久久久久久久 | 亚洲一区二区在线视频 | 欧美日韩a| 综合伊人 | 久久久国产精品入口麻豆 | 午夜精品久久久久 | www.欧美| 羞羞的视频在线 | 国产欧美综合一区 | 国产一级二级毛片 | 欧美 亚洲 另类 激情 另类 | 在线视频 中文字幕 | 一级毛片免费网站 | 色婷婷久久 | 精品视频一区二区三区 | 日韩福利视频 | 97国产在线 | 99riav在线| 欧美日韩一区在线观看 | 黄色免费av | 国产精品美女久久久久久久久久久 | 亚洲第一视频 | 伊人激情综合 | 国产福利视频 | 6080亚洲精品一区二区 | 91看片免费| 天堂精品| 国产免费一区二区 | 国产在线精品视频 | 国产精品一二三区视频 | 成人超碰在线观看 | 中文精品久久久 | 中文字幕在线免费视频 | 欧美日韩精品在线一区 | 影音先锋 色先锋 | 国产精品视频一 | 在线免费观看日韩视频 | 人人人艹| 99精品免费在线 | 日本久久精品视频 | 91精品国产高清自在线观看 | 日韩欧美在线看 | 日韩一区在线视频 | 亚洲一区中文字幕 | 理论片一区 | 国产99一区二区 | 国产精品久久久久国产a级 91福利网站在线观看 | 国产精品爱久久久久久久 | 一区二区精品视频 | 国产成人久久精品一区二区三区 | 国产九九精品视频 | 日韩毛片免费看 | av片免费看 | 中文亚洲 | 亚洲精品国产setv | 色一情一乱一伦一区二区三区 | 日韩艹逼视频 | 91午夜精品一区二区三区 | 国产视频福利一区 | 欧美日韩中文字幕 | 久久精品一区二区 | 激情欧美一区二区三区中文字幕 | 亚州中文| www.亚洲 | 久久99一区 | 亚洲一区免费视频 | 一区二区国产精品 | 国产精品亚洲视频 | 免费成人在线网站 | 久草精品视频 | 天天操天天色天天 | a视频在线| 精品九九久久 | 久久精品一级 | 中国大陆高清aⅴ毛片 | 美女操av| 亚洲综合色视频在线观看 | 成人久久久精品乱码一区二区三区 | 三区在线观看 | 午夜小电影| 成人欧美一区二区三区白人 | 久久小视频 | 欧美日韩成人激情 | 亚洲网在线| 欧美喷潮久久久xxxxx | 久久综合久久久 | 91日日 | 国产欧美综合一区二区三区 | 国产精品久久久久久久美男 | 国产精品亚洲欧美日韩一区在线 | 国产成人精品免高潮在线观看 | 91精品国产乱码久久久久久久久 | 麻豆av在线播放 | 国产精品一区二区在线 | 一级毛片色一级 | 99热福利 | 亚洲一区二区三区四区在线观看 | 免费看91 | 欧美lesbianxxxxhd视频社区 | 日日夜夜精品免费视频 | 日韩久久网站 | 中文字幕国产视频 | 国产精品久久9 | julia一区二区三区中文字幕 | 草草网 | 影视在线观看 | 无毒黄网| 九九热有精品 | 少妇一级淫片免费放 | 久久se精品一区精品二区 | 国产成人99久久亚洲综合精品 | 欧美视频精品在线观看 | 亚洲欧美一级久久精品 | 国产情侣小视频 | 色综合天天综合网国产成人网 | 精品不卡 | 毛片真人毛毛片毛片 | 日韩亚洲一区二区 | 国产视频亚洲 | www.久久| 一区二区中文 | 成人国产精品色哟哟 | 最新中文字幕在线 | 免费成人小视频 | 日韩精品视频在线观看免费 | 中文字幕一区二区不卡 | 99久久国产 | 欧美在线网站 | 欧美一级免费高清 | 成人免费xxxxx在线视频软件 | 国产欧美精品一区二区三区四区 | 99久久精品免费看国产免费粉嫩 | 欧美一区二区三区在线看 | 成人a网| 国产精品第一区第27页 | av不卡在线播放 | 国产亚洲精品精品国产亚洲综合 | 欧美一区精品 | 成人av视 | 国产精品久久嫩一区二区免费 | 人人人艹 | h免费观看 | 69av.com| 波多野结衣一区二区三区高清 | 午夜视频在线观看网站 | 四虎免费紧急入口观看 | av免费网站 | 亚洲经典视频在线观看 | 午夜精品一区二区三区免费视频 | 岛国av免费看 | 精品在线一区二区 | 欧美日韩精品一区二区三区蜜桃 | 国产精品视频久久 | 97人人做人人人难人人做 | 91亚洲成人| 男女羞羞视频在线观看 | 日韩国产精品一区二区 | 精品国产天堂 | 成人午夜精品一区二区三区 | 在线免费观看色视频 | 欧美日一区二区 | www国产亚洲精品久久网站 | 久久久久亚洲视频 | 久久综合久久久 | 成人午夜免费视频 | 亚洲欧美一区二区三区在线 | а√天堂中文在线资源8 | 波多野结衣一区二 | 国内精品一区二区三区视频 | 8x国产精品视频一区二区 | 国产激情一区二区三区 | 在线观看亚洲视频 | 中文字幕一区二区三区四区不卡 | 久久久国产一区二区三区四区小说 | www.亚洲| 欧美精品一二三区 | 国产一级一级特黄女人精品毛片 | 国产精品一区二区三区四区 | 青青草一区二区三区 | 亚洲福利一区 | 色综久久| 免费亚洲网站 | 老妇激情毛片免费 | 色久视频 | 一区二区三区国产 | 91精品久久久久久久久中文字幕 | 99热国产在线观看 | 成人影院在线 | 91麻豆精品国产91久久久久久 | 国产av毛片| 羞羞的视频在线免费观看 | 成人免费看 | 欧美激情a∨在线视频播放 中文字幕网在线 | 久在线观看 | 国产999免费视频 | 一级a性色生活片久久毛片波多野 | 久久久久久99 | 91麻豆久久久 | www.涩涩视频| 精品国产黄a∨片高清在线 99热婷婷 | 99伊人 | 午夜在线观看免费 | 四虎影院在线看 | 一区二区色 | 一区二区三区国产在线观看 | 日韩在线观看一区 | 成人性毛片 | 国产精品久久久久久亚洲影视 | 天天干干| 久久精品国产精品青草 | 91视频免费看 | 久视频在线观看 | 国产97碰免费视频 | a久久久久久 | 色乱码一区二区三区网站 | 一区二区国产精品 | 九九精品视频在线观看 | 亚洲欧美在线视频 | 综合久久网 | 69久久99精品久久久久婷婷 | 成人激情免费视频 | 国产精品一区在线观看 | 中文字幕在线资源 | 精品av | 伊人亚洲| 免费成人av | 私人毛片免费高清视频 | 日韩素人一区二区三区 |