June 11, 2018
Linux下对进程通信管理的信号机制概述
"今天看到了篇使用golang实现的系统无感重启的文章, https://gravitational.com/blog/golang-ssh-bastion-graceful-restarts/,一般用来平滑处理一些系统服务,避免先停止再启用导致的服务不可用的情况。其中用到了信号机制,这里找了一些文章主要有来介绍这方面的文章,以便加深理解。 https://blog.csdn.net/junyucsdn/article/details/50519248 https://blog.csdn.net/tiany524/article/details/17048069 https://my.oschina.net/chenliang165/blog/125825"
June 7, 2018
MySQL中的sql_mode模式
"官方文档: https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-setting\n一、模式分类\n在MySQL8.0中主要包括以下几种模式\nONLY_FULL_GROUP_BY 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,因为列不在GROUP BY从句中 STRICT_TRANS_TABLES 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制 NO_ZERO_IN_DATE 在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。 NO_ZERO_DATE 在严格模式,不要将 ‘0000-00-00’做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告 ERROR_FOR_DIVISION_BY_ZERO 在严格模式,在INSERT或UPDATE过程中,如果被零除( …"
June 7, 2018
了解MySQL中的驱动表
"一、为什么要用小表驱动大表\n1、驱动表的定义\n当进行多表连接查询时, [驱动表] 的定义为:\n1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表]\n2)未指定联接条件时,行数少的表为[驱动表](重要)\n忠告:如果你搞不清楚该让谁做驱动表、谁 join 谁,请让 MySQL 运行时自行判断\n既然“未指定联接条件时,行数少的表为[驱动表]”了,而且你也对自己写出的复杂的 Nested Loop Join 不太有把握(如下面的实例所示),就别指定谁 left/right join 谁了,请交给 MySQL优化器 运行时决定吧。\n2、mysql关联查询的概念:\nMySQL 表关联的算法是 Nest Loop Join(嵌套循环),是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。\n例: user表10000条数据,class表20条数据\nSELECT * FROM user u LEFT JOIN class c u.userid=c.userid\n这样则需要用user表循环10000次才能查询出来,而如果 …"
April 26, 2018
U盘安装Centos7.4
"启动盘制作教程: https://www.cnblogs.com/yeeo1/p/7306611.html http://blog.51cto.com/mifan6/2070118"
April 20, 2018
使用docker-compose 快速创建一个mysql 数据库容器
"//创建一个独立的容器目录\nmkdir docker-db cd docker-db 前提、创建 docker Compose 配置文件 #vi docker-compose.yml 文件,内容如下\nversion: \u0026#39;3.6\u0026#39; services: db: image: hub.c.163.com/library/mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: wordpress MYSQL_USER: root MYSQL_PASSWORD: 123456 MYSQL_ALLOW_EMPTY_PASSWORD: \u0026#34;yes\u0026#34; ports: - \u0026#34;33061:3306\u0026#34; image也可以直接写mysql:5.7 或者mysql:latest,不指定获取地址。 上面的 ports 这一块,是指宿主机端口号:容器端口号。在使用的时候,直接访问本机的 33061 端口即可。端口号前也可以指定一个固定的IP 地址。 Compose …"
March 29, 2018
MySQL InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
"InnoDB是一个支持行锁的存储引擎,锁的类型有:共享锁(S)、排他锁(X)、意向共享(IS)、意向排他(IX)。为了提供更好的并发,InnoDB提供了非锁定读:不需要等待访问行上的锁释放,读取行的一个快照。该方法是通过InnoDB的一个特性:MVCC来实现的。\nInnoDB有三种行锁的算法 1,Record Lock:单个行记录上的锁。\n2,Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况。\n3,Next-Key Lock:1+2,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。\n锁的是索引,并不是记录。 记录锁(Record Lock): 单个索引行记录上的锁 间隙锁(Gap Lock):一般是针对非唯一索引而言的. 后码锁(Next-Key Lock):记录锁和间隙锁的结合,对于InnoDB中,更新非唯一索引对应的记录,会加上Next-Key Lock。在RR下如果where未使用索引会使用全表扫描,这个时候会有Next-Key Lock。如果更新记录为空,就不能加记录 …"
March 29, 2018
聚簇索引概念(Myisam与Innodb索引的区别)转推荐
"myisam的主索引和次索引都指向物理行,下面来进行讲解\ninnodb的主键下存储该行的数据,此索引指向对主键的引用\nmyisam的索引存储图如下,可以看出,无论是id还是cat_id,下面都存储有存储物理地址的值。通过主键索引或者次索引来查询数据的时候,都是先查找到\u001b数据地址,然后再到物理位置上去寻找数据。\n[][1]\ninnodb的索引存储图如下,我们会发现,主键索引下面直接存储有数据,而次索引下,存储的是主键的id(不同于MyISAM,存储的是内容数据的物理地址)。通过主键查找数据的时候,就会很快查找到数据,但是通过次索引查找数据的时候,需要先查找到对应的主键id,然后才能查找到对应的数据。\n[][2]\n总结: InnoDB的主索引文件上 直接存放该行数据,称为聚簇索引,次索引指向对主键的引用. Myisam中, 主索引和次索引,都指向物理行(磁盘位置).\n注意:对InnoDB来说, 1: 主键索引 既存储索引值,又在叶子中存储行的数据 2: 如果没有主键, 则会Unique key做主键 3: 如果没有unique,则系统生成一个内部的rowid做主键. 4: 像innodb …"
March 27, 2018
IE浏览器报Promise错误的解决办法
"说明ie浏览器不支持Promise,可搜索关键字 polyfill,引入以下库即可\nhttps://cdn.polyfill.io/v2/polyfill.min.js?features=es6\n官方文档: https://cdn.polyfill.io/v2/docs/ 参考: https://www.cnblogs.com/XHappyness/p/7919610.html 参考: https://www.jianshu.com/p/2888a8e204e8"
March 12, 2018
linux下git版本过底引起的无法git clone的解决方案
"刚安装的新系统,git版本为1.8.3,使用git clone命令的时候,提示“… Peer reports incompatible or unsupported protocol version”\n只需要升级一下基本包即可。\nsudo yum update nss curl # nss为名称解析和认证服务 curl为网络请求库 "
March 8, 2018
Go中slice作为参数传递的一些“坑”
"看明白了这篇文章,下面的例子基本也就明白了\npackage main import \u0026#34;fmt\u0026#34; func main() { a := []int{1,2,3} abc(a) fmt.Println(a) } func abc(a []int) { a[0] = 2 //修改后还是原来的a a = append(a, 4) // 此a非原a,使用append导致了重新分配内存地址(存储空间不足,系统自动分配一块新的足够大的内存地址,此时a的物理内存地址已经发行了变化,并将原来a的值copy一份到新的内存地址,所以这里修改的只是新内存地址的值,原来内存地址的值并没有改变),试着删除这行运行一次再看结果 fmt.Println(a) a[0] = 7 // 新a,因为上面执行了append fmt.Println(a) fmt.Printf(\u0026#34;\\n===\\n\u0026#34;) } 解释: [][1]"