MYSQL 最左前缀法则

什么是最左前缀法则呢?最左前缀法则是指复合索引当中要遵守的法则,先说结论:指查询从索引的最左列开始,并且不跳过索引中的列。也就是说查询的条件当中要包含索引最左侧的列,并且不能跳过索引当中的列。

如何理解呢?实际来个例子吧

create index idx_seller_name_sta_addr on tb_seller(name, status, address);
explain select * from tb_seller where name = '小米科技' and status = '1' and address ='北京市' //针对上面的索引,这样来查肯定是没有问题的

接下来再做一个测试 :

explain select * from tb_seller where name = '小米科技' //这样会走索引吗?结论是:也会

接下来进一步做测试:

explain select * from tb_seller where name = '小米科技' and status = '1'  //结论:也会走索引,可以看key_len区分索引的不同

接下来再做一下测试:

explain select * from tb_seller where status = '1' and address = '北京市' //这样走索引吗?不走,因为没从索引最左边的列开始

再做一轮测试:

explain select * from tb_seller where address = '北京市' //这样走索引吗?不走,因为也没从索引最左边的列开始

再做一轮测试:name顺序发生变化

explain select * from tb_seller where status = '1' and address = '北京市' and name = '小米科技' //走索引,顺序并不影响,只看查询条件有没有包含最左列

还有一种特殊情况:

explain select * from tb_seller where name = '小米科技' and address = '北京市' //走索引,只用到了name字段的索引,没用到address字段的索引

可以把这个想象成爬楼梯,name 第一层,status 第二层,address 第三层,不能跳过第一层,直接爬后面的。也不能爬完第一层后直接爬第三层。

git 回退版本

Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

现在,我们要把当前版本A ,回退到上一个版本“B”,就可以使用git reset命令:

$ git reset –hard HEAD^

HEAD is now at ea34578 B

也可以查询版本 :git log –pretty=oneline

显示出所有提交版本记录,选择 id

执行 git rest –hard id即可。

nginx lua 模块编译

背景:https://www.clarkhu.net/?p=10121 (需要使用request_id定位业务问题)

参考文章:

https://github.com/openresty/lua-nginx-module#nginx-compatibility

需要的安装包有:

nginx-1.19.3.tar.gz
lua-nginx-module-0.10.14.tar.gz
ngx_devel_kit-0.3.1.tar.gz
openssl-1.0.2j.tar.gz
pcre-8.36.tar.gz
luajit2-2.1-20210510.tar.gz

make PREFIX=/usr/local/luajit
make install PREFIX=/usr/local/luajit
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.1


tar zxf lua-nginx-module-0.10.14.tar.gz
tar zxf ngx_devel_kit-0.3.1.tar.gz
tar xvzf nginx-1.19.3.tar.gz

./configure --prefix=/usr/local/nginx-1.19.3 --with-http_ssl_module --with-openssl=/usr/local/src/openssl-1.0.2n --with-pcre=/usr/local/src/pcre-8.36 --with-http_secure_link_module --with-ld-opt=-Wl,-rpath,/usr/local/luajit/lib --add-module=/usr/local/src/ngx_devel_kit-0.3.1 --add-module=/usr/local/src/lua-nginx-module-0.10.14

make -j2
make install

这里主要的是nginx, lua-nginx ngx_devel luajit 这几个包的兼容性问题需要自己去查和测试。之前遇到了resty.core not found ,上网搜了下,主要就是包的兼容性问题导致的

df -h 卡住不动问题解决

早上测试环境打不开,登录看测试环境负载较高,页面提示貌似是磁盘满了。于是df -h想查一下磁盘情况,结果发现 df -h 卡住不动

于是mount -l 看了一下该机器上的目录情况,发现有一个

ip:port on /data/xxx type fuse.mfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)

telnet访问了一下该ip和port, 发现策略不通,机器已经被回收了,所以现在df -h 打不开,
于是用umount -l /data/xxx 解除挂载

最后再次df -h,发现ok了。