1.什么是undo log、redo log、binlog?
- Undo log(回滚日志):是存储引擎层生成的日志,实现了事务的原子性,主要用于事务回滚和MVCC。
- Redo log(重做日志):是存储引擎层生成的日志,实现事务的持久性,主要用于掉电等故障恢复。
- binlog(归档日志):是Server层生成的日志,主要用于数据备份和主从复制。
2.undo log的作用?
如果一个事务在执行过程中,还没有提交事务之前,如果MySQL发生了崩溃,要怎么回滚到事务之前的数据呢?
如果一个事务在执行过程中,还没有提交事务之前,如果MySQL发生了崩溃,要怎么回滚到事务之前的数据呢?
我了解的是MySQL的锁可以分为全局锁、表级锁、行级锁。
我比较熟悉的是表级锁和行级锁,如果我们对表结构进行修改时,MySQL就会对这个表结构加一个元数据锁。
行级锁目前只有InnoDB存储引擎实现了,主要有记录锁、间隙锁、临键锁、插入意向锁。
原子性、一致性、隔离性、持久性。
什么是索引?为什么索引可以加快查询?
索引的数据结构?
B+树和B树、红黑树有什么区别?为什么选择B+树,作为索引数据结构?
索引是一种能提高查询速度的数据结构。
1、索引结构/索引类型:
重点掌握AND、OR、IN、NOT IN、BETWEEN、LIKE、IS、NULL、EXISTS、DISTINCT。
JOIN:内连接、左连接、外连接。UNION:组合查询。
INSERT、DELETE、UPDATE。
聚合函数:COUNT、MAX、MIN、SUM、AVG。
重点掌握GROUP BY和HAVING以及与Where的区别。
1.count(*)、count(1)那种性能更好?
前言
什么是并发编程?什么是并行,并发,串行?
Go语言如何实现并发编程,以及实现的原理,goroutine的使用。
runtime包、sync包的介绍。
channel通道的使用,以及缓冲通道,定向通道。
select语句,time包中和并发编程相关的函数介绍。
CSP模型。
推荐个人主页: 席万里的个人空间
type hchan struct {
qcount uint // total data in the queue
dataqsiz uint // size of the circular queue
buf unsafe.Pointer // points to an array of dataqsiz elements
elemsize uint16
closed uint32
timer *timer // timer feeding this chan
elemtype *_type // element type
sendx uint // 开始写的位置
recvx uint // 开始读的位置
recvq waitq // 添加读的等待队列
sendq waitq // 添加写的等待队列
lock mutex // runtime.Mutex 保证线程安全
}
type waitq struct {
first *sudog
last *sudog
}
sync.Map在高并发读多写少的场景中性能较好,因为它内置了优化的同步机制(如分段锁),适用于并发访问较高的情况。相比之下,原生map在没有并发操作时性能最好,因为它没有加锁机制,操作更快。但在多线程并发读写时,原生map可能导致数据竞争,因此在并发环境中使用时性能较差。
sync.Map是一个结构体:
type Map struct {
mu Mutex
read atomic.Value // 后面是readOnly结构体,依靠map实现,仅仅只用来读
dirty map[interface{}]*entry // 这个map主要用来写的,部分时候也承担读的能力
misses int // 记录读或删dirty map的次数
}
在 Go 语言中,map和 slice 是非线程安全的,因为它们的底层实现没有针对并发访问做同步保护。对于 map,并发读写可能导致哈希表结构损坏;对于 slice,多个 goroutine 同时修改或扩展底层数组可能导致数据竞争。为了确保线程安全,通常需要使用 sync.Mutex 或 sync.RWMutex 来加锁,或者使用 Go 提供的并发安全数据结构,如 sync.Map。这个sync.Map会在下一节中剖析底层原理,以及解释为什么Go有了map还需要创建一个sync.Map。
直接开始map的底层原理剖析,启动!🚀