前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL连接查询&索引介绍

MySQL连接查询&索引介绍

作者头像
贪挽懒月
发布2021-04-12 17:27:24
2.3K0
发布2021-04-12 17:27:24
举报
文章被收录于专栏:JavaEEJavaEE

一、常见的join查询:

join太多张表,也会导致查询速度变慢。下面就来分析一下join语句。

1. 执行顺序:

我们写一条join查询语句一般都是:

代码语言:javascript
复制
select * from tableA left join tableB on <join condition> where <select condition>

但是MySQL执行的时候,并不是按顺序执行的,MySQL执行sql语句是从from开始执行的,上面这条语句的执行顺序是:

代码语言:javascript
复制
from tableA
on <join condition>
left join tableB
where <select condition>

2. 内连接inner join:

连接查询

如图所示,A和B分别代表两张表,C是它们共同的部分,inner join查出来的就是C,即表A和表B的共同部分。

代码语言:javascript
复制
select * from A inner join B on A.key = B.key

3. 左连接left join:

还是上面那张图,A是左表的独有部分,C是AB的共有部分,left join就是左表的独有加上两表的共有,即左表的全部。所以left join查出来的是A表的全部。

代码语言:javascript
复制
select * from A left join B on A.key = B.key

4. 右连接right join:

右连接就是以右表为主,right join查出来的就是B的全部。

代码语言:javascript
复制
select * from A right join B on A.key = B.key

5. 只查询A的独占部分:

查询A的全部就是左连接,那么查询A独占就是:

代码语言:javascript
复制
select * from A left join B on A.key = B.key where B.key is null;

6. 只查询B的独占部分:

代码语言:javascript
复制
select * from A right join B on A.key = B.key where A.key is null;

7. 全连接:

全连接就是查询 A + B + C,即图中所有部分:

代码语言:javascript
复制
select * from A full outer join B on A.key = B.key;

8. 查询A + B的独占部分,即排除C:

代码语言:javascript
复制
select * from A full outer join B on A.key = B.key where A.key is null or B.key is null;

二、索引

1. 是什么?

简单地说,索引是一种数据结构,帮助sql高效获取数据的一种数据结构,可类比字典的索引,可理解为排好序的快速查找的数据结构。所以索引会影响where后面的条件以及order by排序。

索引图示

比如现在要查找col2为91的这条记录,首先找到34,发现91比它大,往它的右边找,找到89,91还是比它大,继续往89右边找,就找到了91。

一般来说索引本身也很大,不会全部存储在内存中,因此索引往往以索引文件的形式存储在硬盘上。

2. 索引的优势:

  • 提高数据检索效率,降低了数据库的IO成本;
  • 通过索引列队数据进行排序,降低了数据排序的成本,降低了CPU的消耗。

3. 索引的劣势:

  • 索引也要占用空间;
  • 虽然提高了读数据的速度,但是降低了写数据的速度,因为写数据的时候还要维护索引;
  • 索引只是提高效率的一个因素,如果有大量的表,就需花时间研究索引怎么建,才是最优

4. 索引分类:

假如现有一张user表,有id、name、email等字段。

  • 单值索引:就是用一张表的某一个字段做索引,比如:create index idx_user_name on user(name),这就是在name字段上建了一个单值索引。
  • 唯一索引:索引列的值必须唯一,但允许有空值。
  • 复合索引:用表的某几个字段做索引,比如:create index idx_user_nameEmail on user(name, email),表示用name和email这两个字段来建立索引。

那么问题来了,我分别在name和email上建单值索引,和建立一个name和email的复合索引,有什么区别?这两种方式都可以达到效果,但是复合索引的开销更小,因此建一个name和email的复合索引,比在name和email上分别建单值索引更优。

5. 基本语法:

  • 创建:create [unique] index indexName on myTable(columnName(length)); 或者 alter myTable add [unique] index indexName on (columnName(length));
  • 删除:drop index indexName on myTable;
  • 查看:show index from myTable;

6. mysql的索引结构:

MySQL的索引总共有四种,分别是BTree索引、Hash索引、full-text全文索引和R-tree索引,最常用的就是Btree索引。

B树索引

首先从根节点开始,如果比17小,就往p1所指区域找,如果比35大,就往p3所指区域找,如果介于17和35之间,就往p2所指区域找。

7. 哪些情况适合建索引?

  • 主键自动建立唯一索引;
  • 频繁作为查询条件的字段应该建索引;
  • 查询中与其他表关联的字段,应建立外键索引;
  • 频繁更新的字段不应该建立索引;
  • where条件里用不到的字段不应该建索引;
  • 查询中排序的字段应该建立索引;
  • 查询中统计或者分组的字段应该建立索引。

8. 哪些情况不适合建索引:

  • 记录太少的表不适合建索引;
  • 经常增删改的表不适合建索引;
  • 如果某个列的数据很多重复的内容,比如表示状态的status列,不是0就是1,这样的就没必要建索引;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、常见的join查询:
  • 二、索引
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档