Explain简介

本文主要讲述如何通过 explain 命令获取 select 语句的执行计划,通过 explain 我们可以知道以下信息:表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息。

下面是使用 explain 的例子:

在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL(如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中)。

mysql> explain select * from actor;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | actor | ALL | NULL | NULL | NULL | NULL | 2 | NULL |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+

在查询中的每个表会输出一行,如果有两个表通过 join 连接查询,那么会输出两行。表的意义相当广泛:可以是子查询、一个 union 结果等。

阅读全文 »

重装系统之后, 如果把原有的scoop文件夹粘贴回去user文件夹,然后在powershell中再次输入Windows下的软件管理神器:scoop文章中的安装命令,会得到一个Scoop is already installed错误,要想正确恢复scoop,根据官方回答,请按照以下步骤:

  1. 重装系统之前,先完整复制用户目录下的scoop文件夹到别的地方

  2. 重装系统之后,将scoop文件夹粘贴回去用户目录

  3. 在环境变量设置中,新建一个用户变量,名字为SCOOP,值为当前scoop文件夹的地址

    C:\Users\xxx\scoop
  4. 允许脚本执行

    set-executionpolicy remotesigned -s currentuser
  5. 双击用户变量中的path,新建一个路径,填入

    %SCOOP%\shims
  6. 管理员权限powershell中运行

    scoop reset *
  7. 即可恢复所有软件的正常使用

原文地址

什么是内存碎片?

你可以将内存碎片简单地理解为那些不可用的空闲内存。

举个例子:操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间,那这多余出来的 8 字节内存空间如果后续没办法再被分配存储其他数据的话,就可以被称为内存碎片。

内存碎片

Redis 内存碎片虽然不会影响 Redis 性能,但是会增加内存消耗。

阅读全文 »

性能状态关键指标

  • QPS,Queries Per Second:每秒查询数,一台数据库每秒能够处理的查询次数

  • TPS,Transactions Per Second:每秒处理事务数

  • Uptime:服务器已经运行的实际,单位秒

  • Questions:已经发送给数据库查询数

  • Com_select:查询次数,实际操作数据库的

  • Com_insert:插入次数

  • Com_delete:删除次数

  • Com_update:更新次数

  • Com_commit:事务次数

  • Com_rollback:回滚次数

-- 58228968
show global status like 'Questions';

-- 55155
show global status like 'Uptime';

-- QPS = Questions / Uptime
-- 1055 = 58228968 / 55155

-- 7689868
show global status like 'Com_commit';

-- 7737499
show global status like 'Com_rollback';

-- TPS = (Com_commit + Com_rollback) / Uptime
-- 280 = ( 7689868 + 7737499 ) / 55155

-- Com_delete 609
-- Com_insert 30627
-- Com_select 23580917
-- Com_update 3549397
show global status where Variable_name in('com_select','com_insert','com_delete','com_update');
SELECT SLEEP(1);
-- Com_delete 609
-- Com_insert 30629
-- Com_select 23583220
-- Com_update 3549478
show global status where Variable_name in('com_select','com_insert','com_delete','com_update');

-- ( (609 - 609) + (30629 - 30627) + (3549478 - 3549397) ) = 83
-- ( 23583220 - 23580917 ) = 2303

转载:Spring 5 AOP 默认改用 CGLIB 了?从现象到源码的深度分析

Spring5 AOP 默认使用 Cglib 了?我第一次听到这个说法是在一个微信群里:

真的假的?查阅文档

刚看到这个说法的时候,我是保持怀疑态度的。

大家都知道 Spring5 之前的版本 AOP 在默认情况下是使用 JDK 动态代理的,那是不是 Spring5 版本真的做了修改呢?于是我打开 Spring Framework 5.x 文档,再次确认了一下:

文档地址:https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/core.html#aop

Spring Framework 5.x 文档

简单翻译一下。Spring AOP 默认使用 JDK 动态代理,如果对象没有实现接口,则使用 CGLIB 代理。当然,也可以强制使用 CGLIB 代理。

阅读全文 »