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,可以多个
    • 全文索引:用户全文搜索
    • 空间索引:用于空间数据类型,常用于地理位置相关的范围查询
相关推荐
luckys.one9 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
言之。10 小时前
Django中的软删除
数据库·django·sqlite
阿里嘎多哈基米12 小时前
SQL 层面行转列
数据库·sql·状态模式·mapper·行转列
抠脚学代码12 小时前
Ubuntu Qt x64平台搭建 arm64 编译套件
数据库·qt·ubuntu
jakeswang12 小时前
全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
数据库·mysql
Heliotrope_Sun12 小时前
Redis
数据库·redis·缓存
一成码农12 小时前
MySQL问题7
数据库·mysql
吃饭最爱13 小时前
JUnit技术的核心和用法
数据库·oracle·sqlserver
专注API从业者13 小时前
Python/Java 代码示例:手把手教程调用 1688 API 获取商品详情实时数据
java·linux·数据库·python