IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL——关联查询优化 -> 正文阅读

[大数据]MySQL——关联查询优化

MySQL——关联查询优化

1、数据准备

建表

create table if not exists type
(
    id   int(10) unsigned not null auto_increment,
    card int(10) unsigned not null,
    primary key (id)
);

create table if not exists book
(
    bookid int(10) unsigned not null auto_increment,
    card   int(10) unsigned not null,
    primary key (bookid)
);

2、外连接

sql查询分析:type表为驱动表,book表为被驱动表,进行左连接,可以看到,两张表的type类型都是全表扫描

mysql> explain select * from type left join book on type.card = book.card;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                              |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
|  1 | SIMPLE      | type  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   20 |   100.00 | NULL                                               |
|  1 | SIMPLE      | book  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   20 |   100.00 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)

给被驱动表book建立索引:

create index idx_book_card on book(card);

sql查询分析:被驱动表type类型为ref,在被驱动表上建立索引,效率会有很大的提升

mysql> explain select * from type left join book on type.card = book.card;
+----+-------------+-------+------------+------+---------------+---------------+---------+-------------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key           | key_len | ref               | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------------------+------+----------+-------------+
|  1 | SIMPLE      | type  | NULL       | ALL  | NULL          | NULL          | NULL    | NULL              |   20 |   100.00 | NULL        |
|  1 | SIMPLE      | book  | NULL       | ref  | idx_book_card | idx_book_card | 4       | testdb1.type.card |    1 |   100.00 | Using index |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------------------+------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)

给驱动表type加上也索引:

create index idx_type_card on type(card);

sql查询分析:驱动表和被驱动表都用上了索引,等值条件的类型要相同

mysql> explain select * from type left join book on type.card = book.card;
+----+-------------+-------+------------+-------+---------------+---------------+---------+-------------------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key           | key_len | ref               | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------------+---------+-------------------+------+----------+-------------+
|  1 | SIMPLE      | type  | NULL       | index | NULL          | idx_type_card | 4       | NULL              |   20 |   100.00 | Using index |
|  1 | SIMPLE      | book  | NULL       | ref   | idx_book_card | idx_book_card | 4       | testdb1.type.card |    1 |   100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+---------------+---------+-------------------+------+----------+-------------+
2 rows in set, 1 warning (0.01 sec)

3、内连接

sql查询分析:两张表都是全表扫描,MySQL自动选择驱动表

mysql> explain select * from type inner join book on type.card = book.card;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                              |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
|  1 | SIMPLE      | type  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   20 |   100.00 | NULL                                               |
|  1 | SIMPLE      | book  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   20 |    10.00 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)

给被驱动表book建立索引:

create index idx_book_card on book(card);

sql查询分析:

mysql> explain select * from type inner join book on type.card = book.card;
+----+-------------+-------+------------+------+---------------+---------------+---------+-------------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key           | key_len | ref               | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------------------+------+----------+-------------+
|  1 | SIMPLE      | type  | NULL       | ALL  | NULL          | NULL          | NULL    | NULL              |   20 |   100.00 | NULL        |
|  1 | SIMPLE      | book  | NULL       | ref  | idx_book_card | idx_book_card | 4       | testdb1.type.card |    1 |   100.00 | Using index |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------------------+------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)

给驱动表type加上索引:

create index idx_type_card on type(card);

sql查询分析:发现 查询优化器把book作为了驱动表,type作为被驱动表

mysql> explain select * from type inner join book on type.card = book.card;
+----+-------------+-------+------------+-------+---------------+---------------+---------+-------------------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key           | key_len | ref               | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------------+---------+-------------------+------+----------+-------------+
|  1 | SIMPLE      | book  | NULL       | index | idx_book_card | idx_book_card | 4       | NULL              |   20 |   100.00 | Using index |
|  1 | SIMPLE      | type  | NULL       | ref   | idx_type_card | idx_type_card | 4       | testdb1.book.card |    1 |   100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+---------------+---------+-------------------+------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)

注:如果等值条件中只有一个字段有索引的情况,那么查询优化器会把有索引字段的表作为被驱动表

4、小结

  • 小结果集驱动大结果集(本质就是减少外层循环的数据数量)
  • 为被驱动表匹配的字段条件增加索引(减少被驱动表的循环匹配次数)
  • 增大 join buffer size的大小,驱动表能不能一次加载完,要看join buffer能不能存储所有的数据,默认情况下join_buffer_size=256k。驱动表一次加载的数据越多,被驱动表的扫表次数就越少。
  • 减少驱动表不必要的字段查询
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:08:12  更:2022-03-06 13:11:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:08:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码