August 10, 2015
[MySQL FAQ]系列 — 什么情况下会用到临时表
"MySQL在以下几种情况会创建临时表:\n1、UNION查询; 2、用到TEMPTABLE算法或者是UNION查询中的视图; 3、ORDER BY和GROUP BY的子句不一样时; 4、表连接中,ORDER BY的列不是驱动表中的; 5、DISTINCT查询并且加上ORDER BY时; 6、SQL中用到SQL_SMALL_RESULT选项时; 7、FROM中的子查询; 8、子查询或者semi-join时创建的表; EXPLAIN 查看执行计划结果的 Extra 列中,如果包含 ** Using Temporary** 就表示会用到临时表。\n当然了,如果临时表中需要存储的数据量超过了上限( tmp-table-size 或 max-heap-table-size 中取其大者),这时候就需要生成基于磁盘的临时表了。\n在以下几种情况下,会创建磁盘临时表:\n1、数据表中包含BLOB/TEXT列; 2、在 GROUP BY 或者 DSTINCT 的列中有超过 512字符 的字符类型列(或者超过 512字节的 二进制类型列,在5.6.15之前只管是否超过512字节); 3、 …"
August 10, 2015
[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
"我们先了解下InnoDB引擎表的一些关键特征:\nInnoDB引擎表是基于B+树的索引组织表(IOT);\n每个表都需要有一个聚集索引(clustered index);\n所有的行记录都存储在B+树的叶子节点(leaf pages of the tree);\n基于聚集索引的增、删、改、查的效率相对是最高的;\n如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择其作为聚集索引;\n如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引;\n如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。\n综上总结,如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的,也就是下面这几种情况的存取效率最高:\n使用自增列(INT/BIGINT类型)做主键,这时候写入顺序是自增的,和B+数叶子节点分裂顺序一致;\n该表不指定自增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这 …"
July 30, 2015
用shell分析nginx日志里的访问最多的IP地址
"# $3的位置是IP地址,可按情况修改,如: # [30/Sep/2012:19:14:47 +0800] 110.75.176.58 www.example.com \u0026#34;GET / HTTP/1.1\u0026#34; 200 3629 \u0026#34;-\u0026#34; \u0026#34;Yahoo! Slurp China\u0026#34; cat nginx.log | awk \u0026#39;{print $3}\u0026#39; | sort | uniq -c | sort -nr | less #输出: # 120 189.17.37.109 # 96 12.15.61.22 # 95 12.20.29.33 # 。。。 。。。 "
July 24, 2015
安装apache+php(fastcgi)
"最近有下二次开发的程序,由于源程序使用了zend压缩,提示需要安装 Zend Guard Loader 扩展。而安装zend guard 7后,发现在phpinfo()里检测不到,后来才发现原来zend guard只能使用nfs非安全线程的php,没有办法,重新下载NFS版本的php版本。以下为安装要点:\n我用的是WampServer集成环境,于是就想到了把 Apache 换成 FastCGI 模式来跑 PHP5.3 nts 版,这样就可以使用Zend Guard Loader 扩展了。\n1、下载 PHP5.3.28 ,解压到 F:/php5.3.28nts ,配置好 php.ini,也顺便把 Zend Guard Loader 扩展配置好。\n2、下载 mod_fcgid-2.3.6-win32-x86.zip 或 http://www.apachelounge.com/download/ 解压 manual、modules 目录中的文件到 f:\\wamp\\bin\\apache\\apache2.2.22 对应目录里去。\n3、打开 Apache …"
July 18, 2015
mysql中kill掉所有锁表的进程
"很多时候由于异常或程序错误会导致个别进程占用大量系统资源,需要结束这些进程,通常可以使用以下命令Kill进程:\nmysql中kill掉所有锁表的进程\n3点钟刚睡下, 4点多, 同事打电话告诉我用户数据库挂掉了. 我起床看一下进程列表.\nmysql\u0026gt;show process list; 出来哗啦啦好几屏幕的, 没有一千也有几百条, 查询语句把表锁住了, 赶紧找出第一个Locked的thread_id, 在mysql的shell里面执行.\nmysql\u0026gt;kill thread_id; kill掉第一个锁表的进程, 依然没有改善. 既然不改善, 咱们就想办法将所有锁表的进程kill掉吧, 简单的脚本如下.\n#!/bin/bash mysql -u root -e \u0026#34;show processlist\u0026#34; | grep -i \u0026#34;Locked\u0026#34; \u0026gt;\u0026gt; locked_log.txt for line in `cat locked_log.txt | awk \u0026#39;{print $1}\u0026#39;` do echo \u0026#34;kill …"
July 18, 2015
检查mysql数据库是否存在坏表
"shell脚本检测和检查mysql数据库是否存在坏表\n此脚本的主要用途是检测mysql服务器上所有的数据库或者单独数据库中的坏表,适用于RHEL/Centos系列\n#!/bin/bash #此脚本的主要用途是检测mysql服务器上所有的db或者单独db中的坏表 #变量说明 pass mysql账户口令 name mysql账号名称 data_path mysql目录路径 directory_list 目录列表 file_list文件列表 db_name 数据库名称 repair_count单库中待修复的表总数 #变量说明 repair_count_all所有库中待修复的表总数 mysql_version mysql版本 _file_name 数据表名称 echo -e \u0026#34;此脚本的主要用途是检测mysql服务器上所有的数据库或者单独数据库中的坏表\\n\\n\u0026#34; pass=123456 name=root read -p \u0026#34;输入mysql存储路径: \u0026#34; choose data_path=$choose unset choose read -p \u0026#34;请输 …"
June 17, 2015
linux下安装php7+mysql5.7+nginx
"环境: CentOS7.1 X64 MySQL5.7.10 PHP7.0.4 Tengine/2.1.2 (nginx/1.6.2)\n参考: http://blog.haohtml.com/archives/15340\n一。安装常用扩展库\nsudo yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers libevent …"
June 17, 2015
git commit 与 git commit -a 的区别
"软件版本: 操作系统:ubuntu10.04 内核版本:Linux version 2.6.32-36-generic git 版本:git version 1.7.0.4\n目录:\n文件状态 提交 2.1 git commit 与 git commit -a 2.2 添加提交信息 修改/取消 参考资料 1. 文件状态\n一般仓库中的文件可能存在于这三种状态:\n1)Untracked files → 文件未被跟踪; 2)Changes to be committed → 文件已暂存,这是下次提交的内容; 3) Changes bu not updated → 文件被修改,但并没有添加到暂存区。如果 commit 时没有带 -a 选项,这个状态下的文件不会被提交。\n$git status # On branch master # Changes to be committed: # (use \u0026#34;git reset HEAD \u0026lt;file\u0026gt;...\u0026#34; to unstage) # # new file: file2 # # Changed but not updated: …"
June 15, 2015
golang中chan实例
"package main import \u0026#34;fmt\u0026#34; func main() { data := make(chan int) // 数据交换队列 exit := make(chan bool) // 退出通知 go func() { for d := range data { // 从队列迭代接收数据,直到 close 。 fmt.Println(d) } fmt.Println(\u0026#34;recv over.\u0026#34;) exit \u0026lt;- true // 发出退出通知。 }() data \u0026lt;- 1 // 发送数据。 data \u0026lt;- 2 data \u0026lt;- 3 close(data) // 关闭队列。 fmt.Println(\u0026#34;send over.\u0026#34;) \u0026lt;-exit // 等待退出通知。 } 输出结果:\n1 2 3 send over. recv over. 而如果将上面与 exit chan有关的三行删除掉,则结果为:"
June 13, 2015
golang中chan的理解与使用教程
"对于 chan 介绍见: https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md\n这里我们主要通过实例来介绍对chan的理解及用法.\n无Buffer的Channels 实例1:\nfunc main() { ci := make(chan int) ci \u0026lt;- 4 value := \u0026lt;-ci fmt.Println(value) } 执行结果错误为:\nfatal error: all goroutines are asleep - deadlock! goroutine 1 [chan send]:\n从上面“fatal error: all goroutines are asleep - deadlock!” 这句我们可以看出是groutings 阻塞了,这里为写阻塞,从“goroutine 1 [chan send]”可以看出来。\n这一点文档里已经说明阻塞的原因了:\n默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使 …"