MySQL面试其他问题

⼀条SQL语句在MySQL中如何执⾏的?

一条sql语句是如何执行的

什么是存储过程?有哪些优缺点?

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。

优点:

  • 存储过程是预编译过的,执行效率高。

  • 存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。

  • 安全性高,执行存储过程需要有一定权限的用户。

  • 存储过程可以重复使用,减少数据库开发人员的工作量。

缺点:

  • 调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。

  • 移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。

  • 重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。

  • 如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。

MySQL数据库cpu飙升到500%的话怎么处理?

当 cpu 飙升到 500%时,先用操作系统命令 top 命令观察是不是 mysqld 占用导致的,如果不是,找出占用高的进程,并进行相关处理。

如果是 mysqld 造成的, show processlist,看看里面跑的 session 情况,是不是有消耗资源的 sql 在运行。找出消耗高的 sql,看看执行计划是否准确, index 是否缺失,或者实在是数据量太大造成。

一般来说,肯定要 kill 掉这些线程(同时观察 cpu 使用率是否下降),等进行相应的调整(比如说加索引、改 sql、改内存参数)之后,再重新跑这些 SQL。

也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等

解释⼀下什么是池化设计思想。什么是数据库连接池?为什么需要数据库连接池?

池话设计应该不是一个新名词。我们常见的如java线程池、jdbc连接池、redis连接池等就是这类设计的代表实现。这种设计会初始预设资源,解决的问题就是抵消每次获取资源的消耗,如创建线程的开销,获取远程连接的开销等。就好比你去食堂打饭,打饭的大妈会先把饭盛好几份放那里,你来了就直接拿着饭盒加菜即可,不用再临时又盛饭又打菜,效率就高了。除了初始化资源,池化设计还包括如下这些特征:池子的初始值、池子的活跃值、池子的最大值等,这些特征可以直接映射到java线程池和数据库连接池的成员属性中。——这篇文章对池化设计思想介绍的还不错,直接复制过来,避免重复造轮子了。

数据库连接本质就是一个 socket 的连接。数据库服务端还要维护一些缓存和用户权限信息之类的 所以占用了一些内存。我们可以把数据库连接池是看做是维护的数据库连接的缓存,以便将来需要对数据库的请求时可以重用这些连接。为每个用户打开和维护数据库连接,尤其是对动态数据库驱动的网站应用程序的请求,既昂贵又浪费资源。在连接池中,创建连接后,将其放置在池中,并再次使用它,因此不必建立新的连接。如果使用了所有连接,则会建立一个新连接并将其添加到池中。连接池还减少了用户必须等待建立与数据库的连接的时间。

MySQL自增主键用完了怎么办?

【原创】杂谈自增主键用完了怎么办

⼀条SQL语句执⾏得很慢的原因有哪些?

https://www.cnblogs.com/kubidemanong/p/10734045.html

MySQL创建表时可以设置多个主键吗?

主键只能有一个。但是,如果你想用多个唯一索引’(unique index),是可以有多个的。主键的作用是保证数据的唯一性和完整性,同时通过主键检索表能够增加检索速度。所谓的一张表多个主键,我们称之为联合主键。可以由多个列形成联合主键,但是主键只能有一个!

MySQL创建表时不指定主键可以吗?

如果是mysql的话,没有定义主键,系统会自动创建一个6位长度的隐藏主键rowId.

SQL的生命周期?

  1. 应用服务器与数据库服务器建立一个连接

  2. 数据库进程拿到请求sql

  3. 解析并生成执行计划,执行

  4. 读取数据到内存并进行逻辑处理

  5. 通过步骤一的连接,发送结果到客户端

  6. 关掉连接,释放资源
    在这里插入图片描述

Java连接MySQL的步骤?

  1. 加载驱动
  2. 获取数据库连接
  3. 创建语句对象
  4. 执行sql语句
  5. 获取结果
  6. 释放连接
public class DemoJdbc {
    
    
    public static void main(String[] args) {
    
    
        save();
    }

    public static void save() {
    
    
        String sql = "insert into t_student (name, age) values (?, ?)";
        Student stu = new Student("zhangsan", 15);
        Connection connection = null;
        Statement statement = null;
        try {
    
    
            // 1 加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2 获取数据库连接
            connection = DriverManager.getConnection("jdbc:mysql:///designmodel", "root", "root");
            // 3 创建语句对象
            PreparedStatement ps = connection.prepareStatement(sql);
            ps.setObject(1, stu.getName());
            ps.setObject(2, stu.getAge());
            // 4 执行sql语句
            ps.executeUpdate();
            // 5 释放连接
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            try {
    
    
                if (statement != null) {
    
    
                    statement.close();
                }
            } catch (SQLException e) {
    
    
                e.printStackTrace();
            } finally {
    
    
                try {
    
    
                    if (connection != null) {
    
    
                        connection.close();
                    }
                } catch (Exception e) {
    
    
                    e.printStackTrace();
                }
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44533129/article/details/112990125