mysql中explain用法和结果的含义

mysql语句分析,查看索引使用情况

explain  select * from user

 

explain extended select * from user

id SELECT识别符。这是SELECT的查询序列号
select_type SELECT类型,可以为以下任何一种:

  • SIMPLE:简单SELECT(不使用UNION或子查询)
  • PRIMARY:最外面的SELECT
  • UNION:UNION中的第二个或后面的SELECT语句
  • DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
  • UNION RESULT:UNION 的结果
  • SUBQUERY:子查询中的第一个SELECT
  • DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
  • DERIVED:导出表的SELECT(FROM子句的子查询)
table 输出的行所引用的表
type 联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:

  • system:表仅有一行(=系统表)。这是const联接类型的一个特例。
  • const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!
  • eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。
  • ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。
  • ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。
  • index_merge:该联接类型表示使用了索引合并优化方法。
  • unique_subquery:该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
  • index_subquery:该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
  • range:只检索给定范围的行,使用一个索引来选择行。
  • index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
  • ALL:对于每个来自于先前的表的行组合,进行完整的表扫描。
possible_keys 指出MySQL能使用哪个索引在该表中找到行
key 显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。
key_len 显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。
ref 显示使用哪个列或常数与key一起从表中选择行。
rows 显示MySQL认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数。
filtered 显示了通过条件过滤出的行数的百分比估计值。
Extra 该列包含MySQL解决查询的详细信息

  • Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
  • Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
  • range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
  • Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。
  • Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
  • Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。
  • Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。
  • Using sort_union(…), Using union(…), Using intersect(…):这些函数说明如何为index_merge联接类型合并索引扫描。
  • Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查 询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。

文章来源:https://blog.csdn.net/u010061060/article/details/52473244/

在 Redmine 中整合 Git 版本库

Redmine 的官方 Wiki 里面有许多文档可能过时了,可能并非 Best Practice 。关于如何在 Redmine 中整合 Git 版本库,这篇文章 是最简单的。我把原文做了一些修改,使用中文提供在这里:

[TOC]

我的配置

  • 我的 redmine 用户名称为: redmine ;
  • 我的安装目录在 /srv/redemine ,我的仓库文件夹为 /srv/redmine/repos
  • git 的仓库的地址为 ssh://redmine@git.mysite.com:29418/a.gitssh://redmine@git.mysite.com:29418/b.git (是的,我使用 Gerrit)。

Redmine 使用的方法,就是从远程版本库中 Clone 一个版本库,然后把所有的提交信息写入 Redmine 的数据库中。

第一步: Clone 版本库

首先使用 MIRROR 模式来 Clone 我们的版本库。Mirror 模式的版本库将仅包含提交信息而不包含具体提交的文件。这会让我们 Clone 的内容比较小,速度足够快。

1
2
3
4
sudo -su redmine
cd /srv/redmine/repos/
git clone --mirror ssh://redmine@git.mysite.com:29418/a.git
git clone --mirror ssh://redmine@git.mysite.com:29418/b.git

接下来需要让 Redmine 中配置版本库的路径。

第二步: 配置 Redmine

进入 “administration > project -> repositories” 界面开启版本库支持。然后进入 “project -> settings -> repositories” 增加版本库配置:

  • Type: GIT
  • Main-repository: 是否是主版本库。主版本库只能有一个。
  • Name: 一般是使用和版本库相同的名称。
  • Path: 版本库在服务器上的绝对路径。/srv/redmine/repos/a.git

版本库可以增加多个,可以再加入一个版本库指向 b.git 。但是主版本库只能有一个,如果两个都设置成了主版本库,那么生效的是最新的那一个。

配置完成后,进入项目的版本库界面就能看到版本库的提交历史记录和版本树了。

如果你的版本库有成百上千次提交,那么第一次打开版本库界面可能会等上一段时间,因为 Redmine 在把版本库中的提交信息写入数据库。此时最好不要刷新界面。

为了避免上面的情况,可以做离线刷新: Attaching an existing repository to a project

第三步:定时刷新版本库

Redmine 并不会主动去刷新版本库。我们可以使用 GitHook 的方式来更新版本库,也可以直接用 Crontab 来实现。

下面的代码设定每隔 5 分钟去远程仓库同步一次。

1
2
3
4
5
6
7
sudo crontab -e -u redmine
# 如果当前处于 redmine 账户下,也可以使用
crontab -e

# 选择你喜欢的编辑器,在打开的编辑器中写入下面的内容
*/5 * * * * git -C /srv/redmine/repos/a fetch --all
*/5 * * * * git -C /srv/redmine/repos/b fetch --all

设置默认显示的版本库分支

Redmine 默认显示的提交信息是仓库的默认分值(一般为 master 分支)。如果你使用了 git flow 工作流 ,那么很可能你会希望默认分支是 develop

这就出现了新问题:在使用 --mirror 参数 clone 的仓库中,你不能使用 git checkout develop 来切换工作分值。

此时你可以使用下面的命令来切换默认分支:

1
git symbolic-ref HEAD refs/heads/develop

symbolic-ref 子命令的说明在此: git-symbolic-ref

当然,你也可以直接编辑 /srv/redmine/repos/a.git/HEAD 这个文件,能达到一样的效果。

在提交信息中更新问题

在管理员面板中将版本库的 Referencing keywords 设置为: issue;将 Fixing keywords 的值设置为: fix 。

在提交信息中使用下面的语法来引用问题1,2,同时把问题3置为 已解决 状态:

这个问题 issue #1, #2 和 fix #3
这个问题 issue:#1, #2 和 fix:#3
这个问题 issue: #1, #2 和 fix: #3

文章转自:https://blog.zengrong.net/post/2606.html

CentOS下MySQL忘记root密码解决方法

CentOS下mysql忘记root密码解决方法

1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。
因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的
状态下,其他的用户也可以任意地登录和修改MySQL的信息。可以采用将MySQL对
外的端口封闭,并且停止Apache以及所有的用户进程的方法实现服务器的准安全
状态。最安全的状态是到服务器的Console上面操作,并且拔掉网线。

2.修改MySQL的登录设置:
# vim /etc/my.cnf
在[mysqld]的段中加上一句:skip-grant-tables
例如:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-grant-tables
保存并且退出vi。

3.重新启动mysqld
# service mysqld restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]

4.登录并修改MySQL的root密码
# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.23.56
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql> USE mysql ;
Database changed
mysql> UPDATE user SET Password = password ( ‘new-password’ ) WHERE User = ‘root’ ;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2 Changed: 0 Warnings: 0
mysql> flush privileges ;
Query OK, 0 rows affected (0.01 sec)
mysql> quit

5.将MySQL的登录设置修改回来
# vim /etc/my.cnf
将刚才在[mysqld]的段中加上的skip-grant-tables删除
保存并且退出vim

6.重新启动mysqld
# service mysqld restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]

专治无耻的tadb.exe,kadb.exe等各种XXXadb.exe

最近在试着搞android基于webview的开发,因为是小白,遇到了这个 tadb.exe 占用 adb.exe 端口的问题,这是搜刮来的解决办法。

这是一篇我个人在EOE发的blog《专治无耻的tadb.exe,kadb.exe等各种XXXadb.exe》,由于eoe的blog系统实在是无言以对,我就把eoe上面的帖子以及blog是都转到csdn上来,

用自己电脑想学点东西,但是adb进程总是被各种xxxadb.exe进程抢占,好烦,下面给出治他们的办法:

1、手机连上之后让tadb启动一次
2、然后去任务管理器中看tadb进程,右键->查看属性,看他的位置在哪,然后找到这个位置
;3、找到目录之后就可以看到tadb.exe文件,结束tadb.exe进程,然后将你找到的tadb.ext文件删除
4、然后新建一个文本之类的文件,修改文件名为tadb.exe(ps:你的文件夹选项要显示文件后缀)
如果,还不行的话,就操作完上面的步骤之后,将该文件夹里的文件全部删除,然后用管理员权限,将该文件夹设置为只读

PS:我的是win8系统,可能找位置的方法会不一样,大家自己试试,而且这种办法估计也不是永久的,先暂时用着吧,如果升级程序的时候,报文件不让写,直接点忽略就OK了

文章原址:https://blog.csdn.net/lsmfeixiang/article/details/42213441

Android ADB server didn’t ACK * failed to start daemon * 简单有效的解决方案

感谢给出这篇文章的博主,这是标准的授之于渔

转自:https://blog.csdn.net/xiaanming/article/details/9401981

ADB server didn’t ACK 这个问题会困恼很多的新手朋友,我以前刚开始做Android的时候也遇到过这个问题,不过自己百度,google啥的,也不知道怎么就给解决了,看到群里很多新手朋友都会问这个问题,说实话我也没有一个解决这个问题的终极方法(百试百灵的那种,哈哈),自己没遇到也没有认真的去对待他,今天,就是在今天,我打开Eclipse连上手机,准备调试程序,出现如下的信息

The connection to adb is down, and a severe error has occured.
You must restart adb and Eclipse.
Please ensure that adb is correctly located at ‘D:\android-2.2-windows\platform-tools\adb.exe’ and can be executed.

然后我就按照他的要求来做,重启Eclipse和adb,然后确认adb的路径是否正确,然后当我再次运行程序的时候,依旧不行,之后我就开始百度了,有朋友说先在DOS下运行adb kill-server(你必须在环境变量中配好你adb的路径或者进入到adb.exe的目录下),然后在adb start-server,当我运行adb start-server的时候,DOS出现如下信息

* daemon not running. starting it now *
ADB server didn‘t ACK
* failed to start daemon *

然后在运行程序还是不行,重复搞了很多次老不行,还有朋友说在任务管理器找到adb.exe,然后关闭,重启Eclipse,我打开任务管理器,发现根本没有找到adb.exe,这时候我流泪满面了,然后我冷静下来,知道有些朋友遇到这个错误是因为豌豆荚啥的软件占用了adb.exe的端口,我的电脑里面根本没有安装豌豆荚,然后我想看看是谁占用adb的端口,我从网上查到adb.exe使用的端口是5037,接下来我给大家介绍解决方法

  • 查看5037端口被谁占用了,开始–运行–CMD 到命令提示符,输入 netstat -aon|findstr “5037”,如下图                                                                          
  • 我们从上面根本就看不出5037端口被谁占用,我们需要根据后面的PID(2748)来查找占用该端口的应用程序,输入 tasklist|findstr “2748” ,如下图                                                                                                                                                                                                                                                                                                      注: 我这里5037端口是正确的被adb.exe占用,如果是你,就是其他的应用程序啦
  • 结束该进程,输入taskkill /f /t /im 你的进程名,例如adb.exe,如下图,在重新连接手机,这时候你会发现程序运行起来了                                    

这个问题虽然不是什么很大的问题,但是对于新手来说也是属于比较棘手的问题,所以我将自己解决此问题的方法在这里记录下,希望能给遇到此问题的人一点点帮助,如果我写得文章对你一点帮助请帮我顶一下文章,谢谢!

contos 搭建 shadowsocks 服务

搭建一个代理服务器

进入内部网络,访问公司内部服务器,除了采用 VPN 的方式,也可以采用代理服务器的方式。

代理服务器英文全称是(Proxy Server),其功能就是作为用户的中转站去获取网络信息。代理服务器就好象一个大的 Cache,这样就能显著提高浏览速度和效率。这次介绍一个代理服务器的软件 Shadowsocks。

Shadowsocks 以下简称 ss ,它和 VPN 是有区别的,这里先介绍一下,我们主要是学习安装配置客户端和服务器端的流程。

4.1 Shadowsocks 介绍

Shadowsocks 是将以前通过 SSH 创建的 Socks5 协议拆开成 Server 端和 client 端,PC 客户端(即你电脑客户端)发出基于 Socks5 协议请求与 SS-Local 端进行通讯,SS-Local 和 SS-Server 两端通过多种可选的加密方法进行通讯,SS-Server 将收到的加密数据进行解密,还原初始请求,再发送到用户需要访问的服务网站,获取响应原路再返回 ,返回的数据包内容依然使用了加密,而 IP 报文看起来依然是普通 TCP 包,可成功穿过防火墙。

 

因此,Shadowsocks 的优点在于它解决了防火墙通对 IP 报文中一些特定的目的地址的排除,从而干扰的问题。

4.2 安装配置 ss 服务器端,首先去搬瓦工上买一个国外的服务器。很便宜

  • 由于 ss 加入了 python 官方的源,所以打开终端,输入以下命令安装即可:
sudo pip install shadowsocks #保证 pip 已安装
  • 使用方法 :
mkdir /etc/shadowsocks.json
vi /etc/shadowsocks.json # 写入下方内容
{
  "server": "0.0.0.0",
  "server_port": 8388,
  "password": "uzon57jd0v869t7w",
  "method": "aes-256-cfb"
}
ssserver -c /etc/shadowsocks.json #将该内容写入shadowsocks.sh 脚本文件
./shadowsocks.sh > /dev/null 2>&1 &
#执行上面的命令,shadowsocks服务就启动起来了