在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

mysql关联查询如何优化

120次阅读
没有评论

共计 4323 个字符,预计需要花费 11 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下 mysql 关联查询如何优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

mysql 中任何关联查询都是 nest loop(嵌套循环)操作,nest loop 是在驱动表中取出一条数据,然后从被驱动表中逐行比较,把符合规则的放入结果集中,然后再取下一行,依次循环,驱动表每返回一行,被驱动表就要扫描一次。
针对 nest loop 关联机制需要从下面几个方面着手优化:
1、减少 nest loop 循环次数,使用小结果集做驱动表,驱动大结果集。
2、被驱动表每次循环都要被扫描,所以要求关联键上一定要有索引,而且选择性要好。
3、如果第二条无法满足,可以通过调 join_buffer_size 来设置 join buffer 的大小,不过还是建议添加索引而不是纯粹的加大 join_buffer_size

接下来通过下面的实验来了解 mysql 的 nest loop
实验环境:Percona server5.6.27     大表 bill、小表 user,表上均有索引
mysql select count(*) from bill;
+———-+
| count(*) |
+———-+
|  1966789 |
+———-+

mysql select count(*) from user_tmp;
+———-+
| count(*) |
+———-+
|    36317 |
+———-+
一、执行计划:
mysql explain select a.user_id,b.loan_info_id from bill b left JOIN user_tmp a  on a.user_id=b.user_id;
+—-+————-+——-+——–+—————+———+———+—————+———+————-+
| id | select_type | table | type   | possible_keys | key     | key_len | ref           | rows    | Extra       |
+—-+————-+——-+——–+—————+———+———+—————+———+————-+
|  1 | SIMPLE      | b     | ALL    | NULL          | NULL    | NULL    | NULL          | 1912096 | NULL        |
|  1 | SIMPLE      | a     | eq_ref | PRIMARY  | PRIMARY | 194     | CDM.b.user_id |       1 | Using index |
+—-+————-+——-+——–+—————+———+———+—————+———+————-+

左连接左表不管有多大总是驱动表,右表总是被驱动表

mysql explain select a.user_id,b.loan_info_id from bill b INNER JOIN user_tmp a  on a.user_id=b.user_id;
+—-+————-+——-+——-+——————————+——————————+———+—————+——-+————-+
| id | select_type | table | type  | possible_keys                | key                          | key_len | ref           | rows  | Extra       |
+—-+————-+——-+——-+——————————+——————————+———+—————+——-+————-+
|  1 | SIMPLE      | a     | index | PRIMARY                      | PRIMARY                    | 194     | NULL          | 35970 | Using index |
|  1 | SIMPLE      | b     | ref    | in_bill_user_id              | in_bill_user_id              | 194     | CDM.a.user_id |     3 | NULL        |
+—-+————-+——-+——-+——————————+——————————+———+—————+——-+————-+
2 rows in set (0.00 sec)

内连接,mysql 的优化器会根据统计信息自动选择小表 user_tmp 做驱动表,大家可以看到 rows 列值和我们刚开始统计的行数不一致,是因为统计信息和实际是有差异,所以有时候统计信息的不准确会导致执行计划不是最优的。内连接可以用 STRAIGHT_JOIN 按照顺序执行,即指定左表为驱动表

mysql explain select STRAIGHT_JOIN a.user_id,b.loan_info_id from bill b inner JOIN user_tmp a  on a.user_id=b.user_id;
+—-+————-+——-+——–+——————————+———+———+—————+———+————-+
| id | select_type | table | type   | possible_keys                | key     | key_len | ref           | rows    | Extra       |
+—-+————-+——-+——–+——————————+———+———+—————+———+————-+
|  1 | SIMPLE      | b      | ALL    | in_bill_user_id              | NULL    | NULL    | NULL      | 1912096 | NULL        |
|  1 | SIMPLE      | a     | eq_ref | PRIMARY                      | PRIMARY | 194    | CDM.b.user_id |       1 | Using index |
+—-+————-+——-+——–+——————————+———+———+—————+———+————-+
这个时候 mysql 就不会根据统计信息把右边的小表当做驱动表

删除被驱动表 bill 索引
mysql explain select a.user_id,b.loan_info_id from bill b INNER JOIN user_tmp a  on a.user_id=b.user_id;
+—-+————-+——-+——–+—————+———+———+—————+———+————-+
| id | select_type | table | type   | possible_keys | key     | key_len | ref           | rows    | Extra       |
+—-+————-+——-+——–+—————+———+———+—————+———+————-+
|  1 | SIMPLE      | b     | ALL    | NULL          | NULL    | NULL    | NULL          | 1905575 | NULL        |
|  1 | SIMPLE      | a     | eq_ref | PRIMARY   | PRIMARY | 194     | CDM.b.user_id |       1 | Using index |
+—-+————-+——-+——–+—————+———+———+—————+———+————-+
mysql 优化器是基于成本的,bill 没有了索引,那么就要扫描 35970 次 bill 全表,成本高于扫描 1905575 次 user_tmp 索引,所以又改变了执行计划,变成了把大表做驱动表,进而降低了查询效率

二、执行效率(关联键都有索引):
当小表是驱动表的时候
mysql select a.user_id,b.loan_info_id from bill b INNER JOIN user_tmp a  on a.user_id=b.user_id;
这里结果集有几万条,省略
耗时:0.202s
使用 STRAIGHT_JOIN 强制大表是驱动表的时候
mysql select STRAIGHT_JOIN a.user_id,b.loan_info_id from bill b INNER JOIN user_tmp a  on a.user_id=b.user_id
耗时:5.260s
由于两张表的相差几十倍,两种执行计划的效率也是显而易见的
注:如果大表的关联键索引选择性比较差(如重复数据多等),每次循环扫太多了,不如让大表做驱动表,上述实验是在大表的索引选择性好的情况下得出的结果

以上是“mysql 关联查询如何优化”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-27发表,共计4323字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 18禁真人抽搐一进一出免费 | 男人的天堂在线视频 | 在线成人国产 | 成人淫片免费视频95视频 | 日本高清在线观看天码888 | 999久久| 精品国产av色一区二区深夜久久 | 日韩小视频在线 | 真人与拘做受免费视频 | 青青青久热国产精品视频 | 日韩精品久久无码人妻中文字幕 | 久久久久久国产视频 | 亚洲一区二区三区播放 | 亚洲av无码之国产精品网址蜜芽 | 欧美啊v在线| 最美女人体内射精一区二区 | 久久国产自偷自免费一区100 | 日韩精品久久久久久免费 | 日韩一本之道一区中文字幕 | 激情欧美一区二区三区 | 欧美a级毛欧美1级a大片 | 成人小说亚洲一区二区三区 | 国产男女猛烈无遮挡免费网站 | 啪啪免费网 | 欧美精品中文字幕亚洲专区 | 精品一区二区三区高清免费不卡 | 天天干天天操天天摸 | 中文字幕欧美日韩高清 | 久操久操久操 | 国产精品v欧美精品v日韩精品 | 日本久久视频 | 中文字幕网伦射乱中文 | 日本-区二区三区免费精品 日本全黄录像视频 | 久久精品影院一区二区三区 | 97久久人人超碰国产精品 | 成人免费a视频 | 一级毛片大全 | 国产亚洲精品久久久久四川人 | 黄色美女在线观看 | 亚洲精品无码成人片久久不卡 | 熟妇高潮精品一区二区三区 |