MySQL 第六篇:索引与子查询

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 我把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或者一个特殊的值或者空字符串来代替。

六、索引的优缺点

  • 优点:加快查询速度
  • 缺点:降低增 改 删的速度,增大了表的文件大小
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
12天前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
2月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
2月前
|
存储 NoSQL 关系型数据库
为什么MySQL不使用红黑树做索引
本文详细探讨了MySQL索引机制,解释了为何添加索引能提升查询效率。索引如同数据库的“目录”,在数据量庞大时提高查询速度。文中介绍了常见索引数据结构:哈希表、有序数组和搜索树(包括二叉树、平衡二叉树、红黑树、B-树和B+树)。重点分析了B+树在MyISAM和InnoDB引擎中的应用,并讨论了聚簇索引、非聚簇索引、联合索引及最左前缀原则。最后,还介绍了LSM-Tree在高频写入场景下的优势。通过对比多种数据结构,帮助理解不同场景下的索引选择。
88 6
|
2月前
|
SQL 关系型数据库 MySQL
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
117 0
案例剖析:MySQL唯一索引并发插入导致死锁!
|
2月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
64 3
Mysql(4)—数据库索引
|
25天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
133 1
|
2月前
|
存储 关系型数据库 MySQL
如何在MySQL中进行索引的创建和管理?
【10月更文挑战第16天】如何在MySQL中进行索引的创建和管理?
70 1
|
26天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
56 0
|
2月前
|
监控 关系型数据库 MySQL
MySQL数据表索引命名规范
MySQL数据表索引命名规范
75 1
|
2月前
|
存储 SQL 关系型数据库
mysql中主键索引和联合索引的原理与区别
本文详细介绍了MySQL中的主键索引和联合索引原理及其区别。主键索引按主键值排序,叶节点仅存储数据区,而索引页则存储索引和指向数据域的指针。联合索引由多个字段组成,遵循最左前缀原则,可提高查询效率。文章还探讨了索引扫描原理、索引失效情况及设计原则,并对比了InnoDB与MyISAM存储引擎中聚簇索引和非聚簇索引的特点。对于优化MySQL性能具有参考价值。
下一篇
无影云桌面