当前位置: 首页 > news >正文

MySQL数据库面试题整理

JDBC配置MySQL的具体流程

1.MySQL服务启动

  • 1.从官网下载并安装MySQL Server: 本地机器安装/linux安装
  • 2.启动MySQL服务:net start MySQL80 停止:net stop MySQL80
  • 3.通过sudo ss -tlnp | grep 3306查看MySQL是否正确监听在3306端口

2.JDBC配置并获取数据库连接

  • 1.下载MySQL的驱动:`mysql-connector-java-8.0.36.jar``

  • 2.添加到项目中:

    • 方式一:手动导入,放到lib文件夹下,并将lib文件夹添加为库使用
    • 方式二:通过maven,在pom.xml中添加MySQL对应的依赖:mysql-connector-java,maven会自动从中央仓库下载并管理该依赖
  • 3.创建连接:创建连接时需要传入数据库连接的参数:比如访问数据库的url、用户名、用户密码

    • 方式一:通过添加静态变量来设置
    • 方式二:通过配置文件,在配置文件中指定对应字段并赋值,在配置参数时引入该配置文件并配置参数为字段名即可
  • 4.使用驱动提供的API:DiverManager.getConnection(url, username, password)获取到一个数据库的连接

  • 5.关闭连接:一定要及时释放资源,避免内存泄漏

3.定义sql语句完成数据的增删改查

  • 使用PreparedStatement相当于预封装了一些简单的sql,可以直接套用
  • 如果需要完成更加复杂的增删改查就需要自己另外定义sql语句
import java.sql.Connection;
import java.sql.PreparedStatement;public class InsertExample {public static void main(String[] args) {String sql = "INSERT INTO users(name, age) VALUES(?, ?)";try (Connection conn = DBUtil.getConnection();PreparedStatement ps = conn.prepareStatement(sql)) {ps.setString(1, "Alice");ps.setInt(2, 20);int rows = ps.executeUpdate();System.out.println("插入成功,受影响行数:" + rows);} catch (Exception e) {e.printStackTrace();}}
}

JDBC中使用PreparedStatement有什么优势?

PreparedStatement实质上是将输入数据作为参数传入SQL语句中,对输入数据中的特殊字符进行了转义

优势:

  • 1.可以防止SQL注入
  • 2.预编译SQL,提高相同模板下的效率
    在这里插入图片描述
预编译SQL(在创建PreparedStatement时就已经编译好了SQL模板)

正常的JDBC流程:

  • 1.在Java中编写SQL语句,传入到MySQL中
  • 2.在MySQL中需要对Java中编写的SQL语句进行语法检查
  • 3.语法检查通过之后需要编译SQL,将SQL编译成可执行的函数
  • 4.执行SQL

当需要使用相同结构的SQL对不同输入数据的查询时,每次都要执行上述流程。

而使用PreparedStatement之后:

  • 1.在Java中编写SQL语句,传入到MySQL中
  • 2.在MySQL中需要对Java中编写的SQL语句进行语法检查
  • 3.语法检查通过之后需要编译SQL,将SQL编译成可执行的函数
  • 4.传入参数
  • 5.执行SQL
    这样当输入不同数据时,相同模板下的SQL就无需再次编译,只需要通过setXxx()方法传入参数,即可执行SQL

MySQL中索引失效的情况有哪些?

  • 1.聚合索引没有符合最左前缀法则
    • 如果查询条件的第一个不是联合索引最左侧的索引字段,会导致全部索引都失效,走全表扫描
    • 如果中间跳过联合索引的中间某一个索引列,会导致后面的它后面的索引失效(部分索引失效)
    • 联合索引中出现范围查询时,会导致范围查询右侧的列索引失效
  • 2.对建立索引的字段进行了运算,会导致索引失效
  • 3.索引列进行了前段模糊匹配:%xxx会导致索引失效,后段模糊匹配则不会:xx%
  • 4.字符串类型的索引列查询时没有加'',会导致对应索引失效:name = 张三
  • 5.使用or连接的前后两个条件中的字段都需要有索引,如果一侧没有索引,则会导致另外一边的索引也失效:xxx or xxxx
  • 6.数据分布影响:如果MySQL评估使用索引查询比全表扫描还要慢,则不会使用到索引

失效演示:

  • 1.如果不添加最左侧的索引,则会发生索引失效,走全表扫描:
    在这里插入图片描述中间跳过某个索引时,会出现部分索引失效,只使用了profession的索引

在这里插入图片描述

只要出现最左侧索引即可,更查询顺序无关。

联合索引中使用范围查询(<,>)的,范围查询右侧的列索引失效
在这里插入图片描述
在这里插入图片描述

  • 2.当对phone字段进行截取匹配时,会导致phone字段原本的索引失效:
    在这里插入图片描述
  • 3.使用尾部模糊匹配查询名字为like '软件%',仍能够使用name字段的索引,而使用头部模糊匹配查询名字为like '%工程'时,走的是全表扫描,无法使用name字段的索引:
    在这里插入图片描述
  • 4.status字段为String类型,当查询时没有加''时,可以查询到数据,但是无法使用status字段的索引:
    在这里插入图片描述
  • 5.phone和status都建立了索引,而当使用or连接时,由于age没有索引,导致在or另外一侧的phone和status字段的索引都无法使用:
    在这里插入图片描述
  • 6.查询phone大于某一个值的数据时,由于MySQL判断根据当前条件查询的数据较多时(表中绝大多数数据都是满足条件时),会直接走全表扫描,而当根据查询条件判断查询的数据占表中的数据较少时,则会走索引:
    在这里插入图片描述

MySQL中有哪些索引?

  • 1.按结构分:
    • BTree索引:MySQL默认索引
    • Hash索引:基于哈希表,等值查询,不支持范围
    • R-Tree索引:支持空间索引,MyISAM常用
  • 2.按涉及的列数分:
    • 单列索引:只涉及一个字段
    • 联合索引:一个索引包含多个列,遵循最左前缀法则
  • 3.按物理存储方式分:
    • 聚集索引:叶子节点存储数据,(InnoDB中主键索引就是聚集索引)(必须有,只能有一个)
    • 非聚集索引:索引和数据分开存储,每次查询需要根据索引定位,再回表查询数据
  • 4.按功能分:
    • 主键索引:每个表只能有一个,唯一并且不允许null(默认是聚集索引)
    • 唯一索引:唯一,可以包含null,可以多个
    • 全文索引:用户全文搜索
    • 空间索引:用于空间数据类型,常用于地理位置相关的范围查询

文章转载自:

http://Vh4qX0Y2.gjqwt.cn
http://W0QhRjBo.gjqwt.cn
http://1oR3ufcE.gjqwt.cn
http://N9Jmtcwv.gjqwt.cn
http://0vDxKm91.gjqwt.cn
http://5EuOcr2Z.gjqwt.cn
http://WfNuqq7k.gjqwt.cn
http://HDBjpa4J.gjqwt.cn
http://u72KuYuP.gjqwt.cn
http://azX7e1Z6.gjqwt.cn
http://aXxco4xs.gjqwt.cn
http://pkOZH3X3.gjqwt.cn
http://xuuEhfqf.gjqwt.cn
http://WSWKE6Wg.gjqwt.cn
http://Sora9mAJ.gjqwt.cn
http://LsUOVSt0.gjqwt.cn
http://eEZtMT1t.gjqwt.cn
http://XRhmv5O9.gjqwt.cn
http://ia7KPvb1.gjqwt.cn
http://5tQSahKi.gjqwt.cn
http://nUyI6GFl.gjqwt.cn
http://kj1zFQfA.gjqwt.cn
http://aBgriIgy.gjqwt.cn
http://dPurMVzW.gjqwt.cn
http://F7t7iQ9b.gjqwt.cn
http://0jWrV3kE.gjqwt.cn
http://ArqzQlMM.gjqwt.cn
http://knqM46YL.gjqwt.cn
http://9waHDY8O.gjqwt.cn
http://mvLmS0eE.gjqwt.cn
http://www.dtcms.com/a/375663.html

相关文章:

  • PostgreSQL 大对象管理指南:pg_largeobject 从原理到实践
  • 传统项目管理的局限性有哪些
  • 内核函数:copy_process
  • 《UE5_C++多人TPS完整教程》学习笔记50 ——《P51 多人游戏中的俯仰角(Pitch in Multiplayer)》
  • RL【5】:Monte Carlo Learning
  • 深度解析HTTPS:从加密原理到SSL/TLS的演进之路
  • minio 文件批量下载
  • 【算法专题训练】19、哈希表
  • AJAX入门-URL、参数查询、案例查询
  • 安装ultralytics
  • Eino ChatModel 组件指南摘要
  • 腾讯codebuddy-cli重磅上线-国内首家支持全形态AI编程工具!
  • 基于PCL(Point Cloud Library)的点云高效处理方法
  • UVa1302/LA2417 Gnome Tetravex
  • STC Link1D电脑端口无法识别之升级固件
  • 【C++】LLVM-mingw + VSCode:Windows 开发攻略
  • SRM系统有哪些核心功能?企业该如何科学选型?
  • LINUX99 centos8:网络 yum配置;shell:while [ $i -ne 5 ];do let i++ done
  • 【陇剑杯2025】密码复现(部分)
  • 漫谈《数字图像处理》之图像自适应阈值处理
  • Melon: 基于marker基因的三代宏基因组分类和定量软件
  • 水题记录1.7
  • JVM 执行引擎详解!
  • lua中 string.match返回值
  • 2025-安装集成环境XAMPP
  • 整体设计 之 绪 思维导图引擎 :思维价值链分层评估的 思维引导和提示词导航 之 引 认知系统 之6之 序 认知元架构 之1(豆包助手 之3)
  • 【教学类-07-10】20250909中3班破译电话号码(手写数字版、撕贴版、头像剪贴底纹版、抄写填空版)
  • 【初阶数据结构】算法复杂度
  • PowerBI 的双隐藏,我在QuickBI 里也找到了
  • AI赋能训诂学:解码古籍智能新纪元