August 19, 2023
请你解释一下EXPLAIN命令
#
explain命令是用来查看mysql执行语句的执行计划,帮助我们分析SQL语句的性能瓶颈。其输出中各个列的作用如下:
| 列名 | 描述 |
|---|
| id | 每个select关键字都对应一个唯一的id |
| select_type | 查询类型 |
| table | 表名,explain语句输出的每条记录都对应着某个单表的访问方法。 |
| partitions | 匹配的分区信息 |
| type | 针对单表的访问方法 |
| possible_keys | 可能用到的索引 |
| key | 实际使用的索引 |
| key_len | 实际使用的索引长度 |
| ref | 当使用索引列等值查询时,与索引列进行等值匹配的对象信息。 |
| rows | 扫描的行数。 |
| filtered | 经过搜索条件过滤后剩余记录条数的百分比 |
| Extra | 额外信息 |
其中较为重要的是:
...August 19, 2023
前文我们已经介绍了sqlx的基本使用方法,今天我们来看一下怎样使用sqlx库来执行事务。
数据库:mysql。
准备
#
创建一张用户账户表:
CREATE TABLE `user_account` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL COMMENT '用户id',
`balance` decimal(10,0) NOT NULL COMMENT '账户余额。',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`modified_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `udx_userid` (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
我们向这张表中添加两条记录:
可以看到,表中现在有两个用户,id分别为1和2,账户余额都是100.
...August 17, 2023
敏感词过滤,算是一个比较常见的功能,尤其是在内容、社交类应用中更是如此。本文介绍如何使用Go语言实现简单的敏感词过滤功能。
简单敏感词过滤-ai版
#
先列出一个gpt给出来的一个简单前缀树的实现:
...August 15, 2023
sqlx是一款go语言的数据库操作库,它是对go语言自带的database/sql的扩展,提供了更多的功能,使用起来更加方便。
它能极大的方便我们对数据库的操作,提高开发效率,同时又没有GORM那么臃肿,学习成本也不高。对于我这种原生sql派来说,再好不过了。
...August 13, 2023
《习惯的力量》
#
在这本书中,作者介绍了多篇关于习惯的学术研究、对多位学者、管理者的访谈,以及一些企业的实践研究成果。这本书分
三个部分探讨了个人的习惯、成功组织的习惯以及社会群体的习惯。
就我个人而言,读完本书后,深深意识到了习惯的重要性以及自身的坏习惯的影响。其实自己生活中的一些问题,比如肥胖、
焦虑等,或许大部分是自己的不良习惯殷勤的。我现在开始尝试着去改变自己的习惯。我个人的
做法如下:
...August 13, 2023
viper是一款使用go语言开发的配置文件读取库,支持多种配置文件格式,包括yaml、json、toml等。viper还支持从环境变量读取配置,从远程配置中心读取配置。
本文仅介绍viper读取本地配置文件的使用方法。
...August 6, 2023
本文中的问题来自极客时间的《后端工程师的高阶面经》 ,答案为本人的理解,仅供阅读者参考。
这门课还是非常不错的,虽然知识不一定完全准确,但是对于复习总结来说,绝对是一个好的大纲,推荐大家购买。
什么是覆盖索引?
#
索引中包含所有查询要读取的列,称为覆盖索引。
注意,这里的“所有查询要读取的列”是指查询要读取的列、要用到的列,而不仅仅是select的列,也可能是order by的列、group by的列等。
...July 30, 2023
在InnoDB存储引擎中,事务id是用来标识事务的唯一数字标识,每个事务都有一个唯一的事务id。在mvcc、锁等很多场景中,我们都能看到事务id的影子。
那么,事务id是什么时候被分配的呢?其实是在执行第一条语句的时候分配的,准确的说,是执行第一条写语句或锁定读语(SELECT … FOR UPDATE)句时执行的。
...May 28, 2023
关于Go语言中make和new的区别,已经在网上看到了很多文档,但是总觉得缺点什么,所以今天就自己写一篇文章来讲一下。
首先先说下网上说的关于make和new的区别,大致有以下几点:
- make只能用于slice、map、channel的初始化,返回的是这三个类型本身。
- new用于为任何类型分配内存,并返回指向该类型的指针。
- new和make都能用于分配内存,但是make会初始化内存,而new不会。
make
#
make用于创建slice、map、channel,返回的是这三个类型本身。
...May 21, 2023
问题描述
#
某服务上线后,其中一个http接口A连续多天出现了慢请求告警。通过查看日志(因为当时还没有引入调用链),判断是调用一个内部接口B时慢了,但是请求A接口
的慢请求数量远大于B接口的慢请求数量。经过和提供接口B的同事核对,以及增加详细日志,发现原因是我在调用接口时使用了singleflight,导致一个慢请求变
成多个慢请求。
...