Java面试准备-Mysql

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Java面试准备-Mysql

Mysql常用的数据引擎有哪些


InnoDB:行及锁、主要有事务的支持,支持自增长列,支持外健约束,并发能力强。

MyISAM:全表锁、不支持事务、不支持外健,并发性能差,占用空间相对较少。

Memory:全表锁、速度快、存储内存中,重启数据会丢失。

Merge:MyISAM表的组合。

区别:

InnoDB不保存具体的行数,每次需要进行求和,也就是全表扫描、而MyISAM用一变量保存了整个表的行数,执行变量即可读出函数,速度很快。

InnoDB不支持全文索引、而MyISAM支持全文索引,查询效率更高。


数据库事务的特性


ACID:原子性、一致性、隔离性、持久性

原子性(Atomic):要么全部成功、要么全部失败。

一致性(Consistency):事务操作成功后,数据库状态和业务规则保持一致。

隔离性(Isolation):在并发操作时,不同的事务拥有各自的空间,彼此不互相干扰

持久性(Durabiliy):事务超过成功后,所有数据都需持久化到数据库中。


什么是索引


是Mysql高效获取数据的数据算法,通俗的讲:数据库的索引就好比一本书的目录,能够加快数据库表的查询速度。

索引往往是存在于磁盘中的,没有特别说明,默认是B+树结构。


SQL优化手段有哪些


查询不要用 select *

尽量减少子查询,采用联合关联查询

尽量减少not in 等查询效率比较低的查询条件,特别是整表扫描。

尽量避免where条件后面 使用 != <> 操作符,这样会导致全表扫描


简单说下 drop、delete、truncate的区别


drop 删除表、delete、truncate 删除表的数据。


什么是内连接、左连接、右连接


内连接(Inner Join):匹配两张表中相关联的记录

左连接(Left Join):除了匹配两张表相关联的记录外,还会匹配左表中剩余的记录,右表中位匹配到的字段用null表示

右连接(Right Join):除了匹配两张表相关联的记录外,还会匹配右表中剩余的记录


事务隔离级别


InnoDB采用的是可重复读,MVCC 不能解决幻读的问题,使用的是 Next-Key Lock 锁算法,可以规避幻读。


大数据量表该如何优化


限定数据查询范围:比如查询订单的时候,默认查询当天的

读写分离:主负责写、从负责读,根据场景,可以1住多从

垂直分区:根据数据表进行相关拆分,把一张表拆成多张表

水平拆分:保持数据结构不变,通过分片的方式存储到分布式数据库中。

数据库分片两种方式:客户端代理:封装在Jar包中、Sharding-JDBC

中间件代理:在应用和数据库中间加一个代理层,Mycat。


说说Mysql一条查询语句是如何执行的


获取连接:使用mysql连接器

查询缓存:mysql8.0已删除,不建议使用

分析器:分析词法和语法,一般语法错误就在这个地方

优化器:表里有多个索引的时候,决定采用什么索引,或者关联顺序

执行器:执行器判断执行条件,然后进行执行


什么时候不要使用索引


经常增删改的不要简历索引

有大量重复的列不要建立索引

表记录太少不要简历索引


什么是MVCC


多版本并发控制:是一种用来解决读写冲突无锁控制,为每一个修改保存一个版本,在读操作时不用阻塞写操作,在写操作时不用阻塞读操作,避免了脏读和不可重复读。


Mysql中的锁


共享锁:不阻塞,多个用户可以同一时刻读取相同的资源,相互之间没有影响。

排他锁:一个写操作阻塞其他读锁和写锁,这样只允许一个用户进行写入,防止其他用户读取正在写的内容。

表锁:MyISAM就是默认表锁

行锁:容易出现死锁,并发高,InnoDB支持行锁,但必须有索引,不然就是表锁。


什么时候锁会升级


Mysql行锁只能存在于索引上,因为InnoDB把主键和相关的行数据放在B+树的叶节点上面,如果索引不存在,自动升级为表锁

当非唯一索引操作一定数量时,也就是数据的一半时,这个时候索引的消耗会比表锁消耗更多,这个时候行锁自动升级为表锁


怎么避免数据库死锁:


设置锁等待操作时间,及时失败获取,也能退出程序,不至于一直等待导致死锁

保持事务简短,不要过长,减少开销

事务隔离级别顺序执行


使用Mysql索引的时候应该注意什么


查询的时候尽量少用 !=,比较、函数 等,导致索引失效全表扫描

复合索引遵循偏左原则

如果mysql索引扫描比较慢,会升级为全表扫描

列类型是字符串时,必须加引号,不然搜索也会失效

表字段可以为null的,索引是不生效的

like查询 %在前面的是不走索引的,走全表扫描

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
24天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
117 26
|
2月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
83 14
|
2月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
28天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
2月前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
37 6
|
2月前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
55 2
|
Java 数据库 数据库连接
java获取MYSQL5。0中所有数据库中表的列表
        采用JDBC驱动           工具:JBUILDER2006。MYSQL5。0         我查了好几天才成功的,写出来目的是希望大家不要浪费时间,         代码如下:(运行时肯定要自己改改)          public void getTables() {        try {            int i;           
1205 0
|
9天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
11天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。