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

為什么MySQL存儲過程、函數和觸發器對性能不好

數據庫 MySQL
MySQL存儲過程、函數和觸發器是應用程序開發人員的誘人構造。但是,正如我所發現的,使用MySQL存儲例程會影響數據庫性能。由于不能完全確定在客戶訪問期間看到了什么,我開始創建一些簡單的測試來度量觸發器對數據庫。

MySQL存儲過程、函數和觸發器是應用程序開發人員的誘人構造。但是,正如我所發現的,使用MySQL存儲例程會影響數據庫性能。由于不能完全確定在客戶訪問期間看到了什么,我開始創建一些簡單的測試來度量觸發器對數據庫性能的影響。結果可能會讓你大吃一驚。

為什么存儲例程在性能上不是***的:短版本?

最近,我與一位客戶合作,了解觸發器和存儲例程的性能。我對存儲例程的了解是:“死”代碼(分支中的代碼永遠不會運行)仍然可以顯著降低函數/過程/觸發器的響應時間。我們需要小心地清理我們不需要的東西。

Profiling MySQL Stored Functions

Let's compare these four simple stored functions (in MySQL 5.7): 

Function 1

  1. CREATE DEFINER=`root`@`localhost` FUNCTION `func1`() RETURNS int(11) 
  2. BEGIN 
  3. declare r int default 0; 
  4. RETURN r; 
  5. END 

This function simply declares a variable and returns it. It is a dummy function. 

Function 2

  1. CREATE DEFINER=`root`@`localhost` FUNCTION `func2`() RETURNS int(11) 
  2. BEGIN 
  3.     declare r int default 0; 
  4.     IF 1=2 
  5.     THEN 
  6. select levenshtein_limit_n('test finc''test func', 1000) into r; 
  7.     END IF; 
  8. RETURN r; 
  9. END 

This function calls another function, levenshtein_limit_n (calculates levenshtein distance). But wait: this code will never run — the condition IF 1=2 will never be true. So that is the same as function 1. 

Function 3

  1. CREATE DEFINER=`root`@`localhost` FUNCTION `func3`() RETURNS int(11) 
  2. BEGIN 
  3.     declare r int default 0; 
  4.     IF 1=2 THEN 
  5. select levenshtein_limit_n('test finc''test func', 1) into r; 
  6.     END IF; 
  7.     IF 2=3 THEN 
  8. select levenshtein_limit_n('test finc''test func', 10) into r; 
  9.     END IF; 
  10.     IF 3=4 THEN 
  11. select levenshtein_limit_n('test finc''test func', 100) into r; 
  12.     END IF; 
  13.     IF 4=5 THEN 
  14. select levenshtein_limit_n('test finc''test func', 1000) into r; 
  15.     END IF; 
  16. RETURN r; 
  17. END 

Here there are four conditions and none of these conditions will be true: there are 4 calls of "dead" code. The result of the function call for function 3 will be the same as function 2 and function 1. 

Function 4

  1. CREATE DEFINER=`root`@`localhost` FUNCTION `func3_nope`() RETURNS int(11) 
  2. BEGIN 
  3.     declare r int default 0; 
  4.     IF 1=2 THEN 
  5. select does_not_exit('test finc''test func', 1) into r; 
  6.     END IF; 
  7.     IF 2=3 THEN 
  8. select does_not_exit('test finc''test func', 10) into r; 
  9.     END IF; 
  10.     IF 3=4 THEN 
  11. select does_not_exit('test finc''test func', 100) into r; 
  12.     END IF; 
  13.     IF 4=5 THEN 
  14. select does_not_exit('test finc''test func', 1000) into r; 
  15.     END IF; 
  16. RETURN r; 
  17. END 

This is the same as function 3, but the function we are running does not exist. Well, it does not matter as the selectdoes_not_exit will never run. 

So, all the functions will always return 0. We expect that the performance of these functions will be the same or very similar. Surprisingly, that is not the case! To measure the performance, I used the "benchmark" function to run the same function 1M times. Here are the results:

  1. +-----------------------------+ 
  2. | benchmark(1000000, func1()) | 
  3. +-----------------------------+ 
  4. |                           0 | 
  5. +-----------------------------+ 
  6. 1 row in set (1.75 sec) 
  7. +-----------------------------+ 
  8. | benchmark(1000000, func2()) | 
  9. +-----------------------------+ 
  10. |                           0 | 
  11. +-----------------------------+ 
  12. 1 row in set (2.45 sec) 
  13. +-----------------------------+ 
  14. | benchmark(1000000, func3()) | 
  15. +-----------------------------+ 
  16. |                           0 | 
  17. +-----------------------------+ 
  18. 1 row in set (3.85 sec) 
  19. +----------------------------------+ 
  20. | benchmark(1000000, func3_nope()) | 
  21. +----------------------------------+ 
  22. |                                0 | 
  23. +----------------------------------+ 
  24. 1 row in set (3.85 sec) 

As we can see, func3 (with four dead code calls that will never be executed, otherwise identical to func1) runs almost 3x slower compared to func1(); func3_nope() is identical in terms of response time to func3().

Visualizing All System Calls From Functions

To figure out what is happening inside the function calls, I used performance_schema/sys schema to create a trace with ps_trace_thread() procedure.

1.Get the thread_id for the MySQL connection: 

  1. mysql> select THREAD_ID from performance_schema.threads where processlist_id = connection_id();  
  2. +-----------+  
  3. | THREAD_ID |  
  4. +-----------+  
  5. |        49 |  
  6. +-----------+  
  7. 1 row in set (0.00 sec)  

2.Run ps_trace_thread in another connection passing the thread_id=49: 

  1. mysql> CALL sys.ps_trace_thread(49, concat('/var/lib/mysql-files/stack-func1-run1.dot'), 10, 0, TRUETRUETRUE);  
  2. +--------------------+  
  3. | summary            |  
  4. +--------------------+  
  5. | Disabled 0 threads |  
  6. +--------------------+  
  7. 1 row in set (0.00 sec)  
  8. +---------------------------------------------+  
  9. | Info                                        |  
  10. +---------------------------------------------+  
  11. | Data collection starting for THREAD_ID = 49 |  
  12. +---------------------------------------------+  
  13. 1 row in set (0.00 sec)  

3.At that point I switched to the original connection (thread_id=49) and run: 

  1. mysql> select func1();  
  2. +---------+  
  3. | func1() |  
  4. +---------+  
  5. |       0 |  
  6. +---------+  
  7. 1 row in set (0.00 sec)  

4.The sys.ps_trace_thread collected the data (for 10 seconds, during which I ran the ), then it finished its collection and created the dot file: 

  1. +-----------------------------------------------------------------------+  
  2. | Info                                                                  |  
  3. +-----------------------------------------------------------------------+  
  4. | Stack trace written to /var/lib/mysql-files/stack-func3nope-new12.dot |  
  5. +-----------------------------------------------------------------------+ 
  6. 1 row in set (9.21 sec)  
  7. +-------------------------------------------------------------------------------+  
  8. Convert to PDF                                                                |  
  9. +-------------------------------------------------------------------------------+  
  10. | dot -Tpdf -o /tmp/stack_49.pdf /var/lib/mysql-files/stack-func3nope-new12.dot |  
  11. +-------------------------------------------------------------------------------+  
  12. 1 row in set (9.21 sec)  
  13. +-------------------------------------------------------------------------------+  
  14. Convert to PNG                                                                |  
  15. +-------------------------------------------------------------------------------+  
  16. | dot -Tpng -o /tmp/stack_49.png /var/lib/mysql-files/stack-func3nope-new12.dot |  
  17. +-------------------------------------------------------------------------------+  
  18. 1 row in set (9.21 sec)  
  19. Query OK, 0 rows affected (9.45 sec)  

I repeated these steps for all the functions above and then created charts of the commands.

Here are the results:

Func1() 

Func2() 

 

Func3() 

As we can see, there is a sp/jump_if_not call for every "if" check followed by an opening tables statement (which is quite interesting). So parsing the "IF" condition made a difference.

For MySQL 8.0 we can also see MySQL source code documentation for stored routines which documents how it is implemented. It reads:

Flow Analysis OptimizationsAfter code is generated, the low level sp_instr instructions are optimized. The optimization focuses on two areas:

Dead code removal,Jump shortcut resolution.These two optimizations are performed together, as they both are a problem involving flow analysis in the graph that represents the generated code.

The code that implements these optimizations is sp_head::optimize().

However, this does not explain why it executes "opening tables." I have filed a bug.

When Slow Functions Actually Make a Difference

Well, if we do not plan to run one million of those stored functions, we will never even notice the difference. However, where it will make a difference is ... inside a trigger. Let's say that we have a trigger on a table: every time we update that table it executes a trigger to update another field. Here is an example: let's say we have a table called "form" and we simply need to update its creation date: 

  1. mysql> update form set form_created_date = NOW() where form_id > 5000;  
  2. Query OK, 65536 rows affected (0.31 sec)  
  3. Rows matched: 65536  Changed: 65536  Warnings: 0  

That is good and fast. Now we create a trigger which will call our dummy func1(): 

  1. CREATE DEFINER=`root`@`localhost` TRIGGER `test`.`form_AFTER_UPDATE`  
  2. AFTER UPDATE ON `form`  
  3. FOR EACH ROW  
  4. BEGIN  
  5. declare r int default 0;  
  6. select func1() into r;  
  7. END  

Now repeat the update. Remember: it does not change the result of the update as we do not really do anything inside the trigger. 

  1. mysql> update form set form_created_date = NOW() where form_id > 5000;  
  2. Query OK, 65536 rows affected (0.90 sec)  
  3. Rows matched: 65536  Changed: 65536  Warnings: 0  

Just adding a dummy trigger will add 2x overhead: the next trigger, which does not even run a function, introduces a slowdown: 

  1. CREATE DEFINER=`root`@`localhost` TRIGGER `test`.`form_AFTER_UPDATE`  
  2. AFTER UPDATE ON `form`  
  3. FOR EACH ROW  
  4. BEGIN  
  5. declare r int default 0;  
  6. END 
  1. mysql> update form set form_created_date = NOW() where form_id > 5000;   
  2. Query OK, 65536 rows affected (0.52 sec)   
  3. Rows matched: 65536  Changed: 65536  Warnings: 0  

Now, lets use func3 (which has "dead" code and is equivalent to func1): 

  1. CREATE DEFINER=`root`@`localhost` TRIGGER `test`.`form_AFTER_UPDATE`  
  2. AFTER UPDATE ON `form`  
  3. FOR EACH ROW  
  4. BEGIN  
  5. declare r int default 0;  
  6. select func3() into r;  
  7. END  
  1. mysql> update form set form_created_date = NOW() where form_id > 5000;   
  2. Query OK, 65536 rows affected (1.06 sec)   
  3. Rows matched: 65536  Changed: 65536  Warnings: 0  

However, running the code from the func3 inside the trigger (instead of calling a function) will speed up the update: 

  1. CREATE DEFINER=`root`@`localhost` TRIGGER `test`.`form_AFTER_UPDATE`  
  2. AFTER UPDATE ON `form`  
  3. FOR EACH ROW  
  4. BEGIN  
  5.     declare r int default 0;  
  6.     IF 1=2 THEN  
  7. select levenshtein_limit_n('test finc''test func', 1) into r;  
  8.     END IF;  
  9.     IF 2=3 THEN  
  10. select levenshtein_limit_n('test finc''test func', 10) into r;  
  11.     END IF;  
  12.     IF 3=4 THEN  
  13. select levenshtein_limit_n('test finc''test func', 100) into r;  
  14.     END IF;  
  15.     IF 4=5 THEN  
  16. select levenshtein_limit_n('test finc''test func', 1000) into r;  
  17.     END IF; 
  18. END   
  1. mysql> update form set form_created_date = NOW() where form_id > 5000; 
  2. Query OK, 65536 rows affected (0.66 sec) 
  3. Rows matched: 65536  Changed: 65536  Warnings: 0  

Memory Allocation

Potentially, even if the code will never run, MySQL will still need to parse the stored routine-or trigger-code for every execution, which can potentially lead to a memory leak, as described in this bug.

結論

存儲的例程和觸發器事件在執行時被解析。即使是永遠不會運行的“死”代碼也會顯著影響批量操作的性能(例如,在觸發器中運行時)。這也意味著通過設置“標志”(例如)禁用觸發器仍然會影響批量操作的性能。 

責任編輯:龐桂玉 來源: 代碼人生
相關推薦

2010-05-26 17:57:44

MySQL 觸發器

2024-01-19 09:37:19

MySQL數據庫

2019-04-30 15:28:46

數據庫存儲過程觸發器

2010-05-19 11:25:46

MySQL觸發器

2010-04-26 14:12:23

Oracle使用游標觸

2019-01-14 14:41:27

Mysql存儲觸發器

2021-08-05 12:41:57

高并發性能CAS

2023-02-28 11:29:09

存儲函數MySQL

2024-04-25 09:43:42

PostgreSQL數據庫關系型數據庫

2024-08-05 00:00:00

RocketMQKafka磁盤

2010-07-16 10:19:31

2011-05-20 14:06:25

Oracle觸發器

2021-07-30 10:33:57

MySQL觸發器數據

2010-10-12 10:04:15

MySQL觸發器

2010-05-31 18:06:07

MySQL 觸發器

2010-05-18 15:58:39

MySQL觸發器

2010-10-12 10:24:58

mysql觸發器

2010-04-09 09:07:43

Oracle游標觸發器

2011-07-21 15:42:53

SQL觸發器存儲過程

2010-10-12 10:10:55

mysql觸發器
點贊
收藏

51CTO技術棧公眾號

成人免费黄色小视频| 99免费视频观看| 刘亦菲久久免费一区二区| 国产模特精品视频久久久久| 亚洲人成亚洲人成在线观看| 在线观看av免费观看| 咪咪网在线视频| 国产精品久久三| 精品久久久三级| 国产毛片在线视频| 老司机精品福利视频| 免费91麻豆精品国产自产在线观看 | 浅井舞香一区二区| 26uuu成人网| 国产精品密蕾丝视频下载| 欧美一级欧美三级| 91视频免费版污| 91色在线看| 成人欧美一区二区三区小说| 麻豆蜜桃91| 亚洲第一成人av| 久草这里只有精品视频| 欧美一区亚洲一区| 国产一级特黄视频| 99成人超碰| 色综合伊人色综合网| 99久久国产精| 51亚洲精品| 欧美二区乱c少妇| 韩国中文字幕av| 亚洲女同av| 亚洲成人免费在线| 91看片淫黄大片91| 青青青青在线| 中文一区二区在线观看| 日本一区二区三区视频在线观看| 亚洲精品福利网站| 国产成人av电影| 亚洲一区二区三区四区在线播放 | 亚洲h片在线看| 99久久精品国产观看| 91精品国产色综合| 日本熟妇一区二区| 亚洲无毛电影| 欧美精品www| 成人免费看片98| 午夜亚洲福利| 欧美福利视频网站| 精品无码av在线| 黄色精品免费| 久久久免费在线观看| 国产极品国产极品| 欧美激情麻豆| 久久久久久一区二区三区| 久草免费在线观看视频| 欧美视频福利| 国外成人性视频| 国产性xxxx高清| 午夜在线精品| 国产精品久久久久久久久久久新郎| 久久人人爽人人爽人人片av免费| 性欧美xxxx大乳国产app| 青青草一区二区| 中文 欧美 日韩| 精品一区二区三区不卡| 亚洲一区中文字幕在线观看| 国产ts人妖调教重口男| 久久裸体视频| 国产狼人综合免费视频| www.黄色片| gogogo免费视频观看亚洲一| 欧美日韩精品久久| 性开放的欧美大片| 亚洲综合在线观看视频| 国产曰肥老太婆无遮挡| 在线视频cao| 欧美三级三级三级| 欧美xxxxxbbbbb| 国产精品一区二区三区美女| 亚洲欧洲午夜一线一品| 精品国产大片大片大片| 极品中文字幕一区| 国产精品国产亚洲伊人久久 | 超碰人人cao| 亚洲开心激情| 日韩av在线不卡| 精品人妻一区二区三区蜜桃视频| 97精品国产| 欧美激情第三页| 免费观看日批视频| 国产一区二区女| 久久综合久久综合这里只有精品| av大片在线播放| 亚洲国产日韩a在线播放| 久久久久久久久久福利| 成人在线视频www| 亚洲激情视频在线| 日本一二三区在线观看| 一区二区三区国产盗摄| 成人激情黄色网| 成人h动漫精品一区二区无码| 久久伊人蜜桃av一区二区| 91手机视频在线| 这里有精品可以观看| 欧美日韩国产123区| 老熟妇精品一区二区三区| 欧美三级伦理在线| 国内精品久久久久影院 日本资源| 特级做a爱片免费69| 国产精品原创巨作av| 欧美美乳视频网站在线观看| 日本三级在线观看网站| 欧美午夜电影一区| 丰满大乳奶做爰ⅹxx视频| 亚洲精品久久久| 国产成人综合精品| 久久资源亚洲| 国产成人手机在线| 亚洲私人黄色宅男| 国产成人综合一区| 欧美午夜18电影| 色综合色综合久久综合频道88| 波多野结衣网站| 波多野结衣在线aⅴ中文字幕不卡| 亚洲国产精品久久久久久女王| gogo久久| 日韩女优电影在线观看| 91成人精品一区二区| 在线视频免费在线观看一区二区| 亚洲一区二区三区视频播放| 最新国产在线观看| 色哟哟一区二区| 精品一区二区视频在线观看| 欧美日本不卡| 147欧美人体大胆444| av女优在线| 欧美性猛交xxxxxx富婆| 在哪里可以看毛片| 久久精品九九| 老司机精品福利在线观看| 福利在线导航136| 欧美成人性福生活免费看| 免费成人深夜夜行网站| 日本系列欧美系列| 欧美性色黄大片人与善| 美脚恋feet久草欧美| 精品视频偷偷看在线观看| 日本熟妇乱子伦xxxx| 成人91在线观看| 18禁免费观看网站| 欧美日韩精品一区二区三区在线观看| 欧美精品国产精品日韩精品| 精品人妻一区二区三区三区四区 | 久久免费视频播放| 国产盗摄视频一区二区三区| 一区二区在线观| 91成人小视频| 久久91超碰青草是什么| 亚洲国产福利视频| 五月激情六月综合| 波多野结衣福利| 日韩精品国产欧美| 亚洲高清123| 国产精品一级在线观看| 久久99国产综合精品女同| 性网爆门事件集合av| 午夜婷婷国产麻豆精品| 丰满少妇在线观看资源站| 日韩av成人高清| 天天做天天爱天天高潮| 超碰成人免费| 日本a级片电影一区二区| 国产小视频在线| 欧美人妖巨大在线| 久久99久久久| 久久综合国产精品| mm131国产精品| 欧美精选在线| 久久亚洲国产精品日日av夜夜| 欧洲av不卡| 久久综合久久美利坚合众国| 欧美性猛交 xxxx| 色天天综合久久久久综合片| 久草手机视频在线观看| 成人晚上爱看视频| 在线观看av日韩| 欧美日韩国产在线一区| 久久偷看各类wc女厕嘘嘘偷窃 | 黄色工厂这里只有精品| 欧美亚洲精品日韩| 国产一区二区三区视频在线| 97免费中文视频在线观看| 成人三级黄色免费网站| 亚洲精品一线二线三线| 无码人妻精品一区二| 亚洲免费观看高清完整版在线 | 中文字幕在线观看一区二区| 色悠悠在线视频| 免费成人在线影院| 91成人在线观看喷潮教学| 久久精品国产亚洲夜色av网站| 国产精品一区二区三区在线| 日本午夜精品久久久久| 66m—66摸成人免费视频| 麻豆tv入口在线看| 亚洲女人被黑人巨大进入| 精品久久在线观看| 欧美日韩中文国产| 久久夜靖品2区| 亚洲免费观看视频| 亚洲天堂av中文字幕| 99精品视频一区| 搡的我好爽在线观看免费视频| 性感少妇一区| 国产a级片网站| 一区二区三区在线| 亚洲高清在线观看一区| 亚洲日产av中文字幕| 国产精品日韩欧美一区二区| 狠狠久久伊人中文字幕| 青草成人免费视频| 国产美女精品写真福利视频| 美女撒尿一区二区三区| 求av网址在线观看| 社区色欧美激情 | 日本v片在线免费观看| 欧美成人综合网站| a级片在线视频| 欧美日韩免费在线视频| 欧美日韩a v| 欧美日韩一区二区在线| 久久久久久久久精| 亚洲久草在线视频| 婷婷伊人五月天| 亚洲三级免费观看| 国产精品视频看看| 国产精品久久久一本精品 | 国产中文字幕一区二区三区| 精品视频免费观看| 日韩中出av| 玛丽玛丽电影原版免费观看1977| 国产区精品视频在线观看豆花| 91在线免费看片| 国产一区二区三区亚洲综合| 亚洲精品免费网站| 视频一区在线| 亚洲自拍偷拍色图| 日韩精品成人| 999精品在线观看| av成人资源| 国产综合动作在线观看| 欧美一级全黄| 欧美一区二视频在线免费观看| 久久99视频| 日韩一区二区三区资源| 色婷婷亚洲mv天堂mv在影片| 亚洲一区二区在线看| 亚洲高清资源在线观看| 美女在线免费视频| 激情婷婷久久| 2022亚洲天堂| 免费av成人在线| 午夜视频在线观| 成人午夜精品在线| 亚洲最大成人网站| 国产精品久久福利| 久久久全国免费视频| 偷窥少妇高潮呻吟av久久免费| 日本中文字幕在线| 欧美日韩小视频| www.欧美国产| 日韩成人在线免费观看| 国产日本在线| 欧美成人精品一区| 日韩伦理精品| 成人免费xxxxx在线观看| 综合欧美亚洲| 欧美一级爽aaaaa大片| 色综合天天爱| 国产精品久久..4399| 日本中文一区二区三区| 婷婷激情综合五月天| 国产91对白在线观看九色| 国产精品亚洲无码| 亚洲啪啪综合av一区二区三区| 在线看成人av| 在线中文字幕一区| 亚洲av永久纯肉无码精品动漫| 亚洲成人久久电影| 91caoporm在线视频| 国内精品久久久久| 欧美成人福利| 久久日韩精品| 欧美三级黄美女| 国产一区二区在线免费播放| 成人午夜免费视频| 美国精品一区二区| 精品福利在线视频| 国产乱码精品一区二区| 精品呦交小u女在线| 中文字幕免费高清电视剧网站在线观看| 国模视频一区二区三区| 国产免费av国片精品草莓男男| 精品一区二区国产| 婷婷综合社区| 国产一区视频免费观看| 成人国产精品免费网站| 日韩在线不卡av| 色琪琪一区二区三区亚洲区| 亚洲第一天堂影院| 日韩一区二区欧美| se01亚洲视频| 精品国产一区二区三区日日嗨| 一区二区影视| 国产一伦一伦一伦| 久久久午夜精品| 在线观看国产亚洲| 日韩精品专区在线影院观看| 日本www在线观看| 国产精品久久99久久| 亚洲区小说区图片区qvod| 国产资源在线免费观看| 国内欧美视频一区二区| 在线观看免费黄色网址| 一本大道av一区二区在线播放| 欧美一级特黄aaaaaa| 精品少妇v888av| 91精品麻豆| 伊人久久av导航| 麻豆久久一区二区| 国产高清一区二区三区四区| 红桃av永久久久| 天堂网av2014| 久久久久久亚洲精品中文字幕| 日本伊人久久| 真人做人试看60分钟免费| 精品一区二区在线看| 小泽玛利亚一区| 欧美三级电影网| 91大神xh98hx在线播放| 国产精品视频久久久| 国产乱码精品一区二区三区四区 | 日本特黄久久久高潮 | 亚洲嫩草精品久久| 国产精品乱码一区二区| xxx欧美精品| 国产亚洲精aa在线看| 最新黄色av网站| 国产乱码精品一品二品| 欧美黄片一区二区三区| 欧美一区二区精品在线| 性xxxxfjsxxxxx欧美| 国产精品美女诱惑| 亚洲少妇自拍| 无码一区二区三区在线| 欧美日韩国产综合草草| 麻豆av在线免费看| 91中文字精品一区二区| 日韩一区二区免费看| 中文幕无线码中文字蜜桃| 在线观看亚洲精品| 麻豆传媒在线完整视频| 亚洲一区久久久| 国产视频一区免费看| 99久久久无码国产精品性| 欧美美女喷水视频| 在线看女人毛片| 国产欧美日韩伦理| 久久国产主播| 日本一级片免费| 亚洲大胆美女视频| 91看片一区| 97超碰人人爱| 99久久久精品| 中文字幕在线网站| 欧美精品久久久久a| 要久久电视剧全集免费| 在线免费视频一区| 亚洲一区二区三区中文字幕| 性感美女福利视频| 国产日韩精品在线观看| 黄色亚洲精品| av手机在线播放| 91精品国产一区二区| 天堂电影一区| 一区二区三区不卡在线| 丁香六月综合激情| 亚洲大片免费观看| 欧美成人免费va影院高清| 国产精品丝袜在线播放| 国产又黄又猛又粗| 亚洲一区二区欧美日韩| 国产黄在线观看| 9a蜜桃久久久久久免费| 水野朝阳av一区二区三区| 欧美精品久久久久久久久46p| 亚洲黄色在线看| 精品国产亚洲一区二区三区在线| aaa毛片在线观看| 一区二区成人在线|