Mysql面试题总结

1. *sql语句应该考虑哪些安全性:

1.防止sql注入,对特殊字符进行转义、过滤或者使用预编译sql语句绑定
2.使用最小权限原则,特别是不要使用root账户,为不同的动作或者操作建立不同的账户
3.当sql出错时,不要把数据库出错的信息暴露到客户端

2. *MyISAM 和 InnoDB 的区别:

1.InnoDB 支持事务,MyISAM 不支持事务
2.对一个包含外键的 InnoDB 表转为 MYISAM 会失败
3.InnoDB 不保存表的具体行数需要全表扫描,而MyISAM 用一个变量保存了整个表的行数
4.InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,
导致其他查询和更新都会被阻塞,因此并发访问受限
5.系统崩溃后,MyISAM恢复起来更困难,能否接受,不能接受就选 InnoDB
6.MyISAM:可被压缩,存储空间较小。
7.InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

备份及恢复:
MyISAM: 数据是以文件的形式存储,所以在跨平台的数据转移中会很方便,在备份和恢复时可单独针对某个表进行操作
InnoDB: 拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了
1.InnoDB 支持事务,MyISAM 不支持事务
2.对一个包含外键的 InnoDB 表转为 MYISAM 会失败
3.InnoDB 不保存表的具体行数需要全表扫描,而MyISAM 用一个变量保存了整个表的行数
4.InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,
导致其他查询和更新都会被阻塞,因此并发访问受限
5.系统崩溃后,MyISAM恢复起来更困难,能否接受,不能接受就选 InnoDB
6.MyISAM:可被压缩,存储空间较小。
7.InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

3. *百万数据优化:

1. 添加索引遵守、最左前缀法则:

在这里插入图片描述在这里插入图片描述

2. 索引不要放在范围查找的右边:

在这里插入图片描述

3. 减少select*的使用:

在这里插入图片描述

4. like导致索引失效:

在这里插入图片描述

5. order by 优化:

在这里插入图片描述

4. 数据库各种问题:

  • 解决方法:加锁

脏写

脏写,意思是说有两个事务,事务 A 和事务 B 同时在更新一条数据,事务 A 先把它更新为 A 值,事务 B 紧接着就把它更新为 B 值
在这里插入图片描述

脏读

接着,事务 B 拿着刚才查询到的 A 值做各种业务处理。但是接着坑爹的事情发生了,事务 A 突然回滚了事务,导致它刚才功能的 A 值没了,此时那行数据的值回滚为 NULL 值。然后事务 B 紧接着此时再次查询那行数据的值,看到的居然是 NULL 值
在这里插入图片描述

不可重复读

在这里插入图片描述

幻读

幻读就是你一个事务用一样的 SQL 多次查询,结果每次查询都会发现查到一些之前没看到过的数据

5. select count (*)、count(1)、count(column)的区别:

1.count(*) 跟 count(1) 的结果一样,包括对NULL的统计
2.count(column) 是不包括对NULL的统计
3.如果表沒有主键(Primary key), 那么count(1)比count(*)快
4.如果表没有主键,只建了索引,那么count(*),count(1)是一样的

6. MySQL事务的隔离级别:

1. Read Uncommitted:读取未提交内容
2. Read Committed:读取提交内容
3. Repeatable Read:可重读
4. Serializable:可串行化

在这里插入图片描述

7. MySQL 有哪些索引类型:

1.主键索引
2.普通索引
3.唯一索引
4.全文索引

8. MySQL 有哪些存储引擎:

1.InnoDB:默认存储引擎,使用最广泛。
2.MyISAM:表锁,不支持事务。
3.Archive:适合日志和数据采集类应用。
4.Memory:适合访问速度快,数据丢失也没有关系的场景。
5.CSV:将普通csv保存再MySQL中,主要用于数据交换。

此外还有:Blackhole、Federated、Merge、NDB等存储引擎

9. MySQL 悲观锁和乐观锁:

悲观锁和乐观锁都是为保证一致性的一种锁。

1. 悲观锁:
比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,
这样会增加大量的锁的开销,降低了系统的吞吐量。
2. 乐观锁:
比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大。

10. MySQL 视图的作用,视图可以更改吗:

1.视图是虚拟的表,与包含数据的表不一样
2.视图只包含使用时动态检索数据的查询,不包含任何列或数据
3.视图不能被索引,也不能有关联的触发器或默认值
4.视图的更新将对基表进行更新;
5.但是视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新

11. drop,delete与truncate的区别:

1.drop直接删掉表
2.truncate删除表中数据,再插入时自增长id又从1开始
3.delete删除表中数据,可以加where字句。

12. MySQL触发器:

触发器(trigger):监视某种情况,并触发某种操作

1.监视地点(table)
2.监视事件(insert/update/delete) 
3.触发时间(after/before) 
4.触发事件(insert/update/delete)

13. MySQL binlog的几种日志录入格式以及区别:

1.Statement:每一条会修改数据的sql都会记录在binlog中
2.Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改
3.Mixedlevel:是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,
如一些函数,statement无法完成主从复制的操作,则 采用row格式保存

Statement 可能占用空间会相对小一些,传送到 slave 的时间可能也短,但是没有 row模式的可靠。 Row 模式在操作多行数据时更占用空间, 但是可靠。

14. MySQL 备份计划:

  • 物理备份恢复快(xtranbackup),逻辑备份(mysqldump)恢复慢 这里跟机器,尤其是硬盘的速率有关系
  • 备份视库的大小来定:
1.一般来说 100G 内的库,可以考虑使用 mysqldump 来做,因为 mysqldump更加轻巧灵活,
备份时间选在业务低峰期,可以每天进行都进行全量备份
(mysqldump 备份出来的文件比较小,压缩之后更小)。
2.100G 以上的库,可以考虑用 xtranbackup 来做,备份速度明显要比 mysqldump 要快。
一般是选择一周一个全备,其余每天进行增量备份,备份时间为业务低峰期。

15. MySQL索引为什么要用B+树:

1. B+树能显著减少IO次数,提高效率
2. B+树的查询效率更加稳定,因为数据放在叶子节点
3. B+树能提高范围查询的效率,因为叶子节点指向下一个叶子节点

16. MySQL MVCC(多版本并发控制):

组成:
1. 表的隐藏:记录事务id及上个版本的数据地址
2. undo log:记录数据各个版本修改历史即事务链
3. Read View:读试图,用于判断哪些版本可见
优点:
1. 在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,
提高了数据库并发读写的性能
2. 同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值