1.mysql的两种存储引擎区别(事务,锁级别等)?
@1. myisam:不支持外键,表锁,插入数据时,锁定整个表,查询表的总行数时,不需要全表扫描
@2. innodb:支持外键,行锁,查询表的总行数时,全表扫描
2.b+索引和hash索引?
@1. hash:查询效率高,不能排序和进行范围查询
@2. b+:数据有序,可以范围查询
3.聚焦索引和非聚焦索引?
@1. 聚焦索引:数据按索引顺序存储,中子节点存储真实的物理数据
@2. 非聚焦索引:存储指向真正的数据行指针
4.索引的优缺点,什么时候使用索引和不能使用索引?
@ 索引最大的好处就是可以快速检索数据,提高查询效率。
@ 对数据进行频繁查询时使用索引,频繁修改不建议
@ 缺点更新数据时同时需要更新索引
5.索引的底层实现(b+树,为何不使用b树和红黑树)
@ 红黑树,增加删除,红黑树会进行频繁的调整,来保证红黑树的性质,浪费时间
@ b树,查询性能不稳定
@ b+树,相比上面两个来说,显得更矮更宽,查询次数更浅
6.b+树的实现?
@ 比如一个m阶的b树有如下几个特征:
有k个子树的中间节点包含有k个元素,每个元素不保存数据,只用来索引,所有的数据都保存在叶子节点。
所有的叶子节点包含了全部元素的信息,及指向这些元素记录的指针,且叶子节点本身依赖关键字的大小自小而大顺序链接。
所有的中间节点元素都同时存在与子节点,在子节点元素中是最大或最小元素
7.索引分类,索引失效条件?
@ 普通索引, 最基本的索引,没有任何限制
@ 唯一索引, 索引列的值必须唯一,但允许空值
@ 主键索引, 特殊的唯一索引,不允许为空
@ 全文索引, 针对较大的数据,很耗时很耗空间
@ 组合索引, 索引字段组合在一起,可以提高查询效率
8.数据库的主从复制?
@ 异步复制:默认, 容易造成主库从库数据不一致。一个数据库为master,一个数据库为slave,通过binlog日志,slave两个线程,一个线程去读master binlog日志写到自己的中继日志,一个线程去解析日志,执行sql. master启动一个线程,给slave传递binlog日志
@ 半同步复制:只有把master发送的binlog日志写到slave的中级日志,这时主库才返回操作完成的反馈,性能有一定降低
@ 并行操作: slave多个线程去请求binlog日志
9.long_query 怎么解决?
@ 设置参数,开启慢日志功能,得到耗时一定时间的sql
show_query_log:开启记录慢查询功能,shuow_query_log=0关闭,shuow_query_log=1开启,(1可以不写)
long_query_time = 1 : 记录超过一秒的执行sql语句
10.数据库连接池有啥作用?可以吃吗?
@ 维护一定数量的连接,减少创建连接的时间。更快的响应时间,统一管理
11.读写分离又是啥?
@ 当数据量特别庞大敲打到一个数据库的时候,他是不是特别孤独。所以我们可以复制几个从库(主从复制),做他的小伙伴。然后我们分工明确,主库负责写操作,从库负责读取数据。这就是读写分离。
问题:怎么让读写分离,,,
spring可以配置两个数据库,用过aop,在写或读的方法前面进行判断得到一个动态数据源。
aop??? 相当于动态代理模式,对源代码的一种功能增强的方式把。
12.关系型数据库和非关系型数据库的区别?
@ 先来说一说都是啥?
关系型数据库,就是比如说oracle,mysql。而非关系型,最常见的比如说redis,memcache(貌似这么拼的啊)
关系型:
容易理解,二维表结构非常贴近逻辑世界
使用方便,sql语言一写,就能进行特别复杂的查询
易于维护,支持sql。
为了维护这个一致性还是有代价的,读写性能就差了点。
固定的表结构,就一个样。对吧
不支持高并发,和读写操作特别大。
非关系型:
使用键值对存储,不需要写sql,读写性能强
数据之间没有耦合性,易扩展。
缺点就是啥,不支持sql,这就是缺点哈哈
12.表之间的连接都有??
@ 左连接,右连接,笛卡尔积(就是乘积),内连接
13.锁???
@ 比如说数据库怎么来评判谁最强,当然是性能。别的我和你比啥,比谁好看还是谁🐂??
所以性能这就关系到多个用户访问,或者修改同一条数据,如果没有锁,那么直接就炸了。到底谁命令我,都在欺负我嘛??
所以有
乐观锁 : 自己实现,通过版本号或者时间戳
悲观锁 : select .. for update
排他锁 : select .. for update
行锁 : 行,就是每一行有锁,所用每一行
表锁 : 作用于整张表
14.死锁怎么解决?
@ 死锁又是啥?看文知意,死就是去世锁去世当然不能,就是当前锁不可用
找到进程号,kill 进程号。
15.最左匹配原则?
@ 举例说创建一个联合索引,有多个字段。如果是name+age+hoppy,那么如果查询条件是where age="" and hoppy="" and name="",
那么会利用到索引嘛?思考一下,大概是不行对吧
但是,,优化器会进行优化,把位置交换下,还是很智能的。但是不会遵循最左匹配原则,需要按照索引顺序匹配
16.触发器的作用?
@ 触发器是一种特殊的存储过程,主要通过事件触发而被执行的。强化约束,来维护数据完整性一致性
17.存储过程,调用?
@ 存储过程是一种预编译的sql语句,优点是允许模块化的设计,只需要创建一次,就可以多次调用
调用 一个命令对象 or 外部程序,如java程序
优点 预编译,执行效率高。执行的代码放在数据库中,通过存储过程名直接调用,减少网络通讯。安全性高,可以重复使用
缺点 移植性差。 多少得找点缺点是吧,不能让你那么完美
18.存储过程和函数的区别?
存储过程
程序头部声明produect,不需要返回类型,可作为独立的sql语句执行,dml或seletc中不可调用
函数
程序头部声明faction,需要返回类型,不可作为独立的sql语句执行,dml或seletc中可调用
19.什么叫试图,游标是啥?
@ 试图:
是一种虚拟的表,对试图的修改会影响元数据。
既然到这里了,优缺点也来给他个下马威
优点,可以选取数据库的一部分,比较安全。维护数据的独立性,可以从多个表检索数据,对于相同的数据可以产生不同的试图
却点,查询试图,需要查询基本表,所以一些复杂查询时不怎么好更改数据
@ 游标:
对查询出来的结果集作为一个单元作为有效的处理。
20.什么是临时表,表也有备胎??
@ MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。
其实也是备胎,对不
21.数据库三范式?
@ 列不可再分 所有的非主属性必须依赖主键 所有的非主属性不可依赖非主属性,也就是不能间接相关
22.事务是?
@ 识时务者为俊杰,当然不是
事务是对数据库的一系列操作进行统一的回滚或者提交的操作。保证数据完整和一致
事务四大特性?acid
@ 原子性,一致性,隔离性,持久性
事务并发,会导致?
@ 脏读,就是两个事务其中一个读取到另一个事务操作又撤回的脏数据
@ 不可重复读,多次读到的数据不一致
@ 幻读,像做梦似的,就是事务1操作数据了,事务2又修改这条数据回到之前了。事务1再次查询数据明明修改了,咋又回来了。有鬼?这就 是幻读
事务的隔离级别?
@ 这里说明mysql和oracle不一样,mysql4个,oracle2个
mysql:
读未提交:导致脏读
读已提交:导致重复读取数据不一致
可重复读:导致幻读 ----默认
串行化:最高隔离级别,数据不会受到影响。一个一个有序执行,但是效率特别低呀
oracle:
读已提交:导致重复读取数据不一致 ----默认
串行化:最高隔离级别,数据不会受到影响。一个一个有序执行,但是效率特别低呀
**事务传播,我是懒得瞧,自行了解,,不是人看的**
嵌套事务?
@ 子事务套在父事务中执行
23.优化sql
@ explain sql 进行优化,其实就是分析把
24.表级锁,行级锁,页面锁?
- **表级锁:**开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
- **行级锁:**开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
- **页面锁:**开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
死锁:指两个以上或两个的进程在执行过程中,因为抢夺资源而造成的互相等待现象。
死锁关键在于;
两个或两个以上的session加锁不一致
解决:
kill 进程
设置锁的超时时间
指定锁的加锁顺序
25.数据库主从复制分析的 7 个问题?
**问题1:****master的写操作,slaves被动的进行一样的操作,保持数据一致性,那么slave是否可以主动的进行写操作?**
假设slave可以主动的进行写操作,slave又无法通知master,这样就导致了master和slave数据不一致了。因此slave不应该进行写操作,至少是slave上涉及到复制的数据库不可以写。实际上,这里已经揭示了读写分离的概念。
**问题2:****主从复制中,可以有N个slave,可是这些slave又不能进行写操作,要他们干嘛?**
**实现数据备份:**
类似于高可用的功能,一旦master挂了,可以让slave顶上去,同时slave提升为master。
**异地容灾:**
比如master在北京,地震挂了,那么在上海的slave还可以继续。
主要用于实现scale out,分担负载,可以将读的任务分散到slaves上。
【很可能的情况是,一个系统的读操作远远多于写操作,因此写操作发向master,读操作发向slaves进行操作】
**问题3:****主从复制中有master,slave1,slave2,…等等这么多MySQL数据库,那比如一个JAVA WEB应用到底应该连接哪个数据库?**
我们在应用程序中可以这样,insert/delete/update这些更新数据库的操作,用connection(for master)进行操作,
select用connection(for slaves)进行操作。那我们的应用程序还要完成怎么从slaves选择一个来执行select,例如使用简单的轮循算法。
这样的话,相当于应用程序完成了SQL语句的路由,而且与MySQL的主从复制架构非常关联,一旦master挂了,某些slave挂了,那么应用程序就要修改了。能不能让应用程序与MySQL的主从复制架构没有什么太多关系呢?
找一个组件,application program只需要与它打交道,用它来完成MySQL的代理,实现SQL语句的路由。
MySQL proxy并不负责,怎么从众多的slaves挑一个?可以交给另一个组件(比如haproxy)来完成。
这就是所谓的MySQL READ WRITE SPLITE,MySQL的读写分离。
**问题4:****如果MySQL proxy , direct , master他们中的某些挂了怎么办?**
总统一般都会弄个副总统,以防不测。同样的,可以给这些关键的节点来个备份。
**问题5:****当master的二进制日志每产生一个事件,都需要发往slave,如果我们有N个slave,那是发N次,还是只发一次?****如果只发一次,发给了slave-1,那slave-2,slave-3,…它们怎么办?**
显 然,应该发N次。实际上,在MySQL master内部,维护N个线程,每一个线程负责将二进制日志文件发往对应的slave。master既要负责写操作,还的维护N个线程,负担会很重。
可以这样,slave-1是master的从,slave-1又是slave-2,slave-3,…的主,同时slave-1不再负责select。slave-1将master的复制线程的负担,转移到自己的身上。这就是所谓的多级复制的概念。
**问题6:****当一个select发往MySQL proxy,可能这次由slave-2响应,下次由slave-3响应,这样的话,就无法利用查询缓存了。**
应该找一个共享式的缓存,比如memcache来解决。将slave-2,slave-3,…这些查询的结果都缓存至mamcache中。
**问题7:****随着应用的日益增长,读操作很多,我们可以扩展slave,但是如果master满足不了写操作了,怎么办呢?**
scale on ?更好的服务器?没有最好的,只有更好的,太贵了。。。
scale out ? 主从复制架构已经满足不了。
可以分库【垂直拆分】,分表【水平拆分】。
26.mysql 高并发环境解决方案?
MySQL 高并发环境解决方案:分库 分表 分布式 增加二级缓存。。。。。
**需求分析:**互联网单位 每天大量数据读取,写入,并发性高。
**现有解决方式:**水平分库分表,由单点分布到多点数据库中,从而降低单点数据库压力。
**集群方案:**解决DB宕机带来的单点DB不能访问问题。
**读写分离策略:**极大限度提高了应用中Read数据的速度和并发量。无法解决高写入压力。
27.数据库崩溃时事务的恢复机制(REDO日志和UNDO日志)?
unod主要是维护数据的原子性,实际上就是在进行事务提交之间,把原有的数据进行备份到undo日志中,实现持久化,提交事务后,如果操作失败或者回滚数据,可以根据日志恢复,原来的数据不会受到影响。
问题来了》》这样重复备份,影响的是大量的磁盘io,所以肯定不行。于是redo日志落世。
redo相反,他是将要操作的数据进行持久化,这样回滚后,可以根据日志将数据恢复到最新的状态。磁盘io也不会消耗太大
2021-2-26 数据库整理
最新推荐文章于 2024-09-10 15:57:14 发布