美文网首页数据库
MySQL连接查询&索引介绍

MySQL连接查询&索引介绍

作者: 贪挽懒月 | 来源:发表于2021-04-08 15:18 被阅读0次

一、常见的join查询:

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

1. 执行顺序:

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

select * from tableA left join tableB on <join condition> where <select condition>

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

from tableA
on <join condition>
left join tableB
where <select condition>

2. 内连接inner join:

连接查询

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

select * from A inner join B on A.key = B.key

3. 左连接left join:

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

select * from A left join B on A.key = B.key

4. 右连接right join:

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

select * from A right join B on A.key = B.key

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

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

select * from A left join B on A.key = B.key where B.key is null;

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

select * from A right join B on A.key = B.key where A.key is null;

7. 全连接:

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

select * from A full outer join B on A.key = B.key;

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

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,这样的就没必要建索引;

相关文章

  • MySQL连接查询&索引介绍

    一、常见的join查询: join太多张表,也会导致查询速度变慢。下面就来分析一下join语句。 1. 执行顺序:...

  • 【转】MySQL索引操作命令小结

    MySQL索引操作命令小结 这篇文章主要介绍了MySQL索引操作命令小结,本文讲解了创建索引、查询索引、删除索引等...

  • 高性能的索引策略

    MySQL查询基础-查询执行过程 MySQL聚簇索引 MySQL覆盖索引 MySQL索引扫描排序 MySQL冗余和...

  • MySQL连接查询:左外连接、右外连接、全连接

    昨天介绍了MySQL连接查询中的交叉连接和内连接,今天继续介绍连接查询中的剩下三个连接方法,左外连接、右外连接、全...

  • mysql&redis(面试题记)

    mysql 1、多表连接2、子查询3、索引都有哪些,索引能解决什么问题 ,如何创建索引,建索引有什么原则,索引的底...

  • MySQL连接查询索引优化

    一、单表索引优化 建表: 建一张表,SQL如下: 需求: 查询出 类别id为1 且 评论量大于1的情况下,阅读量最...

  • MySQL explain命令详解

    explain显示了MySQL如何使用索引来处理SELECT语句以及连接表。在分析慢查询时,可以帮助选择更好的索引...

  • SQL优化总结

    一、建立合适的索引 在常用过滤条件、表连接的字段建立索引。但并不是所有索引对查询都有效,MySQL如果扫描数据超过...

  • MySQL索引知多少

    mysql索引 总结关于mysql的索引,查询优化,SQL技巧等 1 索引类型 B-Tree索引 Hash索引 ...

  • MySQL听讲(六)——查询

    说到查询,首先想到了的是索引。本节基于MySQL听讲(三)——索引 的基础来对查询进行展开。 mysql索引选择策...

网友评论

    本文标题:MySQL连接查询&索引介绍

    本文链接:https://www.haomeiwen.com/subject/ykgaaktx.html