mysql相关的面试题有哪些

56次阅读
没有评论

共计 5058 个字符,预计需要花费 13 分钟才能阅读完成。

本篇内容介绍了“mysql 相关的面试题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1. MYISAM 和 INNODB 的不同?
答:主要有以下几点区别:
  a)构造上的区别
  MyISAM 在磁盘上存储成三个文件,其中.frm 文件存储表定义;.MYD (MYData) 为数据文件;.MYI (MYIndex)为索引文件。
  而 innodb 是由.frm 文件、表空间(分为独立表空间或者共享表空间)和日志文件(redo log)组成。
  b)事务上的区别
  myisam 不支持事务;而 innodb 支持事务。
  c) 锁上的区别
 myisam 使用的是表锁;而 innodb 使用的行锁(当然 innodb 也支持表锁)。
  表级锁:直接锁定整张表,在锁定期间,其他进程无法对该表进行写操作,如果设置的是写锁,那么其他进程读也不允许,因此 myisam 支持的并发量低,但 myisam 不会出现死锁;
  行级锁:只对指定的行进行锁定,其他进程还是可以对表中的其他行进行操作的。因此行锁能大大的减少数据库操作的冲突,但有时会导致死锁。
  d) 是否支持外键的区别
 myisam 不支持外键,innodb 支持外键
  e) select count(*) 的区别
  对于没有 where 的 count(*) 使用 MyISAM 要比 InnoDB 快得多。因为 MyISAM 内置了一个计数器,count(*)时它直接从计数器中读,而 InnoDB 必须扫描全表。
  f)myisam 只把索引都 load 到内存中,而 innodb 存储引擎是把数据和索引都 load 到内存中

2. 公司现有的数据库架构,总共有几组 mysql 库?
答:我们公司现在有两组 MySQL。其中一套是生产库,一套是测试库。
  生产库和测试库都是用的 mha + 半同步复制做的高可用。
  我们所有的项目 web 前端量(大概有 10 个项目)指向的都是一个机器上的 mysql 实例。因为我们是传统行业,并发访问量并不是很大,所以目前我们的生产 mysql 数据库未出现性能问题。

3. 如何提高 insert 的性能?
答:有如下方法:
  a)合并多条 insert 为一条,即:insert into t values(a,b,c),  (d,e,f) ,,,
  原因分析:主要原因是多条 insert 合并后日志量(MySQL 的 binlog 和 innodb 的事务让日志)减少了,降低日志刷盘的数据量和频率,从而提高效率。通过合并 SQL 语句,同时也能减少 SQL 语句解析的次数,减少网络传输的 IO。
  b)修改参数 bulk_insert_buffer_size,调大批量插入的缓存;
  c)设置 innodb_flush_log_at_trx_commit = 0,相对于 innodb_flush_log_at_trx_commit = 1 可以十分明显的提升导入速度;
 (备注:innodb_flush_log_at_trx_commit 参数对 InnoDB Log 的写入性能有非常关键的影响。该参数可以设置为 0,1,2,解释如下:
 0:log buffer 中的数据将以每秒一次的频率写入到 log file 中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的 commit 并不会触发任何 log buffer 到 log file  的刷新或者文件系统到磁盘的刷新操作;
 1:在每次事务提交的时候将 log buffer 中的数据都会写入到 log file,同时也会触发文件系统到磁盘的同步;
 2:事务提交会触发 log buffer 到 log file 的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。
 )

  d)手动使用事务
  因为 mysql 默认是 autocommit 的,这样每插入一条数据,都会进行一次 commit;所以,为了减少创建事务的消耗,我们可用手工使用事务,即 START TRANSACTION;insert。。,insert。。commit;即执行多个 insert 后再一起提交;一般 1000 条 insert 提交一次。

4. 和上一个问题相关,如果 insert 等 dml 语句的性能有问题的话,或者其他问题的存在,可能造成同步延迟,所以如何有效避免同步延迟的出现?

答:MySQL 主从同步延迟的最主要原因就是主库是多线程写,而从库只有一个线程(即 slave_sql_running)来同步,所以在主库中如果有一个 ddl 或 dml 操作执行 10 分钟,那么这个操作在从库上同样需要执行 10 分钟。有人可能会问:“主库上那个相同的 DDL、DML 也需要执行 10 分,为什么 slave 会延时?”,答案是 master 可以并发,Slave_SQL_Running 线程却不可以。
所以,为了减少从库的延时,我们需要平时做好以下维护:
  a)尽量让主库的 dml 或者 ddl 快速执行,如提高 insert 的效率(方法见上);
  b)为了安全,有人可能会将主库的 sync_binlog 设置为 1,innodb_flush_log_at_trx_commit 也设置为 1 之类的,而 slave 则不需要这么高的数据安全,完全可以讲 sync_binlog 设置为 0 或者关闭 binlog,innodb_flushlog 也可以设置为 0,来提高从库 sql 的执行效率。
 (备注:sync_binlog 是控制 binlog_cache 刷新到磁盘 binlog 频率的,而 innodb_flush_log_at_trx_commit 是控制 redo log buffer 刷新到磁盘 redolog 频率的。sync_binlog=0,表示 MySQL 不控制 binlog 的刷新,由文件系统自己控制它的缓存的刷新。如果 sync_binlog 0,表示每 sync_binlog 次事务提交,MySQL 调用文件系统的刷新操作将缓存刷下去。最安全的就是 sync_binlog= 1 了,表示每次事务提交,MySQL 都会把 binlog 刷下去。这样的话,在数据库所在的主机操作系统损坏或者突然掉电的情况下,系统才有可能丢失 1 个事务的数据。所以 sync_binlog= 1 保证了数据安全,但是性能最差。)
  c)使用比主库更好的硬件设备作为 slave
  d) 使用 mysql 5.6 新参数 slave_parallel_workers,使从库多线程,不过,slave_parallel_workers 只能支持一个实例下多个 database 间的并发复制,并不能真正做到多表并发复制。因此在较大并发负载时,slave 还是没有办法及时追上 master,需要想办法进行优化。
  e)升级 Mysql 到 5.7,因为 mysql 5.7 支持真正意义的从库多线程了,即主库多少线程,从库也多少线程。mysql 5.7 号称主从复制永不丢数据(一直没时间试用过)。

5. 有没有用 GTID, 对 GTID 了解吗?
答:用过 GTID。曾经民航局的一个项目就用的是 GTID。
  GTID 是 mysql 5.6 的新东西,用事务提交号替换 binlog 的位置号。不过 GTID 这个东西在 5.6 还是有很多局限性的,个人不建议用。
  GTID 的全称为 global transaction identifier ,可以翻译为全局事务标示符。
  GTID 由两部分组成:GTID = source_id:transaction_id
  source_id 用于标示源服务器,用 server_uuid 来表示,这个值在第一次启动时生成,并写入到配置文件 data/auto.cnf 中
  transaction_id 则是根据在源服务器上第几个提交的事务来确定。

6. Innodb 是行锁,那什么时候会产生行锁,什么情况下会变成表锁?
答:一般情况下,innodb 只对指定的行进行锁定,其他进程还是可以对表中的其他行进行操作的,因此,这时候 innodb 加的就是行锁;
  但是,如果在执行一个 SQL 语句时 MySQL 不能确定要扫描的范围,InnoDB 表同样会锁全表,例如 update table set num=1 where name like“%aaa%”。

7. 使用过其他分支版本的数据库吗?percona,mariadb 等。对 percona 的 pxc 集群了解吗?

答:除了 oracle 旗下的 MySQL 外,我还使用过 percona server。percona 是在源生 mysql 的基础上,进行了优化和改进,所以 percona 的性能比 mysql 更好。目前,我知道 percona 提供免费的线程池功能,而社区版的 mysql 没有线程池的功能(当然,企业版的 mysql 是有线程池的,但是需要收费);另外 percona 还支持 NUMA 等功能。
  我熟悉 pxc,我曾经在测试环境搭建过 pxc,但是没有在生产上使用,因为目前使用 pxc 的企业不是很多,目前我知道搜狐在用 pxc。
  pxc 是摒弃 mysql 主从的概念,即对于 pxc 来说,每个节点都可以读写,并且写一份数据,其他节点会同时拥有,这是一种同步的复制方案(区别于 Mysql 主从的异步复制)

8. 除了 mysql,还了解过其他数据库吗?oracle,redis,mongodb 等。

答:除了 mysql,我还熟悉 oracle,对 oracle 有两年的使用经验。
  不过,我对 redis 和 mongodb 没有接触过,如果工作需要,我会学习他们。

9. 工作中遇到的最大的问题以及做的最好的工作?
答:自由发挥

10. 分库分表有没有用到,怎么实现的?

答:目前,根据我们的业务量,还没有使用分库分表。但是我有在关注 MySQL 的分布式方案,以前 mysql 分布式比较常用的方法是用阿里巴巴的 cobar,将一张表水平拆分成多份分别放入不同的库来实现表的水平拆分,或将不同的表放入不同的库,但是后来发现 cobar 有一个问题一直不能很好的解决。目前,我关注到有很多人用 mycat 替换了 cobar。

11. 新创建的数据库,需要调整哪些参数?
答:调整两方面的参数,即调整操作系统的和数据库 my.cnf 的:
  a)操作系统的参数
  linux 参数系统的默认参数很多都是很保守的,所以需要根据服务器性能将一些参数进行加大,如我会调整 nofile(最大文件句柄数)和 nproc(最大线程数),将其放到最大;我会将 vm.swappiness 设置为 0,表示最大限度使用物理内存,然后才是 swap 空间;我会将 net.ipv4.tcp_tw_reuse 设置为 1,表示将 netstat 中出现的 TIME-WAIT 状态的 sockets 重用到新的 TCP 连接上 … 等等
  b)数据库的参数
  对于 mysql 来说,my.cnf 的参数调整非常重要,如果采用默认值,那么是很难发挥 mysql 性能的。一般我会特别关注 innodb_buffer_pool 这个值,该值一般设置为物理内存的 70%, 这样就可以把 mysql 的表和索引最大限度的 load 到内存中,从而使 mysql 数据库性能得到大的提升;另外,我还特别关注 sync_binlog 和 innodb_flush_log_at_trx_commit 这两个值的设置,具体含义见上;还有 max_user_connections,我一般将该值设置为 2000;还有 innodb_lock_wait_timeout,看程序是长连接还是短连接,一般我会设置为 60 秒;还有 innodb_log_file_size,这个值也设置的大一点,我一般设置的为 500M 或 1G。

12. mysql 的权限怎么管理?
答:只给 insert,update,select 和 delete 四个权限即可。有时候 delete 都不给。

13. 有开发基础吗?
答:没有

14. 如果发现 CPU,或者 IO 压力很大,怎么定位问题?

答:
  1、首先我会用 top 命令和 iostat 命令,定位是什么进程在占用 cpu 和磁盘 io; 
  2、如果是 mysql 的问题,我会登录到数据库,通过 show full processlist 命令,看现在数据库在执行什么 sql 语句,是否有语句长时间执行使数据库卡住;
  3、执行 show innodb engine status 命令,查看数据库是否有锁资源争用;
  4、查看 mysql 慢查询日志,看是否有慢 sql;
  5、找到引起数据库占用资源高的语句,进行优化,该建索引的建索引,索引不合适的删索引,或者根据情况 kill 掉耗费资源的 sql 语句等

“mysql 相关的面试题有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计5058字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)