1、数据库三大范式是什么?
第一范式:
1NF是对属性的原子性,要求属性具有原子性,不可再分解;
第二范式:
2NF是对记录的唯一性,要求记录有唯一标识,即实体的唯一性,即不存在部分依赖;
第三范式:
3NF是对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存
2、msyql的存储引擎,以及各自的区别,myisam和innodb区别
1.InnoDB是MySQL默认的存储引擎。
2.只有 InnoDB 支持事务,MyISAM不支持事务。
3.MyISAM不支持行级锁和外键, InnoDB支持。
4.InnoDB表的大小更加的大,用MyISAM可省很多的硬盘空间。
5.InnoDB 引擎的索引和文件是存放在一起的,找到索引就可以找到数据,是聚簇式设计。
6.MyISAM 引擎采用的是非聚簇式(即使是主键)设计,索引文件和数据文件不在同一个文件中。
3、mysql索引有哪些,你是如何做索引的?
从数据结构角度
(1)、B+树索引(O(log(n))):关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理
(2)、hash索引:
从物理存储角度
(1)、聚集索引(clustered index)
(2)、非聚集索引(non-clustered index)
从逻辑角度
(1)、主键索引:主键索引是一种特殊的唯一索引,不允许有空值
(2)、普通索引或者单列索引
(3)、多列索引(复合索引):复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合
(4)、唯一索引或者非唯一索引
(5)、空间索引:空间索引是对空间数据类型的字段建立的索引
4、mysql索引优化
列越小越快
枚举类型替代varchar
避免null值
固定长度的表比动态的快(避免text等不定长字段)
垂直分表(降低表的复杂度,不常用的字段分离出来单独存储)
合理设置索引
分表,分布式(主从)
5、mysql的事务特性
原子性:事务是一个不可分割的工作单位,要么同时成功,要么同时失败。例:当两个人发起转账业务时,如果A转账发起,而B因为一些原因不能成功接受,事务最终将不会提交,则A和B的请求最终不会成功。
持久性:一旦事务提交,他对数据库的改变就是永久的。注:只要提交了事务,将会对数据库的数据进行永久性刷新。
隔离性:多个事务之间相互隔离的,互不干扰
一致性:事务执行接收之后,数据库完整性不被破坏
注意:只有当前三条性质都满足了,才能保证事务的一致性
6、mysql的读写分离
读写分离解决的是,数据库的写操作,影响了查询的效率,适用于读远大于写的场景。读写分离的实现基础是主从复制,主数据库利用主从复制将自身数据的改变同步到从数据库集群中,然后主数据库负责处理写操作(当然也可以执行读操作),从数据库负责处理读操作,不能执行写操作。并可以根据压力情况,部署多个从数据库提高读操作的速度,减少主数据库的压力,提高系统总体的性能。
7、msyql如何分表分库分表
https://blog.csdn.net/shida219/article/details/117981566
8、msyql悲观和乐观锁
https://blog.csdn.net/weixin_45433031/article/details/120838045
9、msyql索引回表
InnoDB引擎中,非主键索引查找数据时需要先找到主键,再根据主键查找具体行数据,这种现象叫回表查询
索引覆盖,即将查询sql中的字段添加到联合索引里面,只要保证查询语句里面的字段都在索引文件中,就无需进行回表查询;
10、msyql索引失效
1、like查询以“%”开头;
2、or语句前后没有同时使用索引;
3、组合索引中不是使用第一列索引;
4、在索引列上使用“IS NULL”或“IS NOT NULL”操作;
5、在索引字段上使用“not”,“<>”,“!=”。
6、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
7、当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。
12、什么是死锁?什么是脏读?幻读?不可重复读?
脏读(无效的数据)
a事务把数据改完之后并没有提交,b事务读到这个改完数据之后的事务,
b事务读完之后,a事务又把数据做了一个回滚操作,这种现象叫脏读
不可重复读
a事务把数据读完拿去用了,b事务刚好直接把数据给改了,并且提交了,
a事务会发现之前读的数据不准确了
幻读现象
是不可重复读的一种特殊现象,
举例:假设一张表一共有10条数据,a事务把id大于3的数据name全部改成了xx,
就在刚刚改完的那一刻,b事务又插入一条数据,a事务改完之后,会发现有一条数据没有修改成功
12、MySQL数据库cpu飙升到100%的话怎么处理?
https://blog.csdn.net/t707584896/article/details/129971047
13、MySQL主从复制解决了哪些问题?
1、数据的备份(很多企业用从库来做专业数据库备份服务器)
2、读写分离,这样减少主库的压力,支持更大的并发,主写从读。还可以单独使用一个从库来做为企业内部人员查询数据使用的服务器,这样更有利于减少线上服务器的访问压力。
3、高可用,主从复制+故障切换,实现线上业务不宕机运行。
14、binlog和redo log有什么区别?
1.Redo Log是属于InnoDB引擎功能,Binlog是属于MySQL Server自带功能,并且是以二进制文件记录。
2.Redo Log属于物理日志,记录该数据页更新状态内容,Binlog是逻辑日志,记录更新过程。
3.Redo Log日志是循环写,日志空间大小是固定,Binlog是追加写入,写完一个写下一个,不会覆盖使用。
4.Redo Log作为服务器异常宕机后事务数据自动恢复使用,Binlog可以作为主从复制和数据恢复使用。Binlog没有自动crash-safe能力。
5.由binlog和redo log的概念和区别可知:binlog日志只用于归档,只依靠binlog是没有crash-safe能力的。但只有redo log也不行,因为redo log是InnoDB特有的,且日志上的记录落盘后会被覆盖掉。因此需要binlog和redo log二者同时记录,才能保证当数据库发生宕机重启时,数据不会丢失
15、慢SQL如何定位呢?
1.首先确认是否开启了慢查询
2.设置慢查询的时间限制
3.查询慢查询日志可定位具体的慢sql
4.相关sql查询
5.用Explain分析具体的sql语句
id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使⽤的索引
key:表示实际使⽤的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的⾏百分比
Extra:执行情况的描述和说明