背景

协程A执行过程中需要创建子协程A1、A2、A3…An,协程A创建完子协程后就等待子协程退出。

针对这种场景,GO提供了三种解决方案:
1. Channel: 使用channel控制子协程
2. WaitGroup : 使用信号量机制控制子协程
3. Context: 使用上下文控制子协程

三种方案各有优劣,比如Channel优点是实现简单,清晰易懂;WaitGroup优点是子协程个数动态可调整;Context 优点是对子协程派生出来的孙子协程的控制。缺点是相对而言的,要结合实例应用场景进行选择。

channel

channel一般用于协程之间的通信,chann[……]

继续阅读

索引B+树的理解和坑

MYSQL单表数据达2000万性能严重下降,为什么?

在中国互联网技术圈流传着这么一个说法:MySQL 单表数据量大于 2000 万行,性能会明显下降。

可是,根据以往经验,社交产品,用户互相点赞关注的关系表,数据1亿9千万条且没有进行分表,甚至分区表都没有。
但是并没有感觉到明显的卡顿,也没有慢日志出现,跟这个说法明显相悖,这是为什么呢?

讨论这个差异先看另外个问题:InnoDB一棵B+树可以存放多少行数据?

B+树数据结构

要讨论这个问题我们首先来看MySQL InnoDB 引擎的数据存储方式:
1. InnoDB 存储引擎的最小存[……]

继续阅读

背景

什么是MVCC?

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

特别要注意MVCC只在 读已提交(RC) 和 可重复度(RR) 这两种事务隔离级别下才有效。

是数据库引擎(InnoDB)层面实现的,用来处理读写冲突的手段(不用加锁),提高访问性能。

有锁了为什么需要MVCC?

MySQL中同时使用锁和MVCC(多版本并发控制)是为了实现更高效的并发访问和事务隔离性。

锁是一种常见的并发控制机制,它可以确保[……]

继续阅读

什么是索引?

索引是一种用于加速查询的数据结构。它可以使得数据库在查找数据时更快地定位到需要的数据。

索引的类型

1. 主键索引

它是一种特殊的唯一索引,不允许有空值。
一般是在建表的时候同时创建主键索引。
一个表只能有一个主键。

2. 普通索引

最基本的索引,无任何限制。
可以通过ALTER TABLE table_name ADD INDEX index_name (column);创建普通索引。

3. 唯一索引

唯一索引列的值必须唯一,但允许有空值。
如果是组合索引,则列值的组合必须唯一。
可以通过ALTER TABLE table_na[……]

继续阅读

背景

宠物门店优惠券业务,同一个优惠券主体,需要同时支持多家门店可用。

在MySQL8以前,一种方案是通过建立关系表记录优惠券ID和门店ID之间的关系;另一种方案是用一个字段然后用特殊字符分隔门店ID(例如:JSON字符串)。

在查询某个门店可以使用的优惠券列表式前一种方案虽然能在查询的时候走到索引,但是会使用子查询;后一种方案无法走到索引。

MySQL8以后增加了JSON数据类型,而且支持索引,可以很好的用一张数据表解决上面的问题。

建表

[cc lang=”sql”]
CREATE TABLE `czt_coupon_main_body` (
`coup[……]

继续阅读

背景:为什么要有全文索引

在当我们进行模糊查询的时候,一般都是使用 like 关键字来实现,在数据量小的情况下效率确实可以。

有的人会说了,数据量大的时候我加索引啊。确实可以加索引,而且 like condition% 是可以使用到索引的,但是当你要 like %condition% 或 %condition 这样使用就会导致索引无效。

而且,如果我们想要同时搜索多个字段呢,例如同时搜索用户名和用户个性签名里面要包含 “约”关键字,like 查询显然是办不到的。

这时为了满足需求,同时能快速的进行查询,我们可以引入Elasticsearch或者使用MySQL自带的全文索引。[……]

继续阅读

基础部分

1、什么是 MySQL?它的特点是什么?

MySQL是一个开源的关系型数据库管理系统。它的特点是:

速度快:MySQL是一种高性能、高可靠性的数据库管理系统,可以处理大量的数据。
开源:MySQL是一个开源的数据库管理系统,可以免费使用。
跨平台:MySQL可以运行在多种操作系统上,如Windows、Linux、Unix等。
支持多种存储引擎:MySQL支持多种存储引擎,如InnoDB、MyISAM、ARCHIVE、MEMORY、BLACKHOLE等。
支持多种编程语言:MySQL支持多种编程语言,如PHP、Java、Python、Golang等。

2、什[……]

继续阅读

背景

社交产品,用户表,用户数据600万条,字段87个(别问为什么这么多,问就是业务需要+祖传屎山);此时需要增加一个geometry类型的字段将用户的经纬度数据存入数据表中并增加空间索引, 且要求必须在原表中新加字段(别杠为什么不开新表,杠就是业务需要)。

机器配置:18核36线程CPU,64GB内存。

表结构如下:

[cc lang=”sql”]
CREATE TABLE `july_user` (
`user_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT ‘用户ID’,
`third_user_id`[……]

继续阅读

Redis基础,认识Redis

为什么要选择Redis,对比Memcache和Redis的优缺点?你们为啥用Redis?

Memcache

先来看看 Memcache 的特点:
Memcache 处理请求时使用多线程异步 IO 的方式,可以合理利用 CPU 多核的优势,性能非常优秀;
Memcache 功能简单,使用内存存储数据;
Memcache 的内存结构以及钙化问题我就不细说了,大家可以查看官网了解下;
Memcache 对缓存的数据可以设置失效期,过期后的数据会被清除;
失效的策略采用延迟失效,就是当再次使用数据时检查是否失效;
当容量存满时,会对缓存中的[……]

继续阅读

背景

什么实际场景下需要使用分布式锁,为什么?

分布式锁在以下实际场景中经常需要使用:

缓存同步:在分布式系统中,多个节点共享同一个缓存。当缓存失效时,多个节点可能会同时触发对后端数据源的请求。使用分布式锁可以保证只有一个节点去加载数据到缓存中,避免缓存击穿和缓存雪崩问题,提高系统性能和稳定性。

并发任务控制:在分布式任务调度系统中,多个节点可能会争夺执行任务的权限。使用分布式锁可以确保只有一个节点获得任务执行权限,避免重复执行相同的任务或者任务冲突。

数据库操作:在分布式系统中,多个服务同时对同一个数据库进行写操作时,可能会引发数据不一致的问题。使用分布式锁可以保证只有[……]

继续阅读