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语句
java 复制代码
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,可以多个
    • 全文索引:用户全文搜索
    • 空间索引:用于空间数据类型,常用于地理位置相关的范围查询
相关推荐
迎風吹頭髮3 小时前
UNIX下C语言编程与实践9-UNIX 动态库创建实战:gcc 参数 -fpic、-shared 的作用与动态库生成步骤
c语言·数据库·unix
程序视点3 小时前
MySQL COUNT(*)性能对比:MyISAM为何比InnoDB快?全面解析与优化方案
mysql
黑马金牌编程4 小时前
深入浅出 Redis:从核心原理到运维实战指南一
数据库·redis·缓存·性能优化·非关系型数据库
李迟4 小时前
2025年9月个人工作生活总结
服务器·数据库·生活
野犬寒鸦6 小时前
从零起步学习Redis || 第四章:Cache Aside Pattern(旁路缓存模式)以及优化策略
java·数据库·redis·后端·spring·缓存
白水先森6 小时前
C语言作用域与数组详解
java·数据结构·算法
想唱rap7 小时前
直接选择排序、堆排序、冒泡排序
c语言·数据结构·笔记·算法·新浪微博
茉莉玫瑰花茶7 小时前
Redis - Bitfield 类型
数据库·redis·缓存
lang201509287 小时前
MySQL InnoDB备份恢复全指南
数据库·mysql
爱吃香蕉的阿豪8 小时前
.NET Core 中 System.Text.Json 与 Newtonsoft.Json 深度对比:用法、性能与场景选型
数据库·json·.netcore