Mysql面试夺命18问

文章目录

1.简要说明一下数据库范式

  • 第一范式: 属性不可再分.
  • 第二范式: 在一范式的基础上, 要求数据库表中的每个实例或行必须可以被惟一地区分. 通常需要为表加上一个列, 以存储各个实例的惟一标识. 这个惟一属性列被称为主关键字或主键.
  • 第三范式: 在二范式的基础上, 要求一个数据库表中不包含已在其它表中已包含的非主关键字信息. 所以第三范式具有如下特征:1). 每一列只有一个值. 2). 每一行都能区分. 3). 每一个表都不包含其他表已经包含的非主关键字信息.

2.一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15、16、17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15?

  • 这条记录的ID是18。因为MySQL的自增主键是基于已使用的最大值来确定的,即使你删除了某些记录,已使用的最大值(在这个例子中是17)仍然会被保留,所以下一条记录的ID会是18。

3.主键和候选键有什么区别?

  • 主键是表中的唯一标识符,用于唯一确定表中的每一行。一个表只能有一个主键。候选键也是能唯一确定表中每一行的列或列的组合,但一个表可以有多个候选键。
  1. 什么是事务?MySQL中如何支持事务?
  • 事务是一系列操作,这些操作要么完全执行,要么完全不执行,以确保数据库的完整性。MySQL通过InnoDB存储引擎支持事务,提供了ACID(原子性、一致性、隔离性、持久性)的特性。
  1. LIKE声明中的%和_是什么意思?
  • %代表零个、一个或多个字符,而_代表一个单一的字符。
  1. 如何在Unix和Mysql时间戳之间进行转换?
  • 可以使用MySQL的日期和时间函数来进行转换,如FROM_UNIXTIME()和UNIX_TIMESTAMP()。
  1. 我们如何得到受查询影响的行数?
  • 可以使用ROW_COUNT()函数来获取受上一个SQL语句影响的行数。
  1. Mysql查询是否区分大小写?
  • 这取决于数据库的字符集和校对规则。在默认情况下,MySQL的查询是不区分大小写的,但可以通过设置校对规则来改变这一行为。
  1. LIKE和REGEXP操作有什么区别?
  • LIKE主要用于简单的模式匹配,而REGEXP用于更复杂的正则表达式匹配。
  1. 如何在mysql中运行批处理模式?
  • MySQL本身并不直接支持批处理模式,但你可以通过编写脚本或使用命令行工具来批量执行SQL语句。
  1. MyISAM和InnoDB的区别是什么?
  • 图片InnoDB支持事务, MyISAM不支持.
  • InnoDB支持行级锁, MyISAM支持表级锁.
  • 图片InnoDB支持多版本并发控制(MVVC), MyISAM不支持.
  • InnoDB支持外键, MyISAM不支持.
  • 图片MyISAM支持全文索引, InnoDB部分版本不支持(但可以使用Sphinx插件)
  1. 如何优化DISTINCT?
  • 优化DISTINCT的方法包括确保查询中使用的列都有索引、减少查询中涉及的列数、避免在DISTINCT查询中使用子查询等。
  1. MySQL数据库cpu飙升到100%的话怎么处理?
  • 当CPU使用率飙升至100%时,我们首先需要利用操作系统的top命令来快速识别是否由mysqld进程引发的高占用情况。
  • 如果mysqld并非罪魁祸首,那么我们需进一步查找其他占用资源较高的进程,并采取相应的处理措施。
  • 如果是 mysqld 造成的, show processlist,看看里面跑的 session 情况,是不是有消耗资源的 sql 在运行。找出消耗高的 sql,看看执行计划是否准确,index 是否缺失,或者实在是数据量太大造成。
  • 一般来说,肯定要 kill 掉这些线程(同时观察 cpu 使用率是否下降), 等进行相应的调整(比如说加索引、改 sql、改内存参数)之后,再重新跑这些 SQL。也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升, 这种情况就需要跟应用一起来分析为何连接数会激增, 再做出相应的调整,比如说限制连接数等。
  1. MYSQL主从复制解决了哪些问题?
  • 主从复制的作用是:主数据库出现问题,可以切换到从数据库。可以进行数据库层面的读写分离。可以在从数据库上进行日常备份。
  • 数据分布:随意开始或停止复制,并在不同地理位置分布数据备份
  • 负载均衡:降低单个服务器的压力
  • 高可用和故障切换:帮助应用程序避免单点失败
  • 升级测试:可以用更高版本的MySQL作为从库
  1. MySQL的索引是什么,它有什么作用?如何查看?
  • 索引是一种数据结构,它可以帮助数据库系统快速检索数据,而无需扫描整个表。通过索引,数据库可以快速定位到表中的特定记录,从而提高查询速度。可以使用SHOW INDEX FROM 表名;命令来查看表的索引信息。
  1. 什么是死锁?怎么解决?
    死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。

常见的解决死锁的方法:

  • 如果不同程序会并发存取多个表, 尽量约定以相同的顺序访问表,可以大大降低死锁机会。
  • 同一个事务,尽可能做到一次锁定所需的所有资源,减少死锁产生概率;
  • 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
  1. 如何优化MySQL的查询性能?
  • 优化MySQL查询性能的方法有很多,包括:使用合适的索引、避免全表扫描、优化查询语句、减少连接操作、使用缓存等。
  1. 什么是SQL注入,如何防止?
  • SQL注入是一种攻击手段,攻击者通过在SQL查询语句中插入恶意代码来篡改原始语句的结构和意图。为了防止SQL注入,可以使用预编译语句(Prepared Statements)或参数化查询,避免在代码中直接拼接SQL语句。
相关推荐
运维行者_7 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
国强_dev8 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
@insist1238 小时前
系统规划与管理师-信息系统规划核心工作要点解析
数据库·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
超级数据查看器8 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
Waay8 小时前
面试口述版:个人对 Prometheus 完整理解
运维·学习·云原生·面试·职场和发展·kubernetes·prometheus
数安3000天9 小时前
增量数据如何自动分类分级,避免目录“过期“?
大数据·数据库
南墙上的石头10 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
yuhaiqiang10 小时前
随手 vibecoding 的浏览器插件已经 6000 多次下载,聊聊他的产品设计
前端·后端·面试
画中有画11 小时前
论向量数据库在项目中的应用
数据库
spider_xcxc11 小时前
Redis 数据库高质量实践指南(一)
运维·数据库·redis·oracle·云计算