August 10, 2015
Mysql Innodb的两种表空间方式
"\u003cp\u003e要说表空间,Mysql的表空间管理远远说不上完善。换句话说,事实上Mysql根本没有真正意义上的表空间管理。Mysql的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间。只要在my.cnf里面增加innodb_file_per_table=1就可以从共享表空间切换到独立表空间。当然对于已经存在的表,则需要执行alter table MY_TABLE engine=innodb命令迁移数据。\u003c/p\u003e\n\u003ch1 id=\"共享表空间方式\"\u003e\u003cstrong\u003e共享表空间方式\u003c/strong\u003e\u003c/h1\u003e\n\u003cp\u003e由于是默认的方式,就暂且理解为Mysql官方推荐的方式。相对而言所有的数据都在一个(或几个)文件中,比较利于管理,而且在操作的时候只需要open这一个(或几个)文件即可,相对来说代价很低。\u003c/p\u003e\n\u003cp\u003e但问题是在数据达到以G为单位来计算的时候优劣逆转。一个大小惊人的文件很不利于管理,而且对于一个如此巨大的文件来说,读写它需要耗费的资源一样巨大。更加令人费解的是,MySQL竟然将索引和数据保存于同一个文件中,索引和数据之间尚存在资源争用,不利于性能的提升。你当然可以通过innodb_data_file_path的配置规划多个表空间文件,但MySQL的逻辑是“用满后增 …\u003c/p\u003e"
August 10, 2015
[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响
"\u003cp\u003e本次,我们通过对比,明明白白的知道索引、提交频率对InnoDB表写入速度的影响,了解有哪些需要注意的。\u003c/p\u003e\n\u003cp\u003e先直接说几个结论吧:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e1、关于索引对写入速度的影响:\na、如果有自增列做主键,相对完全没索引的情况,写入速度约提升 3.11%;\nb、如果有自增列做主键,并且二级索引,相对完全没索引的情况,写入速度约降低 27.37%;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e因此,\u003cstrong\u003eInnoDB表最好总是有一个自增列做主键\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e2、关于提交频率对写入速度的影响(以表中只有自增列做主键的场景,一次写入数据30万行数据为例):\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ea、等待全部数据写入完成后,最后再执行commit提交的效率最高;\nb、每10万行提交一次,相对一次性提交,约慢了1.17%;\nc、每1万行提交一次,相对一次性提交,约慢了3.01%;\nd、每1千行提交一次,相对一次性提交,约慢了23.38%;\ne、每100行提交一次,相对一次性提交,约慢了24.44%;\nf、每10行提交一次,相对一次性提交,约慢了92.78%;\ng、每行提交一次,相对一次性提交,约慢了546.78%,也就是慢了5倍;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e因此,\u003cstrong\u003e最好是等待所有事务结束后再批量提交,而不是每执行完一个SQL就提交一次\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e曾经 …\u003c/p\u003e"
August 10, 2015
[MySQL FAQ]系列 — 什么情况下会用到临时表
"\u003cp\u003e\u003cstrong\u003eMySQL在以下几种情况会创建临时表:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e1、UNION查询;\n2、用到TEMPTABLE算法或者是UNION查询中的视图;\n3、ORDER BY和GROUP BY的子句不一样时;\n4、表连接中,ORDER BY的列不是驱动表中的;\n5、DISTINCT查询并且加上ORDER BY时;\n6、SQL中用到SQL_SMALL_RESULT选项时;\n7、FROM中的子查询;\n8、子查询或者semi-join时创建的表;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEXPLAIN 查看执行计划结果的 Extra 列中,如果包含 ** \u003ca href=\"http://imysql.com/2015/06/14/mysql-faq-what-important-information-in-explain.shtml\"\u003eUsing Temporary\u003c/a\u003e** 就表示会用到临时表。\u003c/p\u003e\n\u003cp\u003e当然了,如果临时表中需要存储的数据量超过了上限( \u003ca href=\"https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_tmp_table_size\"\u003etmp-table-size\u003c/a\u003e 或 \u003ca href=\"https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_max_heap_table_size\"\u003emax-heap-table-size\u003c/a\u003e 中取其大者),这时候就需要生成基于磁盘的临时表了。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e在以下几种情况下,会创建磁盘临时表:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e1、数据表中包含BLOB/TEXT列;\n2、在 GROUP BY 或者 DSTINCT 的列中有超过 512字符 的字符类型列(或者超过 512字节的 二进制类型列,在5.6.15之前只管是否超过512字节);\n3、 …\u003c/code\u003e\u003c/pre\u003e"
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"