精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Easy Excel 高效導(dǎo)出 30w 數(shù)據(jù)至 Excel 文件的實戰(zhàn)指南

開發(fā)
本文的需求是將一個百萬數(shù)據(jù)量MySQL8的數(shù)據(jù)導(dǎo)出到excel的功能,經(jīng)查閱資料并結(jié)合實際場景需求整理出這樣一套比較精簡且使用的導(dǎo)出方案。

最近easy excel停止維護,筆者也看到自己早期寫的關(guān)于基于easy excel導(dǎo)出的文章,于是打算重新整理梳理一下,當初對于這個工具類的使用技巧。

本文的需求是將一個百萬數(shù)據(jù)量MySQL8的數(shù)據(jù)導(dǎo)出到excel的功能,經(jīng)查閱資料并結(jié)合實際場景需求整理出這樣一套比較精簡且使用的導(dǎo)出方案。

文章主脈絡(luò)如下,筆者會通過一個簡單的需求案例提出設(shè)計思路和需要解決的問題點,然后結(jié)合一段完整的代碼示例供讀者參考,從而幫助讀者更好的解決這類問題。

一、簡述需求

為了更好演示筆者的方案,這里給出一個演示的需求,該需求是要求導(dǎo)出一個用戶表的數(shù)據(jù),該數(shù)據(jù)表是一張用戶表,包含id和name,該用戶表數(shù)據(jù)量在300w左右,以自增id作為主鍵,而功能要求我們在一分鐘之內(nèi)完成百萬數(shù)據(jù)導(dǎo)出到excel。需要注意的是,我們導(dǎo)出的excel格式為xlsx,它的每一個sheet只能容納100w的數(shù)據(jù),這也就意味著我們的數(shù)據(jù)必須以100w作為批次寫到不同的sheet中。

CREATE TABLE `t_user` (
  `id` bigint NOT NULL,
  `name` varchar(100) DEFAULT NULL,
  `count` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

二、設(shè)計思路

1. 三個問題

我們先來說說需要解決的問題:

  • 如果一次性查詢300w左右的數(shù)據(jù)可能會占據(jù)大量的內(nèi)存,如果對象字段很多的情況下,很可能出現(xiàn)內(nèi)存溢出,我們要如何解決?
  • 每個excel文件都有sheet,并且每個sheet只能容納100w左右的數(shù)據(jù),對于這個問題我們要如何解決?
  • 數(shù)據(jù)寫入到excel時,有沒有合適的工具推薦?

2. 解決方案

(1) 解決大表查詢問題

對于問題1我們兩套解決方案: 方案1是采用分頁查詢的方式進行查詢,參考自己堆內(nèi)存的配置推算每次分頁查詢的數(shù)據(jù)量。因為問題1采用了分頁查詢,我們完全可以通過分頁查詢的次數(shù)推算出一個sheet寫入了多少數(shù)據(jù),例如我們每次分頁查詢50w的數(shù)據(jù),那么每兩次就可以視為一個sheet寫滿了,我們就可以創(chuàng)建一個新的sheet寫入數(shù)據(jù)。

這里需要注意一點,因為我們分頁查詢面對的是百萬級別的數(shù)據(jù),所以隨著分頁的推進勢必出現(xiàn)深分頁導(dǎo)致查詢效率勢降低,所以為了提高分頁查詢的效率,我們可以利用查詢數(shù)據(jù)有序的特性,通過id作為偏移進行分頁查詢。

例如我們第一次分頁查詢的sql語句為:

select * from t_user limit 500000 ;

假如我們不以id作為索引,那么第二次的分頁查詢sql則是:

select * from t_user limit 500000,500000 ;

查看該查詢執(zhí)行計劃,可以看到該查詢一次性查詢到幾乎全表的數(shù)據(jù),并且還走了全秒掃描性能可想而知:

id|select_type|table |partitions|type|possible_keys|key|key_len|ref|rows   |filtered|Extra|
--+-----------+------+----------+----+-------------+---+-------+---+-------+--------+-----+
 1|SIMPLE     |t_user|          |ALL |             |   |       |   |2993040|   100.0|     |

因為我們的數(shù)據(jù)表是id自增的,所以我們查詢的時候完全可以基于該特性通過上一次查詢到的id作為篩選條件進行分頁查詢。

所以我們的分頁查詢可直接改為:

select * from t_user where id > 500000 limit 500000 ;

再次查看執(zhí)行計劃可以發(fā)現(xiàn)該查詢?yōu)榉秶樵儯樵兊降臄?shù)據(jù)量也少了很多,性能顯著提升:

id|select_type|table |partitions|type |possible_keys|key    |key_len|ref|rows   |filtered|Extra      |
--+-----------+------+----------+-----+-------------+-------+-------+---+-------+--------+-----------+
 1|SIMPLE     |t_user|          |range|PRIMARY      |PRIMARY|8      |   |1496520|   100.0|Using where|

另外一種解決方案就是流式查詢,通過流式查詢將SQL語句直接提交給MySQL服務(wù)端,讓服務(wù)端按照客戶端程序接受程度不斷推送數(shù)據(jù),然后我們的java程序每次收集50w的數(shù)據(jù),再寫入到對應(yīng)的excel文件中:

(2) 選擇合適的導(dǎo)出工具

因為市面上比較多的excel導(dǎo)出工具,常見的就是Apache poi,但是它們的操作對于內(nèi)存的消耗非常嚴重,對于我們這種大數(shù)據(jù)量的寫入不是很友好,所以筆者更推薦使用阿里的EasyExcel,它對poi進行一定的封裝和優(yōu)化,同等數(shù)據(jù)量寫入使用的內(nèi)存更小。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>4.0.3</version>
</dependency>

解決上述問題之后,我們就可以說說代碼實現(xiàn)思路了,以本文示例來說,有一張用戶表有300w左右的數(shù)據(jù),每次查詢時只需查詢id(4字節(jié))和name(10字節(jié)),按照64位的操作系統(tǒng)來說,一個user對象所占用的內(nèi)存大小為:

object header +pointer+id字段+name字段大小=8+8+4+10=30字節(jié)

因為java對象內(nèi)存大小需要16位對齊,需要補齊2個字節(jié),所以實際大小為32字節(jié),按照筆者對于堆內(nèi)存的配置,每次查詢50w條數(shù)據(jù)是允許的,所以每次從數(shù)據(jù)庫讀取數(shù)據(jù)并轉(zhuǎn)為java對象,也只需要32*500000/1024即15M內(nèi)存即可。

確定每次分頁查詢50w條數(shù)據(jù)之后,我們就需要確定一共需要查詢幾個分頁,然后就可以根據(jù)pageSize確定查詢的頁數(shù)。 因為每次查詢50w條數(shù)據(jù),所以每兩次完成分頁查詢和寫入基本上一個sheet就會滿了,這時候我們就需要創(chuàng)建一個新的sheet進行數(shù)據(jù)寫入了。

2. 思路小結(jié)

總結(jié)一下實現(xiàn)步驟:

  • 查詢目標數(shù)據(jù)量大小。
  • 根據(jù)每次分頁大小確定查詢頁數(shù)(或使用流式查詢)。
  • 根據(jù)頁數(shù)大小進行遍歷,進行分頁查詢,并將數(shù)據(jù)寫入到文件中。
  • 基于頁數(shù)確定sheet切換時機。

(1) 分頁查詢方案落地

以下便是筆者基于上述思路所實現(xiàn)的分頁查詢和導(dǎo)出的代碼:

long start = System.currentTimeMillis();
        UserMapper userMapper = SpringUtil.getBean(UserMapper.class);
        //計算總的數(shù)據(jù)量
        int count = Math.toIntExact(userMapper.selectCount(Wrappers.emptyWrapper()));


        //獲取分頁總數(shù)
        int queryCount = 50_0000;
        int pageCount = count % queryCount == 0 ? count / queryCount : count / queryCount + 1;

        log.info("pageCount: {}", pageCount);

        //設(shè)置導(dǎo)出的文件名
        String fileName = "F://tmp/result.xlsx";
        //設(shè)置excel的sheet號碼
        int sheetNo = 1;
        //設(shè)置第一個sheet的名字
        String sheetName = "sheet-" + sheetNo;



        // 創(chuàng)建writeSheet
        WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo, sheetName).build();
        //記錄每次分頁查詢的最大值
        Long maxId = null;

        //指定文件
        try (ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build()) {
            //寫入每一頁分頁查詢的數(shù)據(jù)
            for (int i = 1; i <= pageCount; i++) {
                // 分頁去數(shù)據(jù)庫查詢數(shù)據(jù) 這里可以去數(shù)據(jù)庫查詢每一頁的數(shù)據(jù)
                long queryStart = System.currentTimeMillis();

                List<User> userList = null;
                //如果是第一次則直接進行分頁查詢,反之基于上一次分頁查詢的分頁定位實際偏移量,篩選前n條數(shù)據(jù)以達到分頁效果
                PageHelper.startPage(1, queryCount, false);
                if (i == 1) {
                    userList = userMapper.selectList(Wrappers.emptyWrapper());
                } else if (maxId != null) {
                    QueryWrapper wrapper = new QueryWrapper();
                    wrapper.gt("id", maxId);//相當于where id=1
                    userList = userMapper.selectList(wrapper);
                    PageHelper.startPage(0, queryCount, false);
                }


                //更新下一次分頁查詢用的id
                if (CollUtil.isNotEmpty(userList)) {
                    maxId = userList.get(userList.size() - 1).getId();
                    log.info("maxId: {}", maxId);
                }

                long queryEnd = System.currentTimeMillis();
                log.info("數(shù)據(jù)大小:{},寫入sheet位置:{},耗時:{}", userList.size(), sheetName, queryEnd - queryStart);

                long writeStart = System.currentTimeMillis();
                excelWriter.write(userList, writeSheet);

                long writeEnd = System.currentTimeMillis();
                log.info("本次寫入耗時:{}", writeEnd - writeStart);

                //如果% 2 == 0,則說明一個sheet寫入了50*2即100w的數(shù)據(jù),需要創(chuàng)建新的sheet進行寫入
                if (i % 2 == 0) {
                    sheetName = "sheet-" + (++sheetNo);
                    writeSheet = EasyExcel.writerSheet(sheetNo, sheetName).build();
                    log.info("寫滿一個sheet,切換到下一個sheet:{}", sheetName);
                }
            }
        }
        long total = System.currentTimeMillis() - start;
        log.info("導(dǎo)出結(jié)束,總耗時:{}", total);

可能會有讀者好奇筆者這個50w的數(shù)值設(shè)計思路是什么,除了考慮避免OOM以外,還考慮到每個sheet只能寫入100w條的數(shù)據(jù),為了方便通過分頁查詢的輪次確定當前寫入的數(shù)據(jù)量大小,筆者嘗試過20w、50w。 最終在壓測結(jié)果上看出,50w讀寫耗時雖然是20w的2倍,但是IO次數(shù)卻不到20w查詢的二分之一,通過更少的IO操作獲得更好的執(zhí)行性能。

最終300w數(shù)據(jù)導(dǎo)出耗時大約35s,整體性能表現(xiàn)還是可以的:

(2) 使用流式編程導(dǎo)出(推薦)

對應(yīng)我們也給出流式編程的導(dǎo)出方案,筆者針對查詢語句做了流式編程的配置,通過這些配置保證MySQL服務(wù)端基于自己的迭代游標按照客戶端處理效率按照順序的數(shù)據(jù)流不斷傳輸給客戶端:

@Select("select * from user  ")
    @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = Integer.MIN_VALUE)
    @ResultType(User.class)
    void selectListByStream(ResultHandler<User> handler);

關(guān)于流式查詢的更多內(nèi)容,建議讀者參考筆者寫的這篇文章:《MySQL 流式查詢的奧秘與應(yīng)用解析

基于上述查詢語句,我們不斷拿到user對象,因為流式查詢避免的頻繁的IO分頁請求,所以真正的寫入瓶頸點在于寫入到excel文件中,所以筆者在流式聚合數(shù)據(jù)時是通過每1w條進行一次寫入,保持每100w切換一次sheet。

需要注意的是因為筆者的ResultHandler用的是lambda表達式,為了讓編譯器通過編譯所有的計數(shù)、sheet等修改操作都是通過原子類CAS完成的,具體讀者可以參考筆者的注釋:

long start = System.currentTimeMillis();
        UserMapper userMapper = SpringUtil.getBean(UserMapper.class);

        //設(shè)置導(dǎo)出的文件名
        String fileName = "F://tmp/result.xlsx";
        //設(shè)置excel的sheet號碼,用原子類保證可以在lambda表達式中通過編譯
        AtomicInteger sheetNo = new AtomicInteger(1);
        //設(shè)置第一個sheet的名字,用原子類保證可以在lambda表達式中通過編譯
        AtomicReference<String> sheetName = new AtomicReference<>("sheet-" + sheetNo.get());


        // 創(chuàng)建writeSheet,用原子類保證可以在lambda表達式中通過編譯
        WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo.get(), sheetName.get()).build();
        AtomicReference<WriteSheet> writeSheetRef = new AtomicReference<>(writeSheet);


        List<User> userList = new ArrayList<>();
        AtomicReference<List<User>> userListRef = new AtomicReference<>(userList);

        //記錄導(dǎo)出的size
        AtomicInteger atomicCount = new AtomicInteger(0);

        //指定文件
        try (ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build()) {


            userMapper.selectListByStream(res -> {
                //存入list中
                User user = res.getResultObject();
                userListRef.get().add(user);
                atomicCount.incrementAndGet();

                //50w執(zhí)行一次導(dǎo)出寫入
                if (userListRef.get().size() % 1_0000 == 0) {
                    long writeStart = System.currentTimeMillis();
                    //寫入到文件
                    excelWriter.write(userListRef.get(), writeSheetRef.get());
                    //清空列表內(nèi)部數(shù)據(jù)
                    userListRef.get().clear();
                    long writeEnd = System.currentTimeMillis();
                    log.info("本次寫入耗時:{}", writeEnd - writeStart);
                }

                //寫入100w條后,切換sheet
                if (atomicCount.get() % 100_0000 == 0) {
                    //自增sheetNo
                    sheetNo.incrementAndGet();
                    //修改sheetName
                    sheetName.set("sheet-" + sheetNo.get());
                    //寫入文件
                    writeSheetRef.set(EasyExcel.writerSheet(sheetNo.get(), sheetName.get()).build());

                    log.info("寫滿一個sheet,切換到下一個sheet:{}", sheetName);
                }
            });

            //檢查是否還有未寫入的文件
            if (CollectionUtil.isNotEmpty(userList)) {
                log.info("存在未寫入完成的數(shù)據(jù),size:{}", userList.size());
                excelWriter.write(userList, writeSheetRef.get());
            }
            long total = System.currentTimeMillis() - start;
            log.info("導(dǎo)出結(jié)束,總耗時:{}", total);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

最終這種方案的執(zhí)行耗時在最好的情況下差不多30s左右,總的來說流式查詢天然內(nèi)存友好且游標式順序前進的特定,對于這種并發(fā)場景下的數(shù)據(jù)導(dǎo)出是非常友好的,所以這種方案也是筆者比較推薦的方案:

三、小結(jié)

以上便是筆者的百萬級別數(shù)據(jù)導(dǎo)出的落地方案,可以看出筆者針對分頁查詢導(dǎo)出的方案著重在分頁查詢大小和分頁查詢sql上進行重點優(yōu)化,通過平衡分頁查詢的數(shù)據(jù)量和IO次數(shù)找到合適的pageSize,再通過上一次分頁查詢結(jié)果定位下一次查詢的id作為where條件,避免分頁查詢時的全秒掃描以得到符合業(yè)務(wù)需求的高性能sql。

對于流式查詢,因為流式查詢的特定,筆者在優(yōu)化時更著重于找到寫入到文件這塊的耗時上,通過找到IO寫入的平衡點找到最佳寫入閾值,從而完成百萬級別數(shù)據(jù)的高效導(dǎo)出。

責(zé)任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關(guān)推薦

2019-08-27 08:51:36

計數(shù)數(shù)據(jù)庫并發(fā)

2025-11-17 09:06:13

架構(gòu)計數(shù)業(yè)務(wù)數(shù)據(jù)庫

2025-07-29 10:11:01

2023-02-03 08:21:30

excelMySQL

2025-05-12 00:00:00

2025-05-19 01:00:00

2025-05-06 01:00:00

Excel高性能內(nèi)存

2021-03-11 08:24:48

Javapoi數(shù)據(jù)脫敏

2023-02-25 10:04:21

JavaExcel導(dǎo)出功能

2020-09-22 09:41:09

前端

2022-12-29 08:49:40

SpringBootExcel

2025-11-05 08:23:56

2011-08-24 12:35:03

SQL Server按條件批量導(dǎo)出為多個E

2022-02-09 18:28:46

多線程Excel代碼

2024-07-30 15:56:42

2012-04-28 10:50:51

jQuery

2018-10-22 15:21:52

iBASEAMD EPYC服務(wù)器

2010-07-21 14:17:36

SQL Server數(shù)

2020-01-18 10:27:07

簡書知乎Python
點贊
收藏

51CTO技術(shù)棧公眾號

www.精品在线| 久久青青色综合| 免费v片在线观看| 成人女性视频| 一区二区三区丝袜| 日韩精品视频在线免费观看| 香蕉视频在线网址| 中文字幕第四页| 国产另类在线| 一区二区三区四区蜜桃 | 日韩性xxx| 久久se精品一区二区| 亚洲美女av黄| 亚洲精品无码久久久久久| 好男人在线视频www| 亚洲区综合中文字幕日日| 欧美优质美女网站| 欧美理论一区二区| 日韩电影中文字幕一区| 久久久久久久激情| 中文字幕无码精品亚洲35| 国产午夜免费视频| 一区二区视频播放| 少妇精品导航| 亚洲永久精品大片| 国产精品美女久久久久av超清| 亚洲男女在线观看| 国产三级电影在线播放| 成人h动漫精品一区二区| 欧美激情一区二区三区成人| 国产在线观看免费播放| av大片在线看| 蜜桃视频免费观看一区| 日韩中文字幕在线免费观看| 中文字幕国产免费| 成人免费网站视频| 国产精品沙发午睡系列990531| 国产精品久久久久久久久久免费 | 黄色片中文字幕| 一级做a爱视频| 日韩porn| 老司机午夜免费精品视频 | 亚洲av无码国产精品久久不卡 | 国产精品爽爽爽| 美女久久久久久久久久| 久久99久久99精品免观看软件| 少女频道在线观看免费播放电视剧| 国产一区二区三区在线看麻豆| 久久精品国产一区二区电影| 红桃视频一区二区三区免费| bl视频在线免费观看| 久久综合久久综合久久综合| 国产成人精品在线| 少妇视频一区二区| 伊人精品久久| 欧美色另类天堂2015| 亚洲欧洲日韩精品| 人妻无码一区二区三区久久99| 欧美一级视频| 久久精品人人做人人爽| 日本一级片免费| 欧美天堂社区| 正在播放一区二区| 成人免费观看视频在线观看| 香蕉伊大人中文在线观看| 国产精品护士白丝一区av| 成人av播放| 久久久精品毛片| 中文字幕一区二区av| 操日韩av在线电影| 一区二区三区免费在线观看视频 | 国产在线精品播放| 国产在线拍揄自揄拍| 亚洲伦伦在线| 久久久精品国产一区二区| 国产农村妇女精品一区| 豆花视频一区二区| 日韩精品在线免费观看视频| 国产精品中文久久久久久| 免费欧美网站| 欧美日韩一区二区三区视频| 日本a级片免费观看| 欧美极品免费| 欧美高清视频不卡网| 无码日韩人妻精品久久蜜桃| 狂野欧美性猛交xxxxx视频| 亚洲h动漫在线| 大地资源网在线观看免费官网| 北岛玲日韩精品一区二区三区| 91尤物视频在线观看| 国产日韩在线观看av| jizz中国少妇| 麻豆91精品91久久久的内涵| 日韩女在线观看| 日韩欧美高清在线观看| 欧美精品激情| 午夜性色一区二区三区免费视频| 精品久久久久久中文字幕| 青青草综合视频| 欧美成人ⅴideosxxxxx| 91精品婷婷国产综合久久性色| 亚洲の无码国产の无码步美| 国产精品x8x8一区二区| 亚洲人在线视频| 免费看黄色的视频| 国语产色综合| 伊人久久久久久久久久| 免费试看一区| 精品国产av一区二区| 美女在线视频一区| 欧美高清性hdvideosex| 天天躁日日躁狠狠躁av麻豆男男| 日韩电影精品| 欧美日韩国产另类不卡| 日韩一区二区三区不卡视频| 久久中文字幕国产| 日本免费福利视频| 这里只有精品在线| 国产成人在线视频| 四虎在线视频免费观看| 韩国三级电影一区二区| 91精品久久久久久久久青青| 在线播放一级片| 日韩福利视频导航| 国产精品入口夜色视频大尺度| 麻豆成人av| 精品成人无码久久久久久| 国产不卡一区视频| 99久久精品无码一区二区毛片| 免费一级在线观看| 久久综合九色综合欧美就去吻| 人人妻人人澡人人爽精品欧美一区| 第84页国产精品| 亚洲精品福利资源站| 97超碰在线免费观看| 成人91在线| 国产成人涩涩涩视频在线观看| 日日躁夜夜躁白天躁晚上躁91| 亚洲精品综合在线| 精品欧美一区免费观看α√| 深夜福利一区| 亚洲欧美国产精品久久久久久久 | 日本一区高清| 精品久久久一区二区| 亚洲久久久久久| 99热这里只有成人精品国产| 欧美有码在线视频| 波多野结衣视频在线看| 国产一区二区电影| 先锋影音男人资源| 日韩人妻无码精品久久久不卡| 毛片网站在线| 日韩欧美精品中文字幕| 精品对白一区国产伦| 50度灰在线观看| 亚洲日韩中文字幕一区| 精品99999| 日本中文字幕免费| 91天堂素人约啪| 99精品视频网站| 国色天香久久精品国产一区| 欧美精品在线第一页| 国产一级片免费视频| 国产亚洲欧洲一区高清在线观看| 樱空桃在线播放| 秋霞影院一区| 亚洲欧美中文另类| 精产国品一区二区三区| 欧美网站免费| 欧美一区在线视频| 久久人人爽人人人人片| 99re国产精品| 免费看污久久久| 狂野欧美性猛交xxxx| 久热精品视频在线| 日本激情视频网站| 日韩欧美一区二区三区| 日韩欧美黄色网址| 亚洲人体大胆视频| 欧美日韩一区二| 日韩精品一级毛片在线播放| 欧美极品欧美精品欧美视频 | 久久免费视频2| 99re8这里有精品热视频免费| 亚洲图中文字幕| 中日韩精品视频在线观看| 久久亚洲一区二区三区明星换脸 | 日本一本在线免费福利| 欧美二区三区的天堂| 国产亚洲精品成人| 精品一区二区三区欧美| 三级在线免费观看| 久久不见久久见免费视频7| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲av电影一区| 亚洲一区二区在线播放相泽 | 国产精品久久三| 久久国产劲爆∧v内射| 日本va欧美va瓶| 欧美三日本三级少妇三99| 成人免费在线观看视频| 亚洲欧洲日产国码av系列天堂| 中文天堂在线视频| 亚洲成人精品一区二区| 91精品国产高清91久久久久久| 亚洲毛片一区| 综合国产精品久久久| se69色成人网wwwsex| 亚洲色无码播放| www.亚洲黄色| 欧美日韩视频一区二区| 西西44rtwww国产精品| 国产成人啪免费观看软件| 99re8这里只有精品| 激情五月综合网| 久久综合色一本| 综合伊人久久| 亚洲aⅴ日韩av电影在线观看| 久cao在线| 91精品国产欧美一区二区成人| 手机看片久久久| 亚洲成人一区二区| 欧美成人黄色网| 国产a精品视频| 中文字幕亚洲乱码| 日韩精品亚洲一区二区三区免费| 国产高清av在线播放| 青青草原在线亚洲| 97se国产在线视频| 国产直播在线| 欧美日韩电影在线观看| 内射后入在线观看一区| 欧美一区欧美二区| 一区二区三区精彩视频| 操欧美老女人| 亚洲电影免费观看高清| 久久久久99精品成人片毛片| 国产精品污www在线观看| 91丝袜超薄交口足| 麻豆精品一区二区综合av| 欧美精品一区二区三区免费播放| 四虎成人av| 国产精品一区而去| 日韩免费小视频| 国产精品91在线| 亚洲电影有码| 国产一区香蕉久久| 亚洲伦理网站| 亚洲自拍在线观看| 日韩精品一区二区三区免费视频| 114国产精品久久免费观看| 成人在线视频区| 日韩免费av在线| 亚洲免费中文| 日本福利视频在线| 国产亚洲福利| 久久精品午夜一区二区福利| 精品欧美一区二区三区在线观看| 97久久久久久| 色网站免费在线观看| 精品99一区二区三区| 熟妇人妻一区二区三区四区| 亚洲精品小视频| av男人的天堂在线| 久久精品国产99国产精品澳门| 99在线播放| 国产亚洲一区二区在线| 欧美激情成人网| 国内精品久久久久久久影视麻豆| 国产欧美一区二区三区不卡高清| 欧美艳星kaydenkross| 午夜日韩福利| 欧美区高清在线| 成人羞羞网站入口| 国产人妻互换一区二区| 亚洲东热激情| 色播色播色播色播色播在线| 亚洲大尺度美女在线| 爽爽视频在线观看| 欧美一区二区视频免费观看| 99草在线视频| 欧美视频日韩视频| 国产女人18毛片18精品| 精品国产乱码久久久久久牛牛| 亚洲aaaaaaa| www.午夜精品| 国产粉嫩在线观看| 国产主播喷水一区二区| 欧美人妖视频| 正在播放91九色| 国产日韩1区| 小早川怜子一区二区三区| 成人激情av网| 国产成人免费在线观看视频| 五月婷婷另类国产| 国产精品视频无码| 欧美日韩三级一区| 超碰人人人人人人| 国产亚洲一区二区在线| 国内在线免费视频| 欧美日韩国产成人高清视频| 中文在线免费视频| 97在线电影| 成人精品天堂一区二区三区| 免费超爽大片黄| 激情综合色综合久久综合| 偷拍女澡堂一区二区三区| 黄色成人小视频| 成人av中文| 色999日韩| 色综合影院在线观看| 毛片毛片毛片毛片毛| 色97色成人| 一区二区导航| 日韩免费在线看| 美女精品久久| 亚洲一卡二卡三卡四卡无卡网站在线看 | 精品视频自拍| 久久艳妇乳肉豪妇荡乳av| 久久久国产精品| 美女av免费观看| 极品av少妇一区二区| 午夜久久久精品| 久久久一区二区三区| 国产毛片欧美毛片久久久| 国产精品私人自拍| 精品人妻无码一区二区性色| 亚洲精品在线免费观看视频| av免费在线观看网站| 国产日韩精品在线播放| 精品免费av| 色一情一乱一乱一区91| 日本美女一区二区| 日韩人妻无码精品综合区| 欧美日韩性视频在线| 制服丝袜在线91| 亚洲字幕av一区二区三区四区| 亚洲精品狠狠操| 成人免费一区二区三区牛牛| 99蜜桃在线观看免费视频网站| 亚洲乱码精品| 精品国产鲁一鲁一区二区三区| 国产精品久久久久永久免费观看| 在线视频精品免费| 亚洲午夜色婷婷在线| 日日夜夜天天综合| 欧美午夜电影网| 午夜视频免费看| 91av在线播放视频| av中文资源在线资源免费观看| 99久精品国产| 国产美女在线一区| 岛国精品在线播放| 免费a在线观看播放| 亚洲成va人在线观看| 少妇一级淫片免费看| 国产69久久精品成人| 九九久久电影| 色乱码一区二区三区在线| 亚洲欧洲日韩综合一区二区| 亚欧视频在线观看| 亚洲精品wwwww| 欧美电影免费观看网站| 午夜老司机精品| 久久99精品国产| 欧美国产在线看| 亚洲精品久久久一区二区三区| 依依综合在线| 亚洲人久久久| 国产成人精品亚洲日本在线桃色 | 洋洋成人永久网站入口| 丰满岳乱妇国产精品一区| 91国产在线精品| 精品日韩欧美一区| 亚洲精品中文字幕乱码无线| 亚洲图片欧美色图| 黄色国产在线| 久久久久久久国产精品视频| 好吊妞视频这里有精品| 精品久久久久久久免费人妻| 中文字幕一区二区视频| 男人天堂综合网| 国产日本欧美一区二区三区| 欧美激情一级片一区二区| 熟女俱乐部一区二区视频在线| 欧美日韩夫妻久久| 成人免费高清观看| 亚洲国产欧美日韩| 成人免费精品视频| 91片黄在线观看喷潮| 97免费视频在线播放| 久久亚洲成人| 国产白嫩美女无套久久| 欧美影院天天5g天天爽| 日韩a∨精品日韩在线观看| 精品中文字幕一区二区| 精品一区二区三区人妻| 在线观看久久久久久| 亚洲av无码成人精品区| 亚洲大片精品永久免费|