MYSQL面试题 TOP100
1. mysql有哪些存储引擎? 2. 什么是mysql 存储引擎? 3. mysql各存储引擎的特点是什么? 4. 如何查看 mysql 支持的存储引擎?创建表如何指定存储引擎? 5. 什么是 mysql 索引? 6. mysql 有哪些类型的索引? 7. mysql 如何启停? 8. 如何作数据备份? 9. 什么是mysql主从同步? 10. mysql主从同步的目的?为什么要做主从同步? 11. mysql 主从同步的原理是什么? 12. 如何配置 mysql 主从同步? 13. 什么是数据库事务? 14. 数据库事务的四个特性是什么? 15. mysql 事务隔离级别是什么? 16. 为什么要分库分表? 17. mysql分库分表的方案有哪些? 18. mysql分库分表后可能面临的问题 19. 什么是 mysql 慢查询? 20. 如何分析慢查询 sql? 21. mysql 有哪些常用的 sql 优化策略? 22. 有文本数据和整形数据,直接写文件和存入数据库,哪种方式更快? 23. mysql事务隔离级别有哪些,各自的含义是什么?MYSQL 默认的隔离级别是是什么? 24. 说一下MYSQL 常用存储引擎有哪些?各自优缺点 25. 高并发下,如何做到安全的修改同一行数据? 26. 说一下乐观锁和悲观锁是什么?INNODB 的行级锁 27. SQL 优化的一般步骤是什么?怎么看执行计划?如何理解其中各个字段的含义? 28. 数据库会死锁吗,举一个死锁的例子,mysql 怎么解决死锁? 29. 说一下Mysql 的索引原理,索引的类型有哪些?如何创建合理的索引?索引如何优化? 30. 简单说一下数据库中 BTREE 和 B+tree 区别? 31. ACID 是什么? 32. 说一下Mysql 怎么优化 table scan (全表扫描)? 33. 如何写 sql 能够有效的使用到复合索引? 34. 说一下mysql 中 in 和 exists 区别? 35. 数据库自增主键可能有哪些问题?

什么是 mysql 慢查询?

慢查询日志,顾名思义,就是查询慢的日志,是指mysql记录所有执行超过long_query_time参数设定的时间阈值的SQL语句的日志。该日志能为SQL语句的优化带来很好的帮助。默认情况下,慢查询日志是关闭的,要使用慢查询日志功能,首先要开启慢查询日志功能。

慢查询基本配置

slow_query_log 启动停止慢查询日志。
slow_query_log_file 指定慢查询日志得存储路径及文件(默认和数据文件放一起)。
long_query_time 指定记录慢查询日志SQL执行时间得阈值(单位:秒,默认10秒)。
log_queries_not_using_indexes 是否记录未使用索引的SQL。
log_output 日志存放的地方【TABLE】【FILE】【FILE,TABLE】。

配置了慢查询后,它会记录符合条件的SQL。包括:

  • 查询语句
  • 数据修改语句
  • 已经回滚得SQL

show VARIABLES like '%slow_query_log%'



show VARIABLES like '%slow_query_log_file%'



show VARIABLES like '%long_query_time%'



show VARIABLES like '%log_queries_not_using_indexes%'



show VARIABLES like 'log_output'

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

开启慢查询

MySQL的慢查询日志功能,默认是关闭的,需要手动开启

临时开启慢查询功能

在 MySQL 执行 SQL 语句设置,但是如果重启 MySQL 的话将失效。

查看是否开启慢查询功能


show VARIABLES like '%slow_query_log%'

  • 1

开启慢查询与设置超时参数


set global slow_query_log = ON;

set global long_query_time = 1;

  • 1
  • 2

永久开启慢查询功能

修改/etc/my.cnf配置文件,重启 MySQL, 这种永久生效。


[mysqld]

slow_query_log = ON

slow_query_log_file = /var/log/mysql/slow.log

long_query_time = 1

  • 1
  • 2
  • 3
  • 4

慢查询日志解读

从慢查询日志里面摘选一条慢查询日志,数据组成如下:


# Time: 190512 18:46:25

# User@Host: root[root] @  [202.105.151.121]  Id: 16869

# Query_time: 14.436060  Lock_time: 0.000102 Rows_sent: 238  Rows_examined: 238

use pmcenter;

SET timestamp=1557657985;

select * from `pmcenter`.`sys_operation_log`  limit 0,1000;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

格式说明
第一行:SQL查询执行的时间。
第二行:执行SQL查询的连接信息,用户名 、用户的IP信息、线程ID号。
第三行:记录了一些我们比较有用的信息,如下。

  • Query_time,这条SQL执行的时间,越长则越慢;
  • Lock_time,在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间;
  • Rows_sent,查询返回的行数;
  • Rows_examined,查询检查的行数,越长就当然越费时间。

第四行,应用的数据库。
第五行,设置时间戳,没有实际意义,只是和第一行对应执行时间。
第六行,及后面所有行(第二个# Time:之前),执行的sql语句记录信息,因为sql可能会很长。