MySQL 第六篇:索引与子查询

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 我把MySQL的内容整理成9篇博客,学完这9篇博客虽不能说能成为大神,但是应付一般中小企业的开发已经足够了,有疑问或建议的欢迎留言讨论。子查询子查询,从原有的查询语句中 嵌入新的查询 来得到我们想要的结果,也可称为嵌套查询。

我把MySQL的内容整理成9篇博客,学完这9篇博客虽不能说能成为大神,但是应付一般中小企业的开发已经足够了,有疑问或建议的欢迎留言讨论。

子查询

子查询,从原有的查询语句中 嵌入新的查询 来得到我们想要的结果,也可称为嵌套查询。

一、where 型

1、查询课程名为“Java”的学生信息

-- 使用关联查询实现
SELECT
    s.*
FROM
    students s,
    class c
WHERE
    s.class_id = c.class_id
AND c.class_name = 'JAVA' 

-- 使用子查询实现
SELECT
    *
FROM
    STUDENTS
WHERE
    CLASS_ID = (
        SELECT
            CLASS_ID
        FROM
            CLASS
        WHERE
            CLASS_NAME = 'JAVA'
    )

2、用子查询实现查询出PHP 和 Java的学生

select * from students
where class_id IN(
SELECT
    class_id
FROM
    class
WHERE
    class_name = 'JAVA'
OR class_name = 'PHP'
)

注意:
1、IN 的元素不能超过1000个。
2、in的效率会较低。有时候会用exists代替 in。
3、所有的关联查询都可以转换为子查询。但是并不是所有的子查询都能转化成关联查询。

二、from型

把内层的查询结果集作为临时表 供外层sql再次查询。

SELECT
    s.*, c.class_name
FROM
    (
        SELECT
            *
        FROM
            students
        WHERE
            height > 170
    ) s,
    class c
WHERE
    c.class_id = s.class_id

SELECT
    s.*,(select class_name from class c where c.class_id = s.class_id) 课程名称
FROM
    (
        SELECT
            *
        FROM
            students
        WHERE
            height > 170
    ) s

三、子查询与inert update delete的结合使用

例:

INSERT INTO students (
    s_id,
    s_name,
    age,
    height,
    sex,
    class_id
)
VALUES
    (
        'J1609004',
        '余志坚',
        26,
        175,
        1,
        (
            SELECT
                class_id
            FROM
                class
            WHERE
                class_name = 'JAVA'
        )
    )

将学号为J1609004 的class_id更新成PHP的class_id

UPDATE students
SET class_id = (
    SELECT
        class_id
    FROM
        class
    WHERE
        class_name = 'PHP'
)
WHERE
    s_id = 'J1609004'

索引

数据库索引:数据库管理系统中的一个排序的数据结构,以协助快速查询,更新数据库表中的数据。简单来说,建立了索引后会在数据库里面单独一块区域建立一个小空间,把数据排好序,这样查找起来就快得多。

一、为表添加索引的代价:

  • a.数据库的存储空间的占用
  • b.插入或修改数据的时候要花费较多的时间 - 重新建立索引

二、使用索引的三大原则

  • a.单表数据太少,索引反而会影响速度,数据较少的表不需要建立索引
  • b.数据较多的情况下, where 后的条件、order by 、group by等过滤时,后面的字段最好加上索引,根据实际情况,选择primary key,unique index,索引不是越多越好。
  • c.联合查询,子查询等多表操作时对关联字段加索引。

三、索引类型

1、单字段索引:最常用的索引,只有一个字段,并且不保证字段值的唯一性。

语法:create index 索引名 on 表名(列名)

create index index_name  on students(s_name);

2、唯一索引:可以根据唯一索引确定唯一的一条数据,用于改善性能和保证数据的完整性。

语法:create unique index 索引名 on 表名(列名)

create unique index index_id on students(s_id);

3、组合索引

语法:create index 索引名 on 表名(列名1,列名2.);

create index index_idname on students(s_name,s_id);
SELECT * FROM STUDENTS WHERE S_ID='3' and s_name='小红'

注意:
1、组合索引页可以是唯一索引。
2、当查询条件有组合查询的第一个字段(s_name)的时候就一定会用该索引去查询,无论where后面的查询条件的顺是怎样的,无论有没有其他查询条件。

4、隐含索引:数据库创建对象的时候自动穿件。主键约束 和唯一约束会自动创建索引。

补充:

  • 1、在上例中,如果不存在索引,查找时将会扫描全表的s_name字段。
  • 2、在一张表中可以建立多个所以,但是所以不是越多越好。
  • 3、唯一索引的意思是这个字段的每个值都不一样,可以根据索引值唯一确定一条数据,而其他索引不能根据索引值确定唯一的数据。

四、修改与删除索引

修改语法:alter index 索引名 (生产系统不建议使用索引的修改,数据库执行时无法进行查询操作)
删除语法:drop index 索引名 on 表名

DROP INDEX index_name ON talbe_name;
ALTER TABLE table_name DROP INDEX index_name;

五、建立索引指导原则

1.越小的数据类型越好。
2.简单的数据类型越好,给日期做索引的 使用datetime 。
3.尽量避免使用NULL,指定列为 not null 有空值的列很难进行查询优化。可以使用0或者一个特殊的值或者空字符串来代替。

六、索引的优缺点

  • 优点:加快查询速度
  • 缺点:降低增 改 删的速度,增大了表的文件大小
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
234 66
|
29天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
145 9
|
3月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
12天前
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
70 22
 MySQL秘籍之索引与查询优化实战指南
|
13天前
|
存储 关系型数据库 MySQL
MySQL中为什么要使用索引合并(Index Merge)?
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解索引合并及其在MySQL中的
57 10
|
1月前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
76 18
|
23天前
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
125 5
|
26天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
55 8
|
1月前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
57 7
|
1月前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
87 5