bingo 发布的文章

netbeans IDE 快捷键

一、常用快捷键:

1、在文件中查找指定内容 Ctrl+F
2、在文件中替换指定内容 Ctrl+H
3、在整个项目中查找指定内容 Ctrl+Shift+f
4、自动复制整行代码 Ctrl+Shift+上/下方向键
5、注释/取消注释:ctrl+/ 此功能支持多行注释,但首先需选中所要注释行
6、自动移动代码 Alt+Shift+上/下方向键
7、被选定的代码格式化 Alt+Shift+F
8、将插入记号移至匹配的方括号 Ctrl-[
9、Ctrl+数字键盘上的 - 折叠(隐藏)代码块
10、Ctrl+数字键盘上的 + 展开已折叠的代码块
11、完成代码:ctrl+ //任何地方按下此组合键,均会提示相应的参考字段;
12、错误提示:alt + enter //顾名思义,当系统报错时,按下此组合可以查看系统提示;
13、自动完成字符串: ctrl+L ctrl+k //后者(Ctrl+L没用过)组合键自动打出字符串,每按一次打出一个新串,串序自下向上;
14、右键:修复自动导入
15、右键:格式化代码风格
16、导入所需包:ctrl+shift+i
17、格式化代码:alt+shift+F
18、注释/取消注释:ctrl+/,此功能支持多行注释,但首先需选中所要注释行
19、psvm+Tab 生成Main方法20、sout + Tab //生成输出语句
21、ctrl+enter //增加空白行,光标不移动;
22、alt+shift+F //格式,不太懂什么意思,高手可以解释下;
23、alt+enter //不太会用;
24、Alt+insert //插入代码(包括构造函数,setter和getter方法等);
25、Ctrl+Tab //在打开的源文件中进行切换;
26、Ctrl+O或Ctrlt+单击 //转到源,即按住Ctrl键然后单击某源就转可以打开源代码;
27、Alt+Shift+O //转到类;
28、Shift+F6 //运行当前程序
29、Ctrl+Shift+F5: //调试当前程序
30、Ctrl+F //快速查找代码中的字符串
31、Ctrl+Delete //也是一个比较常用的shortcut,大家可以试试;
32、Ctrl+Shift+Right //向右逐个选中
33、Ctrl+Shift+Left //向左逐个选中
34、Ctrl+Shift+UP/DOWN //复制当前行到下一行,光标不动
35、新建项目:Ctrl-Shift-N
36、自动格式化代码:Alt-Shift-F
37、 保存文件:Ctrl-S
38、代码补全:Ctrl-"
39、代码自动完成:默认Tab (我个人更喜欢空格键,可以在“选项-Editor”里修改)
40、显示 Javadoc:Alt-F1 36 、运行主项目:F6
41、编译主项目:Shift-F11
42、运行文件:Shift-F6
43、新建 JUnit 测试:Ctrl-Shift-U
44、运行测试:Alt-F6
45、设置断点:Ctrl-F8
46、调试主项目:Ctrl-F5
47、调试文件:Ctrl-Shift-F5
48、逐步调试:F7
49、代码自动完成:Ctrl-",这个可以自动完成诸如创建对象的代码
50、代码自动插入:Alt-Insert,这个可以自动插入Getter-Setter方法的代码
51、按照提示操作:Alt+Enter,例如:插入所需要的包或删除未使用的引入包
52、自动修复引入包:Ctrl-Shift-I
53、单独修复引入包:Alt-Shift-I
54、自动粘贴代码:Ctrl-Shift-上/下方向键
55、自动移动代码:Alt-Shift-上/下方向键
56、代码模板实时自动补全:Tab
57、变量重命名:Ctrl-R
58、Javadoc弹出框提示:Ctrl-Shift-Space
59、变量重命名:Ctrl+R

二、查找、搜索和替换

61、Ctrl-F3 搜索位于插入点的词
62、F3/Shift-F3 在文件中查找下一个/上一个
63、Ctrl-F/H 在文件中查找/替换
64、Alt-F7 查找使用实例
65、Ctrl-Shift-P 在项目中查找
66、Alt-Shift-U 查找使用实例结果
67、Alt-Shift-H 关闭搜索结果突出显示
68、Alt-Shift-L 跳转列表中的下一个(所有文件)
69、Alt-Shift-K 跳转列表中的上一个(所有文件)
70、Ctrl-R 重新装入窗体
71、Alt-U-U 将选定内容转换为大写
72、Alt-U-L 将选定内容转换为小写
73、Alt-U-R 对选定内容切换大小写

三、在源代码中导航

74、Alt-Shift-O 转至类
75、Alt-Shift-E 转至 JUnit 测试
76、Alt-O 转至源代码
77、Alt-G 转至声明
78、Ctrl-B 转至超级实现
79、Alt-K/Alt-L 后退/前进
80、Ctrl-G 转至行
81、Ctrl-F2 切换添加/删除书签
82、F2/Shift-F2 下一个/上一个书签
83、F12/Shift-F12 下一个/上一个使用实例/编译错误
84、Ctrl-Shift-1/2/3 在“项目”/“文件”/“收藏夹”中选择
85、Ctrl-[ 将插入记号移至匹配的方括号
86、Ctrl-^ Ctrl-[(法语/比利时语键盘)

四、用Java编码

87、Ctrl-I 覆盖方法
88、Alt-Shift-F/I 修复全部/选定类的导
89、Alt-Shift-W 以 try-catch 块围绕
90、Ctrl-Shift-F 重新设置选定内容的
91、Ctrl-D/Ctrl-T 左移/右移一个制表符
92、Ctrl-Shift-T/D 添加/撤消注释行 ("//
93、Ctrl-L/K 插入下一个/上一个匹
94、Esc/Ctrl-空格键 关闭/打开代码完成
95、Ctrl-M 选择下一个参数
96、Shift-空格键 输入空格,不展开缩写
97、Alt-F1/Shift-F1 显示/搜索 Javadoc
98、Ctrl-Shift-M 提取方法
99、Alt-U-G 将 “get” 放置到标识符前面
100、Alt-U-S 将 “set” 放置到标识符前面
101、Alt-U-I 将 “is” 放置到标识符前面
102、Ctrl-Backspace/Del 删除上一个/当前词
103、Ctrl-E 删除当前行
104、Ctrl-J-S/E 开始/结束录制宏
105、Ctrl-Shift-J 插入国际化字符串
106、Ctrl-数字键盘上的 - 折叠(隐藏)代码块
107、Ctrl-数字键盘上的 + 展开已折叠的代码块
108、Ctrl-Shift-数字键盘上的 - 折叠所有代码块
109、Ctrl-Shift-数字键盘上的 + 展开所有代码块
110、Alt-Enter 显示建议/提示

五、打开和切换视图

111、Ctrl-Shift-0 显示“搜索结果”窗口
112、Ctrl-0 显示源代码编辑器
113、Ctrl-1 显示“项目”窗口
114、Ctrl-2 显示“文件”窗口
115、Ctrl-3 显示“收藏夹”窗口
116、Ctrl-4 显示“输出”窗口
117、Ctrl-5 显示“运行环境”窗口
118、Ctrl-6 显示“待做事项”窗口
119、Ctrl-7 显示“导航”窗口
120、Ctrl-Shift-7 显示“属性”对话框
121、Ctrl-Shift-8 显示组件面板
122、Ctrl-8 显示“版本控制”窗口
123、Ctrl-9 显示“VCS 输出”窗口
124、Shift-F4 显示“文档”对话框
125、Alt-向左方向键 移动到左侧窗口
126、Alt-向右方向键 移动到右侧窗口
127、Ctrl-Tab (Ctrl-`) 在打开的文档之间切换
128、Shift-Escape 最大化窗口(切换)
129、Ctrl-F4/Ctrl-W 关闭当前选定的窗口
130、Ctrl-Shift-F4 关闭所有窗口
131、Shift-F10 打开上下文菜单

六、编译、测试和运行

132、F9 编译选定的包或文件
133、F11 生成主项目
134、Shift-F11 清理并生成主项目
135、Ctrl-Q 设置请求参数
136、Ctrl-Shift-U 创建 JUnit 测试
137、Ctrl-F6/Alt-F6 为文件/项目运行JUnit测试
138、F6/Shift-F6 运行主项目/文件

七、调试

139、F5 开始调试主项目
140、Ctrl-Shift-F5 开始调试当前文件
141、Ctrl-Shift-F6 开始为文件调试测试 (JU
142、Shift-F5/Ctrl-F5 停止/继续调试会话
143、F4 运行到文件中的光标位置
144、F7/F8 步入/越过
145、Ctrl-F7 步出
146、Ctrl-Alt-向上方向键 转至被调用的方法
147、Ctrl-Alt-向下方向键 转至调用方法
148、Ctrl-F9 计算表达式的值
149、Ctrl-F8 切换断点
150、Ctrl-Shift-F8 新建断点
151、Ctrl-Shift-F7 新建监视
152、Ctrl-Shift-5 显示 HTTP 监视器
153、Ctrl-Shift-0 显示“搜索结果”窗口
154、Alt-Shift-1 显示“局部变量”窗口
155、Alt-Shift-2 显示“监视”窗口
156、Alt-Shift-3 显示“调用栈”窗口
157、Alt-Shift-4 显示“类”窗口
158、Alt-Shift-5 显示“断点”窗口
159、Alt-Shift-6 显示“会话”窗口
160、Ctrl-Shift-6 切换到“执行”窗口
161、Alt-Shift-7 切换到“线程”窗口
162、Alt-Shift-8 切换到“源”窗口

http://www.itcast.cn/news/20160914/17311956109.shtml

1512719519101.jpg

PHP 异常处理

PHP中什么是异常:
  程序在运行中出现不符合预期的情况,允许发生(你也不想让他出现不正常的情况)但他是一种不正常的情况,按照我们的正常逻辑本不该出的错误,但仍然会出现的错误,属于逻辑和业务流程的错误,而不是编译或者语法上的错误。

  PHP中什么是错误:
  属于php脚本自身的问题,大部分情况是由错误的语法,服务器环境导致,使得编译器无法通过检查,甚至无法运行的情况。warning、notice都是错误,只是他们的级别不同而已,并且错误是不能被try-catch捕获的。

**https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html**

Try, throw 和 catch简介:

Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象

设置顶级异常处理:set_exception_handler('myException');
创建自定义异常处理:创建自定义的异常处理程序,该类必须是 exception 类的一个扩展。

    Exception {
/* 属性 */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* 方法 */
public __construct ([ string $message = "" [, int $code = 0 [, Throwable $previous = NULL ]]] )
final public string getMessage ( void )
final public Throwable getPrevious ( void )
final public int getCode ( void )
final public string getFile ( void )
final public int getLine ( void )
final public array getTrace ( void )
final public string getTraceAsString ( void )
public string __toString ( void )
final private void __clone ( void )
}

上为系统异常类的基础方法.

PHP 错误报警级别:

值 常量 描述
2 E_WARNING 非致命的 run-time 错误。不暂停脚本执行。
8 E_NOTICE Run-time 通知。脚本发现可能有错误发生,但也可能在脚本正常运行时发生。
256 E_USER_ERROR 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
512 E_USER_WARNING 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
1024 E_USER_NOTICE 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
4096 E_RECOVERABLE_ERROR 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191 E_ALL 所有错误和警告,除级别 E_STRICT 以外。(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)

Mysql NULL 和 ''

陷阱一:空值不一定为空

  空值是一个比较特殊的字段。在MySQL数据库中,在不同的情形下,空值往往代表不同的含义。这是MySQL数据库的一种特性。如在普通的字段中(字符型的数据),空值就是表示空值。但是如果将一个空值的数据插入到TimesTamp类型的字段中,空值就不一定为空。此时为出现什么情况呢

  我先创建了一个表。在这个表中有两个字段:User_id(其数据类型是int)、Date(其数据类型是TimesTamp)。现在往这个表中插入一条记录,其中往Date字段中插入的是一个NULL空值。可是当我们查询时,其结果显示的却是插入记录的当前时间。这是怎么一回事呢?其实这就是在MySQL数据库中执行SQL语句时经常会遇到的一个陷阱:空值不一定为空。在操作时,明明插入的是一个空值的数据,但是最后查询得到的却不是一个空值。

  在MySQL数据库中,NULL对于一些特殊类型的列来说,其代表了一种特殊的含义,而不仅仅是一个空值。对于这些特殊类型的列,各位读者主要是要记住两个。一个就是笔者上面举的TimesTamp数据类型。如果往这个数据类型的列中插入Null值,则其代表的就是系统的当前时间。另外一个是具有auto_increment属性的列。如果往这属性的列中插入Null值的话,则系统会插入一个正整数序列。而如果在其他数据类型中,如字符型数据的列中插入Null的数据,则其插入的就是一个空值。

  陷阱二:空值不一定等于空字符

  在MySQL中,空值(Null)与空字符(’’)相同吗?答案是否定的。

  在同一个数据库表中,同时插入一个Null值的数据和一个’’空字符的数据,然后利用Select语句进行查询。显然其显示的结果是不相同的。从这个结果中就可以看出,空值不等于空字符。这就是在MySQL中执行SQL语句遇到的第二个陷阱。在实际工作中,空值数据与空字符往往表示不同的含义。数据库管理员可以根据实际的需要来进行选择。如对于电话号码等字段,可以默认设置为空值(表示根本不知道对方的电话号码)或者设置为空字符(表示后来取消了这个号码)等等。由于他们在数据库中会有不同的表现形式,所以数据库管理员需要区别对待。笔者更加喜欢使用空值,而不是空字符。这主要是因为针对空值这个数据类型有几个比较特殊的运算字符。如果某个字段是空字符,数据库中是利用字段名称来代替。相反,如果插入的是空值,则直接显示的是NULL。这跟其他数据库的显示方式也是不同的。

  一是IS NULL 和IS NOT NULL关键字。如果要判断某个字段是否含用空值的数据,需要使用特殊的关键字。其中前者表示这个字段为空,后者表示这个字段为非空。在Select语句的查询条件中这两个关键字非常的有用。如需要查询所有电话号码为空的用户(需要他们补充电话号码信息),就可以在查询条件中加入is not null关键字。

  二是Count等统计函数,在空值上也有特殊的应用。如现在需要统计用户信息表中有电话号码的用户数量,此时就可以使用count函数、同时将电话号码作为参数来使用。因为在统计过程中,这个函数会自动忽略空值的数据。此时统计出来的就是有电话号码的用户信息。如果采用的是空字符的数据,则这个函数会将其统计进去。统计刚才建立的两条记录时,系统统计的结果是1,而不是2。可见系统自动将Null值的数据忽略掉了。

判断NULL用is null 或者 is not null。 sql语句里可以用ifnull函数来处理
判断空字符串‘’,要用 ='' 或者 <>''。sql语句里可以用if(col,col,0)处理,即:当col为true时(非null,及非'')显示,否则打印0

来至某一处:
首先,我们要搞清楚“空值” 和 “NULL” 的概念:
1、空值是不占用空间的
2、mysql中的NULL其实是占用空间的,下面是来自于MYSQL官方的解释
“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”
PS:打个比方来说,你有一个杯子,空值代表杯子是真空的,NULL代表杯子中装满了空气,虽然杯子看起来都是空的,但是区别是很大的。

PHP7 新特性

  1. 运算符(NULL 合并运算符)

$a = $_GET['a'] ?? 1;

相当于:

$a = isset($_GET['a']) ? $_GET['a'] : 1;

我们知道三元运算符是可以这样用的:

$a ?: 1

但是这是建立在 $a 已经定义了的前提上。新增的 ?? 运算符可以简化判断。

  1. 函数返回值类型声明

function arraysSum(array ...$arrays): array

{

  return array_map(function(array $array): int {

    return array_sum($array);

  }, $arrays);

}

print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

以上例程会输出:

Array
(

[0] => 6
[1] => 15
[2] => 24

)

强制模式:

function foo($a) : int

{

  return $a;

}

foo(1.0);

以上代码可以正常执行,foo 函数返回 int 1,没有任何错误。

严格模式:

declare(strict_types=1);

function foo($a) : int

{

  return $a;

}

foo(1.0);

PHP Fatal error: Uncaught TypeError: Return value of foo() must be of the type integer, float returned in test.php:6

在声明之后,就会触发致命错误。

  1. 标量类型声明

PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。

官方示例:

// Coercive mode

function sumOfInts(int ...$ints)

{

  return array_sum($ints);

}

var_dump(sumOfInts(2, '3', 4.1));

以上例程会输出:

int(9)
需要注意的是上文提到的严格模式的问题在这里同样适用:强制模式(默认,既强制类型转换)下还是会对不符合预期的参数进行强制类型转换,严格模式下则触发 TypeError 的致命错误。

  1. use 批量声明

PHP 7 中 use 可以在一句话中声明多个类或函数或 const 了:

use some/namespace/{ClassA, ClassB, ClassC as C};

use function some/namespace/{fn_a, fn_b, fn_c};

use const some/namespace/{ConstA, ConstB, ConstC};

但还是要写出每个类或函数或 const 的名称(并没有像 python 一样的 from some import * 的方法)。

需要留意的问题是:如果你使用的是基于 composer 和 PSR-4 的框架,这种写法是否能成功的加载类文件?其实是可以的,composer 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对其没有影响。

  1. 太空舱操作符(组合比较操作符)

太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。 比较的原则是沿用 PHP 的常规比较规则进行的。

// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

  1. 通过 define() 定义常量数组

Array 类型的常量现在可以通过 define() 来定义。在 PHP5.6 中仅能通过 const 定义。

define('ANIMALS', [

'dog',
'cat',
'bird'

]);

echo ANIMALS[1]; // outputs "cat"
?>

  1. 迭代器

通过添加 yield 关键字支持了 generators,Generators 提供了一个更简单的方法实现迭代器,不需要实现 Iterator 接口

$gen = (function() {

yield 1;
yield 2;

return 3;

})();

foreach ($gen as $val) {

echo $val, PHP_EOL;

}

echo $gen->getReturn(), PHP_EOL;

以上例程会输出:

1
2
3

  1. 匿名类

现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义。

interface Logger {

public function log(string $msg);

}

class Application {

private $logger;

public function getLogger(): Logger {
     return $this->logger;
}

public function setLogger(Logger $logger) {
     $this->logger = $logger;
}

}

$app = new Application;
$app->setLogger(new class implements Logger {

public function log(string $msg) {
    echo $msg;
}

});

var_dump($app->getLogger());
以上例程会输出:

object(class@anonymous)#2 (0) {
}

详细文档可以参考 匿名类.

  1. 闭包 Closure::call()

Closure::call() 现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用它。

class A {private $x = 1;}

// Pre PHP 7 code
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // intermediate closure
echo $getX();

// PHP 7+ code
$getX = function() {return $this->x;};
echo $getX->call(new A);

以上例程会输出:

1
1

Explain

763020-20160417142105895-121211600.png

1)、id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询。

2)、select_type列常见的有:
A:simple:表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple,且只有一个
B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个
C:union:union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union
D:dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响
E:union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null
F:subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery
G:dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响
H:derived:from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select

3)、table
显示的查询表名,如果查询使用了别名,那么这里显示的是别名,如果不涉及对数据表的操作,那么这显示为null,如果显示为尖括号括起来的<derived N>就表示这个是临时表,后边的N就是执行计划中的id,表示结果来自于这个查询产生。如果是尖括号括起来的<union M,N>,与<derived N>类似,也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集。

4)、type
依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL,除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引
A:system:表中只有一行数据或者是空表,且只能用于myisam和memory表。如果是Innodb引擎表,type列在这个情况通常都是all或者index
B:const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const。其他数据库也叫做唯一索引扫描
C:eq_ref:出现在要连接过个表的查询计划中,驱动表只返回一行数据,且这行数据是第二个表的主键或者唯一索引,且必须为not null,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref
D:ref:不像eq_ref那样要求连接顺序,也没有主键和唯一索引的要求,只要使用相等条件检索时就可能出现,常见与辅助索引的等值查找。或者多列主键、唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据不唯一的等值查找就可能出现。
E:fulltext:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引
F:ref_or_null:与ref方法类似,只是增加了null值的比较。实际用的不多。
G:unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值
H:index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重。
I:range:索引范围扫描,常见于使用>,<,is null,between ,in ,like等运算符的查询中。
J:index_merge:表示查询使用了两个以上的索引,最后取交集或者并集,常见and ,or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由于要读取所个索引,性能可能大部分时间都不如range
K:index:索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。
L:all:这个就是全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录。

5)、possible_keys
查询可能使用到的索引都会在这里列出来

6)、key
查询真正使用到的索引,select_type为index_merge时,这里可能出现两个以上的索引,其他的select_type这里只会出现一个。

7)、key_len
用于处理查询的索引长度,如果是单列索引,那就整个索引长度算进去,如果是多列索引,那么查询不一定都能使用到所有的列,具体使用到了多少个列的索引,这里就会计算进去,没有使用到的列,这里不会计算进去。留意下这个列的值,算一下你的多列索引总长度就知道有没有使用到所有的列了。要注意,mysql的ICP特性使用到的索引不会计入其中。另外,key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到key_len中。

8)、ref
如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func

9)、rows
这里是执行计划中估算的扫描行数,不是精确值

10)、extra
这个列可以显示的信息非常多,有几十种,常用的有
A:distinct:在select部分使用了distinc关键字
B:no tables used:不带from字句的查询或者From dual查询
C:使用not in()形式子查询或not exists运算符的连接查询,这种叫做反连接。即,一般连接查询是先查询内表,再查询外表,反连接就是先查询外表,再查询内表。
D:using filesort:排序时无法使用到索引时,就会出现这个。常见于order by和group by语句中
E:using index:查询时不需要回表查询,直接通过索引就可以获取查询的数据。
F:using join buffer(block nested loop),using join buffer(batched key accss):5.6.x之后的版本优化关联查询的BNL,BKA特性。主要是减少内表的循环数量以及比较顺序地扫描查询。
G:using sort_union,using_union,using intersect,using sort_intersection:
using intersect:表示使用and的各个索引的条件时,该信息表示是从处理结果获取交集
using union:表示使用or连接各个使用索引的条件时,该信息表示从处理结果获取并集
using sort_union和using sort_intersection:与前面两个对应的类似,只是他们是出现在用and和or查询信息量大时,先查询主键,然后进行排序合并后,才能读取记录并返回。
H:using temporary:表示使用了临时表存储中间结果。临时表可以是内存临时表和磁盘临时表,执行计划中看不出来,需要查看status变量,used_tmp_table,used_tmp_disk_table才能看出来。
I:using where:表示存储引擎返回的记录并不是所有的都满足查询条件,需要在server层进行过滤。查询条件中分为限制条件和检查条件,5.6之前,存储引擎只能根据限制条件扫描数据并返回,然后server层根据检查条件进行过滤再返回真正符合查询的数据。5.6.x之后支持ICP特性,可以把检查条件也下推到存储引擎层,不符合检查条件和限制条件的数据,直接不读取,这样就大大减少了存储引擎扫描的记录数量。extra列显示using index condition
J:firstmatch(tb_name):5.6.x开始引入的优化子查询的新特性之一,常见于where字句含有in()类型的子查询。如果内表的数据量比较大,就可能出现这个
K:loosescan(m..n):5.6.x之后引入的优化子查询的新特性之一,在in()类型的子查询中,子查询返回的可能有重复记录时,就可能出现这个

除了这些之外,还有很多查询数据字典库,执行计划过程中就发现不可能存在结果的一些提示信息

11)、filtered
使用explain extended时会出现这个列,5.7之后的版本默认就有这个字段,不需要使用explain extended了。这个字段表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数。

作者:小萝卜

出处:小萝卜的博客 http://www.cnblogs.com/xiaoboluo768/

感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

CGI、FastCGI和PHP-FPM关系图解[转]

806469-20160927081043813-1021846367.png
806469-20160927081047438-329876066.png

当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程,接下来再引出这些概念,就好理解多了.

CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。
FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。同样,SCGI 协议与 FastCGI 类似。
PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。
PHP-FPM:是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。
Web Server: 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等服务器,
Web Application: 一般指PHP、Java、Asp.net等应用程序。
806469-20160927081051563-2122907811

Web Server启动时载入FastCGI进程管理器(Apache Module或IIS ISAPI等)
FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可建多个php-cgi),并等待来自Web Server的连接。
当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
FastCGI子进程完成处理后,将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待,并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。
FastCGI与CGI特点:

对于CGI来说,每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展,并重初始化全部数据结构。而使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。
由于FastCGI是多进程,所以比CGI多线程消耗更多的服务器内存,php-cgi解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。
806469-20160927081052328-1825068850.png

1、CGI是公共网关接口,是HTTP服务与其它程序“交谈”的工具。
2、fastcgi是一个常驻行 CGI ,是CGI的一个扩展,让CGI解释器常驻内存,提供性能。
3、php-cgi是fastcgi的php版本。
4、php-fpm是php-cgi的管理器,能够实现平滑更改php.ini的配置。

转载