MySQL相关问题-2

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL DuckDB 分析主实例,集群系列 8核16GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL索引包括主键索引、唯一索引和组合索引。主键索引唯一且非空,一个表仅有一个;唯一索引允许NULL值,可创建多个;组合索引需遵循左前缀原则,否则失效。回表查询是指通过非聚簇索引查到主键后再查询完整数据,适用于查询字段超出索引列和主键的情况。左前缀原则源于B+Tree结构,确保查询条件按复合索引列顺序使用,否则索引失效。

Q:MySQL的索引有哪些

1.主键索引

  • 唯一标识表中的一行数据,不允许 NULL 值。
  • 一个表只能有一个主键。
  • InnoDB 存储引擎中,主键索引直接存储整行数据(聚簇索引)。
CREATE TABLE users (
    id INT PRIMARY KEY,  -- 声明主键
    name VARCHAR(50));

2.唯一索引

  • 保证索引列的值唯一,但允许 NULL 值(多个 NULL 不冲突)。
  • 可创建多个唯一索引。
CREATE UNIQUE INDEX idx_email ON users(email);

3.组合索引

  • 索引会按照定义的列顺序依次使用,若查询条件未包含最左侧的列,则索引失效




Q:回表查询

回表查询:回标查询就是查询时先通过索引查到对应的主键值,然后通过主键值来查询整条数据。但不是说所有的非聚簇索引查询都会使用回表查询。只有我需要查询的字段不止查询的条件字段及主键时才会触发回表查询

意思是如果我通过Name这个字段进行查找,如下第一行sql所示,如果我的表只需要id,Name的话是不会进行回表查询的

select id,Name from biao where Name = 'zhangsan'          //只查询了id(主键),Name字段
select * from biao where Name = 'zhangsan'               //查询了除id,Name字段

在第三行,查询所有字段,此时就会触发回表查询

  • 优点:利用索引快速定位数据,避免全表扫描。
  • 缺点:
  • 多次随机 I/O:若查询结果集较大,回表操作会导致大量随机磁盘访问(每次回表可能跨页)。



Q:什么是左前缀原则

左前缀原则就是说在执行查询时,条件字段的顺序必须与复合索引创建时列的字段的顺序一致,这就是遵循了左前缀原则,就可以利用复合索引,如果在使用复合索引时,不遵从左前缀原则,这个复合索引就会失效


扩展:为什么需要左前缀原则?

因为B+Tree的存储结构决定了查询方式,以(a,b,c)复合索引来举个例的话就是

1.先按a排序

2.当a相同时,按b排序

3.当a和b都相同时,按c排序

如果在2,3中的查询条件中不包含a的话,数据库无法快速定位到数据的起始位置,可能会导致全索引扫描或者全表扫描

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
存储 Cloud Native API
oss云网关配置
配置阿里云OSS与云网关实现灵活数据传输和访问控制。步骤包括开通OSS服务,创建Bucket,获取访问凭证,可选配置CORS和生命周期规则。云网关配置涉及阿里云云原生网关的代理规则设定或使用云存储网关集成OSS访问,具体配置需参照产品文档,因产品更新可能会有变动。
795 1
|
Java 存储
线程池的核心参数有哪些?
线程池七大核心参数:核心/最大线程数、线程保持时间及单位、阻塞队列、线程工厂与拒绝策略。
762 79
|
5月前
|
SQL 缓存 Java
MyBatis场景面试题
MyBatis与MyBatisPlus均属ORM框架,前者擅长复杂SQL及动态查询,后者封装API简化单表操作。常用XML标签如if、foreach提升SQL灵活性。MyBatis支持一级(SqlSession级)与二级(NameSpace级)缓存,提升查询效率。#{}防SQL注入,${}用于动态表名等场景。
280 62
|
11月前
|
存储 设计模式 Java
探索 JavaBean(实体类)的奇妙世界
JavaBean(实体类)是Java开发中的重要概念,遵循特定设计模式的普通Java类。
671 13
|
5月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
140 2
|
5月前
什么是AOP
AOP(面向切面编程)是一种编程范式,旨在将横切关注点(如日志、事务管理)从业务逻辑中分离,提升代码模块化与可维护性。核心概念包括:切面(封装横切逻辑)、通知(定义执行时机)、切入点(指定应用位置)、织入(整合切面与业务逻辑)。常见通知类型有前置、后置、返回、异常和环绕通知。
377 1
|
前端开发 JavaScript Java
java常用数据判空、比较和类型转换
本文介绍了Java开发中常见的数据处理技巧,包括数据判空、数据比较和类型转换。详细讲解了字符串、Integer、对象、List、Map、Set及数组的判空方法,推荐使用工具类如StringUtils、Objects等。同时,讨论了基本数据类型与引用数据类型的比较方法,以及自动类型转换和强制类型转换的规则。最后,提供了数值类型与字符串互相转换的具体示例。
661 3
|
5月前
|
存储 算法 索引
HashMap的实现原理
HashMap基于哈希算法实现,采用链表散列结构(数组+链表/红黑树)。JDK1.8前使用拉链法解决冲突,将冲突元素存入链表。JDK1.8后,当链表长度超过8时,转化为红黑树以提升查找效率;当元素数小于6时,退化为链表。通过key的hashCode计算索引,put时若key相同则覆盖,不同则添加到链表或树中。get时通过hash值定位并判断key获取对应值。
282 0
|
5月前
|
Java Spring 容器
DI依赖注入的几种手段
本内容介绍了依赖注入的四种方式:构造器注入、接口注入、Setter注入和注解注入,并重点比较了Spring中的@Autowired与Java标准注解@Resource的区别,包括来源和依赖查找策略。
288 0
|
5月前
|
前端开发 Java Spring
SpringMvC的执行流程
客户端发送HTTP请求,Spring MVC的前端控制器DispatcherServlet接收请求并调用HandlerMapper进行映射,返回包含Controller和拦截器的执行链。控制器执行逻辑后返回ModelAndView,前端控制器再调用ViewResolver解析视图并渲染HTML页面,最终返回给客户端。
255 0