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]"
March 3, 2018
golang中string rune byte 三者的关系
"Go 语言中 byte 和 rune 实质上就是 uint8 和 int32 类型。 byte 用来强调数据是 raw data,而不是数字;而 rune 用来表示 Unicode 的 code point。参考 规范.\n在Golang中 string 底层是用byte字节数组存储的,并且是不可以修改的。\nGo语言中的byte和rune区别、对比 例如\ns:=\u0026#34;Go编程\u0026#34; fmt.Println(len(s)) //输出结果应该是8因为中文字符是用3个字节存的(2+3*2=8)。 fmt.Printf(\u0026#34;%d\u0026#34;, len(string(rune(\u0026#39;编\u0026#39;)))) //经测试一个汉字确实占用3个字节,所以结果是3 如果想要获得字符个数的话,需要先转换为rune切片再使用内置的len函数\nfmt.Println(len([]rune(s))) // 结果就是4了。 所以用string存储unicode的话,如果有中文,按下标是访问不到的,因为你只能得到一个byte。 要想访问中文的话,还是要用rune切片,这样就能按下表访问。\n总结: rune …"
February 21, 2018
解决mac下brew link python3出错brew Error: Permission denied @ dir_s_mkdir – /usr/local/Frameworks
"mac上默认的python版本为2.7.10版本,需要升级到python3 版本,通过brew升级\n$brew install python3 提示错误\n$ brew install python3 Warning: python3 3.6.3is already installed, it‘s just not linked. You can use brew link python3 to link this version. $ brew link python3 Linking /usr/local/Cellar/python3/3.6.3… Error: Permission denied @ dir_s_mkdir\n发现/usr/local/下没有路径/usr/local/Frameworks 需要新建该路径,并修改权限\n解决:\n$ sudo mkdir /usr/local/Frameworks $ sudo chown $(whoami):admin /usr/local/Frameworks 成功:\n$ brew link python3 Linking …"