Mysql
我是根据黑马的视频学习的,之前零零散散的学习过mysql, 会写基础的sql,所以基础部分掠过,直接看得进阶篇 索引 Hash索引 特点 只能用于对等比较(=, in), 不支持范围查询(between, >, <) 无法利用索引完成排序操作 查询通常一次检索就可以,效率高,通常高于比B+tree索引 存储引擎支持: Memory InnoDB: 具有自适应hash功能,hash索引是存储引擎根据 B+Tree 索引在指定条件下自动构建的 为什么innoDB使用B+tree 特性 哈希表 (Hash) 二叉平衡树 (AVL/红黑树) B 树 B+ 树 (InnoDB选择) 等值查询 极快 快 快 快 范围查询 不支持 较慢 (需回溯) 一般 (需跨层) 极快 (链表遍历) 磁盘 I/O 较多 很多 (树太高) 较少 极少...
前缀树
前缀树 力扣练习题 1234567891011121314151617181920212223242526272829303132333435363738394041type TrieNode struct { children [26]*TrieNode isEnd bool //是否有以当前节点为结尾的单词} type Trie struct { root *TrieNode } func Constructor() Trie { return Trie{root: &TrieNode{}} } func (t *Trie) Insert(word string) { move := t.root for _, ch := range word { index := ch - 'a' if...
计算机网络-网络层
网络层 湖科大计网 分类编址的IPv4地址 A类地址 最小网络号为0, 保留不指派 第一个可指派的网络号为1, 网络地址为1.0.0.0 最大网络号为127, 作为本地环回测试地址,不指派 最小的本地环回测试地址为127.0.0.1 最大的本地环回测试地址为127.255.255.254 最后一个可指派的网络号为126 可指派的网络的数量为126, 每个网络中可以分配的IP地址数量为2^24 - 2 = 16777214 (减2是取出全0的网络地址和全1的广播地址) B类 最小网络号128, 最大网络号191.255 可指派网络数为2 ^ (16 - 2) = 16384, 每个网络中可分配的IP地址数量为2 ^ 16 - 2 = 65534 C类 最小网络号192, 最大网络号223.255.255 可指派的C类网络数量2 ^(24 - 3), 每个网络中可分配的IP地址数量为2 ^ 8 -...
GMP
线程 内核态,操作系统的最小调度单元,创建销毁,调度都需要由内核来完成,可以充分利用多核,实现并行 协程 用户态,是线程的子集,在线程的基础上,对线程进行二次加工得到,从属于某一个线程,与线程存在映射关系比例是m :...
主流排序算法
按照排序的依据,可以分为两类,比较类排序与非比较类排序 比较类排序是通过比较决定次序,快排,选择排序,插入排序都属于此类,比较类排序的优势是适用性,它不在乎数据的分布,只要能比较就能排,但是比较类排序的速度有上限,时间复杂度下界是O(NlogN)O(N logN)O(NlogN) 非比较类排序包括,计数排序,桶排序,基数排序,不通过排序进行比较,这类算法的时间复杂度为O(n)O(n)O(n),但是对数据类型限制比较大,而且因为用空间换时间,所以对数据的规模也有一定要求,此外,对数据的分布硬额比较敏感,如果分布不均匀(有的桶是空的,有的桶是满的),效率就会降低 冒泡排序 原理:依次比较两个元素,顺序错误就交换,直到没有交换的为止 代码实现: 12345678910111213141516171819func bubble(nums []int) []int { l := len(nums) //排序l - 1轮 for i := 0; i < l - 1; i++ { swapped := flase ...
context原理
这篇文章讲的太好了,自己记录一下加深印象 主要用途:用于在异步场景并发协调以及对goruntinue的生命周期进行控制,传递取消信号,超时,截止时间,并且具有一定的数据存储能力 核心数据结构 123456type Context interface { Deadline() (deadline time.Time, ok bool)//返回context的过期时间 Done() <-chan struct{}//返回一个channel,当Context被取消或超时,这个channel会关闭 Err() error//返回错误 Value(key any) any//在调用链中携带的键值对数据} emptyCtx 根基:是所有context的根 类的实现 12345678type emptyCtx intfunc (*emptyCtx)Deadline() (deadline time.Time, ok bool) {return}func (*emptyCtx) Done()...
channel底层实现
数据结构 Channel在运行时使用hchan结构体,结构如下 12345678910111213141516type hchan struct { qcount uint //队列中当前元素的个数 dataqsiz kuint //环形队列的总容量 buf unsafe.Pointer //指向底层环形数组的指针 elemsize uint16 //元素的大小 elemtype *_type //元素的类型信息 sendx uint //发送索引,下一次发送写入的位置 recvq uint //接受索引,下一次接收读取的位置 recvq waitq //双向链表,等待接收的goruntine队列 sendq waitq //等待发送的goruntine队列 lock mutex //互斥锁,保护结构体} recvq 和 sendq 的作用是存储那些“因为无法立即完成操作”而被迫阻塞(睡眠)的 Goroutine recvq:想读数据但读不到的 Goroutine sendq:想发数据但发不出去的...
包的匿名导入
作用:利用包的副作用,即执行包内的init函数,但是不直接使用该包导出的任何变量或函数 常见使用场景: 数据库注册驱动 12345678910111213 package mainimport ( "database/sql" "fmt" // 匿名导入 MySQL 驱动 // 我们代码里不需要直接写 mysql.Connect,所以用 _ "github.com/go-sql-driver/mysql")func main() { // 这里可以直接使用 mysql 驱动,因为上面的匿名导入已经把它注册进去了 db, err := sql.Open("mysql",...
Go语言圣经第9章-sync
不要使用共享数据来通信,使用通信来共享数据 无论任何时候,只要有两个goroutine并发访问同一变量,且至少其中的一个是写操作的时候就会发生数据竞争 避免数据竞争的三种方式: 不去’写’变量 避免多个goroutine访问变量,变量都被限定在一个goroutine中,...








