MySQL夺命16问,你能坚持到第几问?

点击蓝字

8f59ce6ec5b34f38ce9fa17b8dff92c4.png

关注我们

1、数据库三大范式是什么?

第一范式:每个列都不可以再拆分。

第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。

第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。

在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。

比如性能。事实上我们经常会为了性能而妥协数据库的设计。

2、mysql有关权限的表都有哪几个?

MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,

由mysql_install_db脚本初始化。

这些权限表分别user,db,table_priv,columns_priv和host。

  • user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。

  • db权限表:记录各个帐号在各个数据库上的操作权限。

  • table_priv权限表:记录数据表级的操作权限。

  • columns_priv权限表:记录数据列级的操作权限。

  • host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。

这个权限表不受GRANT和REVOKE语句的影响。

3、事务的四大特性(ACID)介绍一下?

ca82545ab7886d3f383b65e455d9344e.jpeg

原子性:事务是最小的执行单位,不允许分割。

事务的原子性确保动作要么全部完成,要么完全不起作用;

一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;

隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,

各并发事务之间数据库是独立的;

持久性:一个事务被提交之后。它对数据库中数据的改变是持久的,

即使数据库发生故障也不应该对其有任何影响。

4、索引设计的原则是什么?

  • 适合索引的列是出现在where子句中的列,或者连接子句中指定的列

  • 基数较小的类,索引效果较差,没有必要在此列建立索引

  • 使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间

  • 不要过度索引,索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。

5、SQL语句主要分为哪几类?

数据定义语言DDL(Data Ddefinition Language)CREATE,DROP,ALTER

主要为以上操作 即对逻辑结构等有操作的,

其中包括表结构,视图和索引。

数据查询语言DQL(Data Query Language)SELECT

这个较为好理解 即查询操作,以select关键字。

各种简单查询,连接查询等 都属于DQL。

数据操纵语言DML(Data Manipulation Language)INSERT,UPDATE,DELETE

主要为以上操作 即对数据进行操作的,

对应上面所说的查询操作 DQL与DML共同构建了多数初级程序员常用的增删改查操作。

而查询是较为特殊的一种 被划分到DQL中。

数据控制功能DCL(Data Control Language)GRANT,REVOKE,COMMIT,ROLLBACK

主要为以上操作 即对数据库安全性完整性等有操作的,可以简单的理解为权限控制等。

6、MySQL分库分表的目的是?

分库分表就是为了 解决由于数据量过大而导致数据库性能降低的问题,

将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,

使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。

分库分表常用的中间件如下:

ddbd1f806685abac18b9f78d41dd6688.jpeg

7、什么是死锁?怎么解决?

死锁是指两个或多个事务在同一资源上相互占用,

并请求锁定对方的资源,从而导致恶性循环的现象。

常见的解决死锁的方法

  • 如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。

  • 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;

  • 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;

  • 如果业务处理不好可以用分布式事务锁或者使用乐观锁

8、什么是脏读?幻读?不可重复读?

脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,

由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,

这可能是两次查询过程中间插入了一个事务更新的原有的数据。

幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,

例如有一个事务查询了几列(Row)数据,

而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,

就会发现有几列数据是它先前所没有的。

9、视图有哪些特点?

视图的特点如下: 视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。

视图是由基本表(实表)产生的表(虚表)。视图的建立和删除不影响基本表。

对视图内容的更新(添加,删除和修改)直接影响基本表。

当视图来自多个基本表时,不允许添加和删除数据。

视图的操作包括创建视图,查看视图,删除视图和修改视图。

10、SQL的生命周期?

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

  • 数据库进程拿到请求sql

  • 解析并生成执行计划,执行

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

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

  • 关掉连接,释放资源

fb3b08b30f2c3619d163ad2d6d9d165b.jpeg

11、主键使用自增ID还是UUID?

推荐使用自增ID,不要使用UUID。

因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,

主键索引的B+树叶子节点上存储了主键索引以及全部的数据(按照顺序),

如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID,

由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降。

总之,在数据量大一些的情况下,用自增主键性能会好一些。

关于主键是聚簇索引,如果没有主键,

InnoDB会选择一个唯一键来作为聚簇索引,如果没有唯一键,会生成一个隐式的主键。

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

当 cpu 飙升到 100%时,先用操作系统命令 top 命令观察是不是 mysqld 占用导致的,

如果不是,找出占用高的进程,并进行相关处理。

如果是 mysqld 造成的, show processlist,看看里面跑的 session 情况,

是不是有消耗资源的 sql 在运行。找出消耗高的 sql,看看执行计划是否准确,

index 是否缺失,或者实在是数据量太大造成。

一般来说,肯定要 kill 掉这些线程(同时观察 cpu 使用率是否下降),

等进行相应的调整(比如说加索引、改 sql、改内存参数)之后,再重新跑这些 SQL。

也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,

这种情况就需要跟应用一起来分析为何连接数会激增,

再做出相应的调整,比如说限制连接数等

13、MySQL主从复制解决了哪些问题?

主从复制的作用是

主数据库出现问题,可以切换到从数据库。

可以进行数据库层面的读写分离。

可以在从数据库上进行日常备份。

数据分布:随意开始或停止复制,并在不同地理位置分布数据备份

负载均衡:降低单个服务器的压力,高可用和故障切换:帮助应用程序避免单点失败

升级测试:可以用更高版本的MySQL作为从库

14、什么是MySQL的GTID?

TID(Global Transaction ID,全局事务ID)是全局事务标识符,

是一个已提交事务的编号,并且是一个全局唯一的编号。

GTID是从MySQL 5.6版本开始在主从复制方面推出的重量级特性。

GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。

GTID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。

GTID有如下几点作用:

  • 根据GTID可以知道事务最初是在哪个实例上提交的。

  • GTID的存在方便了Replication的Failover。

    因为不用像传统模式复制那样去找master_log_file和master_log_pos。

  • 基于GTID搭建主从复制更加简单,确保每个事务只会被执行一次。

15、MySQL常用的备份工具有哪些?

常用备份工具mysql复制

逻辑备份(mysqldump,mydumper)

物理备份(copy,xtrabackup)

备份工具差异对比

mysql复制相对于其他的备份来说,得到的备份数据比较实时。

逻辑备份:分表比较容易。

  • mysqldump备份数据时是将所有sql语句整合在同一个文件中;

  • mydumper备份数据时是将SQL语句按照表拆分成单个的sql文件,

每个sql文件对应一个完整的表。

物理备份:拷贝即可用,速度快。

  • copy:直接拷贝文件到数据目录下,可能引起表损坏或者数据不一致。

  • xtrabackup对于innodb表是不需要锁表的,对于myisam表仍然需要锁表。

16、MySQL备份计划如何制定

视库的大小来定,一般来说 100G 内的库,可以考虑使用 mysqldump 来做,

因为 mysqldump更加轻巧灵活,备份时间选在业务低峰期,

可以每天进行都进行全量备份(mysqldump 备份出来的文件比较小,压缩之后更小)。

100G 以上的库,可以考虑用 xtranbackup 来做,备份速度明显要比 mysqldump 要快。

一般是选择一周一个全备,其余每天进行增量备份,备份时间为业务低峰期。

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

dcf685ac5a61a9d46fc3ad881173eece.png

48cc7fdb25637fb1a82fc35446c414f1.gif

戳“阅读原文”我们一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美图手机投射功能在哪_在Java 8中进行投射(还有其他功能?)

美图手机投射功能在哪将实例转换为设计不良的类型。 尽管如此,在某些情况下没有其他选择。 从第一天开始,执行此功能就已成为Java的一部分。 我认为Java 8提出了对这种古老技术稍加改进的需求。 静态铸造 Java中最常见的转换方法如下: 静态…

js箭头函数和普通函数区别

js箭头函数和普通函数区别实验环境:nodejs v12.16.1 箭头函数不能作为构造函数,而普通函数可以 箭头函数没有原型,而普通函数有 箭头函数return可以省略语句块。(如果>右边不是语句块,则代表return右边的表达式或对象) 箭…

git 更新_[技术分享T.191212]GitLab使用方法及git命令常见问题(不断更新)

该文章用于记录一些GitLab的使用指南,以及在实际版本控制过程中遇到的问题及解决方法,会尽量及时的更新~GitLab简介:GitLab和GitHub很相似都属于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来…

记一次开发实战-对提供接口的C/C++进行二次开发

点击蓝字关注我们一、需求描述我有一个USB5538的库和头文件,并通过头文件提供了接口,我想把它更改一下,编译成python可调用的模块。二、创建工程及其目录1、创建空项目2、创建目录三、创建文件1、复制文件并添加2、添加新文件并写入四、环境配…

C++是如何实现多态的

C是如何实现多态的结论:C通过虚函数来实现多态的,根本原因是派生类和基类的虚函数表的不同。 构成多态的必要条件有如下3点: 存在继承关系基类存在虚函数,且派生类有相同原型的函数遮蔽它存在基类类型的指针指向派生类对象&…

C语言实现通讯录附详细代码(动态+静态)

点击蓝字关注我们一、通讯录简介实现一个通讯录;通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:添加联系人信息删除指定联系人信息查找指定联系人信息修改指定联系人信息显示所有联系…

Lua协程Coroutine是什么

Lua协程Coroutine是什么协程和线程不同: 同一时刻,一个多线程程序可以用多个线程同时执行;而协程只能有一个在执行多线程是抢占式的;而协程是非抢占式的,只有协程显示被挂起,才会被挂起 协程和线程的相同…

C++程序的内存分区模型-栈区堆区

点击蓝字关注我们1、栈区:由编译器自动分配释放,存放函数的参数值,局部变量等(由编译器管理其“生死”)注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放栈区代码演示&#xff…

CocosStudio的节点如何使用自定义shader

CocosStudio的节点如何使用自定义shader问题:我想对CocosStudio 的 某个UI 里的 某个图片(如下图所示的Image类型)使用自定义shader。但是,我把 对传统的cc.Sprite应用自定义shader的方式 应用于它时,并不生效&#xf…

excel随机抽取_简单随机抽样及其进阶分层随机抽样方法展示

一、分享简单随机抽样的几种方法1、抽样分析工具抽样2、INDIRECTRANDBETWEEN函数抽样3、RAND排序抽样4、SAS抽样二、分层抽样方法1、Python分层抽样2、SAS分层抽样3、EXCEL函数及功能分层抽样简单随机抽样的几种方法方法一抽样分析工具抽样如果你的EXCEL尚未安装数据分析&#…

为什么存在动态内存分配,动态内存函数(malloc函数,free函数,calloc函数,realloc函数)...

点击蓝字关注我们1.当前我们知道的内存的使用方法2.为什么存在动态内存分配如上我们已学的开辟空间的方式有两个特点:空间开辟的大小是固定的必须指定数组的长度所以就产生了空间开大了浪费开小了不够用的问题,所以使用动态内存分配3.动态内存函数&#…

C++ vector类的模拟实现

点击蓝字关注我们1.前言vector和string虽然底层都是通过顺序表来实现的,但是他们利用顺序表的方式不同,string是指定好了类型,通过使用顺序表来存储并对数据进行操作,而vector是利用了C中的泛型模板,可以存储任何类型的…

visual studio源文件的编译顺序是依据什么?

问题:visual studio源文件的编译顺序是依据什么? 结论:依据 .vcxproj 文件里 指定了ClCompile的ItemGroup ,如下图所示,就是这么简单粗暴。

功能齐全的屏幕截图C++实现详解

点击蓝字关注我们1、概述要使用屏幕截图,其实很容易,装一款聊天软件或者办公软件就可以了,比如QQ、企业微信、钉钉、飞书等。但要开发出类似这些软件的屏幕截图模块,则没那么容易。其实实现屏幕截图的技术并不复杂,主要…

如何判断exe文件是debug还是release编译生成的

如何判断exe文件是debug还是release编译生成的结论: 用IDA工具打开exe,然后看Imports里面的依赖库是否有带d或D结尾的,如果有就说明是Debug的 实验:(实验环境 vs2017, IDA工具) (0&…

大屏可视化分配率是什么意思_什么是分配率?

大屏可视化分配率是什么意思诸如“不可持续的分配率”和“您需要保持较低的分配率”之类的短语似乎仅属于Java Champions的词汇表。 复杂,恐怖并被魔术光环包围。 经常发生的情况是,当您更仔细地查看概念时,魔术会随着抽烟消失。 这篇文章试…

C/C++语言动态开辟的杨辉三角

点击蓝字关注我们问题引入杨辉三角相必大家并不陌生,第1行有1列、第二行有2列…第n行有n列,且每行行首和行尾的值都为1,其余的值为上一行两数相加我们在C语言阶段,第一次碰到的杨辉三角应该都是用常规的二维数组存储,可…

git gui 历史版本_这些Git命令都不会,还是不要去面试了

前言以下,项目中经常使用的Git命令,汇总到这里以便与你能快速的学习和掌握Git命令,在文章最后有惊喜哟,一定要看到最后啊!使用的 Git版本:git version 2.24.0命令git log# 输出概要日志,这条命令等同于# gi…

java restful_Java EE中的RESTful计时器

java restful在这篇文章中...。 EJB计时器旋风之旅 通过带有示例实现的简单REST接口即时使用EJB计时器 更新(2015年7月14日) 该应用程序的前端现在可以在OpenShift上使用 。 由于我是前端新手,因此我在其他来源的帮助下组装了此HTML5 Ang…

c# 联合halcon 基于相关性 模板匹配_机器视觉之halcon入门(5)-字符识别exe生成...

2.3.2 第二个halcon程序转EXE程序:字符识别老规矩,每一段halcon代码得用C#二次开发下。根据上一节所教的,我们配置下C#的环境,顺便添加好控件,如下图(2-3-2-1)。图 2-3-2-1控件基本跟上一节一样,只是少了一…