August 10, 2015
[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
"\u003cp\u003e我们先了解下InnoDB引擎表的一些关键特征:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eInnoDB引擎表是基于B+树的索引组织表(IOT);\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e每个表都需要有一个聚集索引(clustered index);\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e所有的行记录都存储在B+树的叶子节点(leaf pages of the tree);\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e基于聚集索引的增、删、改、查的效率相对是最高的;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择其作为聚集索引;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e综上总结,如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的,也就是下面这几种情况的存取效率最高:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e使用自增列(INT/BIGINT类型)做主键,这时候写入顺序是自增的,和B+数叶子节点分裂顺序一致;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e该表不指定自增列做主键,同时也没有可 …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
July 30, 2015
用shell分析nginx日志里的访问最多的IP地址
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# $3的位置是IP地址,可按情况修改,如:\n# [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;\ncat nginx.log | awk \u0026#39;{print $3}\u0026#39; | sort | uniq -c | sort -nr | less\n\n#输出:\n# 120 189.17.37.109\n# 96 12.15.61.22\n# 95 12.20.29.33\n# 。。。 。。。\n\u003c/code\u003e\u003c/pre\u003e"
July 24, 2015
安装apache+php(fastcgi)
"\u003cp\u003e最近有下二次开发的程序,由于源程序使用了zend压缩,提示需要安装 Zend Guard Loader 扩展。而安装zend guard 7后,发现在phpinfo()里检测不到,后来才发现原来zend guard只能使用nfs非安全线程的php,没有办法,重新下载NFS版本的php版本。以下为安装要点:\u003c/p\u003e\n\u003cp\u003e我用的是WampServer集成环境,于是就想到了把 Apache 换成 FastCGI 模式来跑 PHP5.3 nts 版,这样就可以使用Zend Guard Loader 扩展了。\u003c/p\u003e\n\u003cp\u003e1、下载 \u003ca href=\"http://windows.php.net/downloads/releases/php-5.3.28-nts-Win32-VC9-x86.zip\"\u003ePHP5.3.28\u003c/a\u003e ,解压到 F:/php5.3.28nts ,配置好 php.ini,也顺便把 Zend Guard Loader 扩展配置好。\u003c/p\u003e\n\u003cp\u003e2、下载 \u003ca href=\"http://archive.apache.org/dist/httpd/binaries/win32/\"\u003emod_fcgid-2.3.6-win32-x86.zip\u003c/a\u003e 或 \u003ca href=\"http://www.apachelounge.com/download/\"\u003ehttp://www.apachelounge.com/download/\u003c/a\u003e 解压 manual、modules 目录中的文件到 f:\\wamp\\bin\\apache\\apache2.2.22 对应目录里去。\u003c/p\u003e\n\u003cp\u003e3、打开 Apache …\u003c/p\u003e"
July 18, 2015
mysql中kill掉所有锁表的进程
"\u003cp\u003e很多时候由于异常或程序错误会导致个别进程占用大量系统资源,需要结束这些进程,通常可以使用以下命令Kill进程:\u003c/p\u003e\n\u003cp\u003emysql中kill掉所有锁表的进程\u003c/p\u003e\n\u003cp\u003e3点钟刚睡下, 4点多, 同事打电话告诉我用户数据库挂掉了. 我起床看一下进程列表.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt;show process list;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e出来哗啦啦好几屏幕的, 没有一千也有几百条, 查询语句把表锁住了, 赶紧找出第一个Locked的thread_id, 在mysql的shell里面执行.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt;kill thread_id;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ekill掉第一个锁表的进程, 依然没有改善. 既然不改善, 咱们就想办法将所有锁表的进程kill掉吧, 简单的脚本如下.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/bash\nmysql -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;`\ndo\necho \u0026#34;kill …\u003c/code\u003e\u003c/pre\u003e"
July 18, 2015
检查mysql数据库是否存在坏表
"\u003cp\u003eshell脚本检测和检查mysql数据库是否存在坏表\u003c/p\u003e\n\u003cp\u003e此脚本的主要用途是检测mysql服务器上所有的数据库或者单独数据库中的坏表,适用于RHEL/Centos系列\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/07/check_mysql.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/check_mysql.png\" alt=\"check_mysql\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/bash\n#此脚本的主要用途是检测mysql服务器上所有的db或者单独db中的坏表\n#变量说明 pass mysql账户口令 name mysql账号名称 data_path mysql目录路径 directory_list 目录列表 file_list文件列表 db_name 数据库名称 repair_count单库中待修复的表总数\n#变量说明 repair_count_all所有库中待修复的表总数 mysql_version mysql版本 _file_name 数据表名称\n\necho -e \u0026#34;此脚本的主要用途是检测mysql服务器上所有的数据库或者单独数据库中的坏表\\n\\n\u0026#34;\npass=123456\nname=root\n\nread -p \u0026#34;输入mysql存储路径: \u0026#34; choose\ndata_path=$choose\nunset choose\n\nread -p …\u003c/code\u003e\u003c/pre\u003e"
June 17, 2015
linux下安装php7+mysql5.7+nginx
"\u003cp\u003e\u003cstrong\u003e环境:\u003c/strong\u003e\n\u003ca href=\"https://www.centos.org/\"\u003eCentOS7.1 X64\u003c/a\u003e \u003ca href=\"http://dev.mysql.com/downloads/mysql/\"\u003eMySQL5.7.10\u003c/a\u003e \u003ca href=\"http://php.net/downloads.php#v7.0.4\"\u003ePHP7.0.4\u003c/a\u003e \u003ca href=\"http://tengine.taobao.org/\"\u003eTengine/2.1.2 (nginx/1.6.2)\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e参考: \u003ca href=\"http://blog.haohtml.com/archives/15340\"\u003ehttp://blog.haohtml.com/archives/15340\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一。安装常用扩展库\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo 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 …\u003c/code\u003e\u003c/pre\u003e"
June 17, 2015
git commit 与 git commit -a 的区别
"\u003cp\u003e软件版本:\n操作系统:ubuntu10.04\n内核版本:Linux version 2.6.32-36-generic\ngit 版本:git version 1.7.0.4\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e目录:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e文件状态\u003c/li\u003e\n\u003cli\u003e提交\n2.1 git commit 与 git commit -a\n2.2 添加提交信息\u003c/li\u003e\n\u003cli\u003e修改/取消\u003c/li\u003e\n\u003cli\u003e参考资料\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e1. 文件状态\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一般仓库中的文件可能存在于这三种状态:\u003c/p\u003e\n\u003cp\u003e1)Untracked files → 文件未被跟踪;\n2)Changes to be committed → 文件已暂存,这是下次提交的内容;\n3) Changes bu not updated → 文件被修改,但并没有添加到暂存区。如果 commit 时没有带 -a 选项,这个状态下的文件不会被提交。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$git status\n# On branch master\n# Changes to be committed:\n# (use \u0026#34;git reset HEAD \u0026lt;file\u0026gt;...\u0026#34; to unstage)\n#\n# new file: file2\n#\n# Changed but …\u003c/code\u003e\u003c/pre\u003e"
June 15, 2015
golang中chan实例
"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport \u0026#34;fmt\u0026#34;\n\nfunc main() {\n data := make(chan int) // 数据交换队列\n exit := make(chan bool) // 退出通知\n\ngo func() {\n for d := range data { // 从队列迭代接收数据,直到 close 。\n fmt.Println(d)\n }\n\n fmt.Println(\u0026#34;recv over.\u0026#34;)\n exit \u0026lt;- true // 发出退出通知。\n}()\n\ndata \u0026lt;- 1 // 发送数据。\ndata \u0026lt;- 2\ndata \u0026lt;- 3\n\nclose(data) // 关闭队列。\n\nfmt.Println(\u0026#34;send over.\u0026#34;)\n\n\u0026lt;-exit // 等待退出通知。\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e输出结果:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e1\n2\n3\nsend over.\nrecv over.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e而如果将上面与 exit chan有关的三行删除掉,则结果为:\u003c/p\u003e"
June 13, 2015
golang中chan的理解与使用教程
"\u003cp\u003e对于 chan 介绍见: \u003ca href=\"https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md\"\u003ehttps://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这里我们主要通过实例来介绍对chan的理解及用法.\u003c/p\u003e\n\u003ch1 id=\"无buffer的channels\"\u003e无Buffer的Channels\u003c/h1\u003e\n\u003cp\u003e实例1:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efunc main() {\nci := make(chan int)\n\nci \u0026lt;- 4\n\nvalue := \u0026lt;-ci\nfmt.Println(value)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e执行结果错误为:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003efatal error: all goroutines are asleep - deadlock!\ngoroutine 1 [chan send]:\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e从上面“fatal error: all goroutines are asleep - deadlock!” 这句我们可以看出是groutings 阻塞了,这里为写阻塞,从“goroutine 1 [chan send]”可以看出来。\u003c/p\u003e\n\u003cp\u003e这一点文档里已经说明阻塞的原因了:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使 …\u003c/p\u003e\u003c/blockquote\u003e"
June 13, 2015
Dev with Vagrant and Docker
"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e为了在团队里搭建统一的本地开发环境,最近花了点时间用了下vagrant和docker,在此做个记录, 这也算一个DevOps的实践。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"vagrant介绍\"\u003eVagrant介绍\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"http://vagrantup.com/\"\u003eVagrant\u003c/a\u003e 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史。\u003c/p\u003e\n\u003cp\u003e我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e以上介绍直接抄自\u003ca href=\"http://blog.segmentfault.com/fenbox/1190000000264347\"\u003e网络\u003c/a\u003e,我觉得介绍的很到位。\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e「注意点:」\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003evagrant up命令执行后,如果看到下面的错误信息,则需要安装另外一个工具:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[default] The guest additions on this VM do not match the installed version of\nVirtualBox! In most cases this is fine, but in rare cases it can\nprevent …\u003c/p\u003e\u003c/blockquote\u003e"
June 9, 2015
golang中flag包的用法
"\u003cp\u003egolang中flag包主要用来CLI下,获取命令参数,示例如下mysql.go:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport (\n\u0026#34;flag\u0026#34;\n\u0026#34;fmt\u0026#34;\n)\n\nfunc main() {\n host := flag.String(\u0026#34;h\u0026#34;, \u0026#34;localhost\u0026#34;, \u0026#34;请指定一个主机\u0026#34;)\n user := flag.String(\u0026#34;u\u0026#34;, \u0026#34;root\u0026#34;, \u0026#34;请指定数据库用户\u0026#34;)\n port := flag.Int(\u0026#34;P\u0026#34;, 3306, \u0026#34;Port number to use for commection or 0 for default to, in port 3306\u0026#34;)\n\n //var name string\n //flag.StringVar(\u0026amp;name, \u0026#34;u\u0026#34;, \u0026#34;root\u0026#34;, \u0026#34;请指定用户名\u0026#34;)\n\n flag.Parse() // …\u003c/code\u003e\u003c/pre\u003e"
May 29, 2015
mac下的yum包管理工具MacPorts
"\u003cp\u003e这里推荐安装 \u003ca href=\"http://brew.sh/\"\u003eHomebrew\u003c/a\u003e,好像安装这个的用户比较的多的,安装命令也非常的简单。\u003c/p\u003e\n\u003cp\u003eMac下面除了用dmg、pkg来安装软件外,比较方便的还有用MacPorts来帮助你安装其他应用程序,跟BSD中的ports道理一样。MacPorts就像apt-get、yum一样,可以快速安装些软件。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e除了这个还有一些类似的工具: \u003ca href=\"http://brew.sh/\"\u003eHomebrew\u003c/a\u003e 和 Fink。\u003c/p\u003e\n\u003cp\u003eFlink是直接编译好的二进制包,MacPorts是下载所有依赖库的源代码,本地编译安装所有依赖,Homebrew是尽量查找本地依赖库,然后下载包源代码编译安装。\nFlink容易出现依赖库问题,MacPorts相当于自己独立构建一套,下载和编译的东西太多太麻烦,Homebrew的方式最合理。\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e下面将MacPorts的安装和使用方法记录在这里以备查。\u003c/p\u003e\n\u003cp\u003e访问官方网站http://www.macports.org/install.php,这里提供有dmg安装和源码安装两种方式,dmg就多说了,下载 \u003ca href=\"https://distfiles.macports.org/MacPorts/MacPorts-2.3.3-10.10-Yosemite.pkg\"\u003eMacPorts-2.3.3-10.10-Yosemite.pkg\u003c/a\u003e,下一步下一步安装即可。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e通过Source安装MacPorts\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ewget …\u003c/p\u003e"
May 24, 2015
mac终端中显示tree的命令(转)
"\u003cp\u003e寻觅了良久终于找到了mac下如何在终端显示tree的命令了,作为从linux下转过来的人,还没适应mac的finder,还是喜欢在命令行下查看文件。\u003c/p\u003e\n\u003cp\u003e命令:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efind . -print | sed -e \u0026#39;s;[^/]*/;|____;g;s;____|; |;g\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后手动alias一下,在你的.bash_profile或者.zshrc中添加:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ealias tree=\u0026#34;find . -print | sed -e \u0026#39;s;[^/]*/;|____;g;s;____|; |;g\u0026#39;\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e搞定\u003c/p\u003e\n\u003cp\u003e要是能显示颜色和控制层级就更好了。\u003c/p\u003e\n\u003cp\u003ePS:也可以通过brew install tree 安装。\u003c/p\u003e"
May 1, 2015
ios8中action segue
"\u003cp\u003eos8 action segue 有几种方法,一般选择哪一个,每种方法都有什么用,在什么环境下使用?\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/05/57_400607_5f360e47ff35d47.jpg\"\u003e\u003cimg src=\"http://blogx.haohtml.com/wp-content/uploads/2015/05/57_400607_5f360e47ff35d47.jpg\" alt=\"57_400607_5f360e47ff35d47\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eApple的解释在这里: \u003ca href=\"https://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/chapters/StoryboardSegue.html\"\u003ehttps://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/chapters/StoryboardSegue.html\u003c/a\u003e\n我的翻译:\n\u003cstrong\u003eShow\u003c/strong\u003e: 在master或detail区域展现内容(典型的如iPad的设置界面,左侧是master,右侧是detail),究竟是在哪个区要取决于屏幕上的内容,如果不分master/detail,就单纯的把新的内容push到当前view controller stack的顶部\n\u003cstrong\u003eShow Detail\u003c/strong\u003e: 大致同Show,在detail区域展现内容,如果不分master/detail,新的内容取代当前view controller stack的顶部\n\u003cstrong\u003ePresent Modally\u003c/strong\u003e:模态展示内容\n\u003cstrong\u003ePresent as Popover\u003c/strong\u003e:在当前的view上出现一个小窗口来展示内容,无处不在的“选中文字后出现 复制/翻译 按钮就是这个\n\u003cstrong\u003eCustom\u003c/strong\u003e:自定义 …\u003c/p\u003e"
April 18, 2015
vmware11下安装mac osx 10.10教程(原创)
"\u003cp\u003e推荐此方法:\u003c/p\u003e\n\u003cp\u003e一. 安装vmware 12 pro的破解补丁(unlocker207)\u003c/p\u003e\n\u003cp\u003evmware 12 pro\nunlocker207( 204版本在vm11处可以使用,在vm12下不管用,各版本下载 \u003ca href=\"http://www.insanelymac.com/forum/files/file/339-unlocker/\"\u003ehttp://www.insanelymac.com/forum/files/file/339-unlocker/\u003c/a\u003e )\u003c/p\u003e\n\u003cp\u003e二. 下载 Yosemite Install(14F27)_10.10.5.cdr 镜像文件。安装方法同windows一样,设置为cd/dvd就可以了。默认vmware只显示iso文件,选择一下显示所有文件即可。\u003c/p\u003e\n\u003cp\u003e安装过程中会提示一下信息,和下面教程的错误和解决方法都一样。\u003c/p\u003e\n\u003cp\u003e===============================================\u003c/p\u003e\n\u003cp\u003e不在推荐使用以下这种方法,网络安装特别的慢,另外版本已经过时。推荐使用上面的方法安装!\u003c/p\u003e\n\u003cp\u003e在安装前请检查您的硬件配置是否支持,特别注意是”虚拟化”功能,有的主板虽然支持,但默认是关闭状态的,需要在bios里开启才可以。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/04/vt_enable.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2015/04/vt_enable.png\" alt=\"vt_enable\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e所需软件:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1.mac 补丁 unlocker\n2.mac os x …\u003c/p\u003e"