MySQL - 常用存储引擎区别总结(2020最新版)
112.说一下 mysql 的行锁和表锁?深入理解数据库行锁与表锁
MySQL中的锁(表锁、行锁)
全网最全的一篇数据库MVCC详解,不全我负责
面试官:你了解乐观锁和悲观锁吗?
114.mysql 问题排查都有哪些手段?1.使用 show processlist 命令查看当前所有连接信息。
(1)processlist命令的输出结果显示了有哪些线程在运行。
(2)可以查看当前所有的连接数、查看当前的连接状态、帮助识别出有问题的查询语句等。
(3)如果是root帐号,能看到所有用户的当前连接。如果是其他普通帐号,则只能看到自己占用的连接。Show processlist只能列出当前100条。如果想全部列出,可以使用SHOW FULL PROCESSLIST命令
(4)各列含义
①.id列,用户登录mysql时,系统分配的"connection_id",可以使用函数connection_id()查看
②.user列,显示当前用户。如果不是root,这个命令就只显示用户权限范围的sql语句
③.host列,显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题语句的用户
④.db列,显示这个进程目前连接的是哪个数据库
⑤.command列,显示当前连接的执行的命令,一般取值为休眠(sleep),查询(query),连接(connect)等
⑥.time列,显示这个状态持续的时间,单位是秒
⑦.state列,显示使用当前连接的sql语句的状态,很重要的列。state描述的是语句执行中的某一个状态。一个sql语句,以查询为例,可能需要经过copying to tmp table、sorting result、sending data等状态才可以完成
⑧.info列,显示这个sql语句,是判断问题语句的一个重要依据
2.使用 explain 命令查询 SQL 语句执行计划。
(1)EXPLAIN 命令:
可以对 SELECt 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化。EXPLAIN 命令用法十分简单, 在 SELECT 语句前加上 Explain 就可以了。例如:EXPLAIN SELECT * from user_info WHERe id < 300;
(2)各列的含义如下:
id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.
select_type: SELECT 查询的类型.
table: 查询的是哪个表
partitions: 匹配的分区
type: join 类型
possible_keys: 此次查询中可能选用的索引
key: 此次查询中确切使用到的索引
key_len: 这个值可以判断索引的长度,在组合索引里面可以更清楚的了解到了哪部分字段使用到了索引
ref: 哪个字段或常数与 key 一起被使用
rows: 显示此查询一共扫描了多少行. 这个是一个估计值.
filtered: 表示此查询条件所过滤的数据的百分比
extra: 额外的信息
(3)重要字段详解
①select_type
SIMPLE:表示此查询不包含 UNIOn 查询或子查询
PRIMARY:表示此查询是最外层的查询
UNIOn:表示此查询是 UNIOn 的第二或随后的查询
DEPENDENT UNIOn:UNIOn 中的第二个或后面的查询语句, 取决于外面的查询
UNIOn RESULT:UNIOn 的结果
SUBQUERY:子查询中的第一个 SELECT
DEPENDENT SUBQUERY: 子查询中的第一个 SELECT, 取决于外面的查询. 即子查询依赖于外层查询的结果.
最常见的查询类别应该是 SIMPLE 了, 比如当我们的查询没有子查询, 也没有 UNIOn 查询时, 那么通常就是 SIMPLE 类型
②type
type 字段比较重要, 它提供了判断查询是否高效的重要依据依据. 通过 type 字段, 我们判断此次查询是 全表扫描 还是 索引扫描 等.
type取值:
system: 表中只有一条数据. 这个类型是特殊的 const 类型
const: 针对主键或唯一索引的等值查询扫描, 最多只返回一行数据. const 查询速度非常快, 因为它仅仅读取一次即可.
eq_ref: 此类型通常出现在多表的 join 查询, 表示对于前表的每一个结果, 都只能匹配到后表的一行结果. 并且查询的比较操作通常是 =, 查询效率较高
ref: 此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了 最左前缀 规则索引的查询.
range: 表示使用索引范围查询, 通过索引字段范围获取表中部分数据记录. 这个类型通常出现在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中。当 type 是 range 时, 那么 EXPLAIN 输出的 ref 字段为 NULL, 并且 key_len 字段是此次查询中使用到的索引的最长的那个.
index: 表示全索引扫描(full index scan), 和 ALL 类型类似, 只不过 ALL 类型是全表扫描, 而 index 类型则仅仅扫描所有的索引, 而不扫描数据。index 类型通常出现在: 所要查询的数据直接在索引树中就可以获取到, 而不需要扫描数据. 当是这种情况时, Extra 字段 会显示 Using index.
ALL: 表示全表扫描, 这个类型的查询是性能最差的查询之一. 通常来说, 我们的查询不应该出现 ALL 类型的查询, 因为这样的查询在数据量大的情况下, 对数据库的性能是巨大的灾难. 如一个查询是 ALL 类型查询, 那么一般来说可以对相应的字段添加索引来避免.
在全表扫描时, possible_keys 和 key 字段都是 NULL, 表示没有使用到索引, 并且 rows 十分巨大, 因此整个查询效率是十分低下的
type 类型的性能比较:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
③key:
key = NULL:表示没有使用索引
key = primary :表示使用了主键
key一般=使用了主键/索引的名字
3.开启慢查询日志,查看慢查询的 SQL。
(1)查看是否开启慢查询日志:show variables like ‘slow_query_log’
(2)查询是否把没有设置索引的sql记录日志中:show variables like ‘%log%’
如果:log_queries_not_using_indexes:OFF,
需要打开set global log_queries_not_using_indexes=on
(3)确认超过多长时间过后记录到慢查询日志里面:show variable like ‘long_query_time’
(4)开启慢查询日志:set global slow_query_log=on
(5)查看路径:slow variables like ‘slow%’
MySQL 性能优化的最佳20多条经验分享
有兴趣的可以看一看《高性能MySQL》
Java内存区域-JVM的主要组成部分及其作用
117.说一下 jvm 运行时数据区?JVM运行时数据区(详解+面试)
118.说一下堆栈的区别?一文读懂堆与栈的区别
119.队列和栈是什么?有什么区别?数据结构-队列和栈有什么区别
120.什么是双亲委派模型?Java双亲委派模型:为什么要双亲委派?如何打破它?破在哪里?



