一文教会你什么是MySQL的索引提示
一文教会你什么是MySQL的索引提示MySql支持索引提示(INDEX HINT)显式地告诉优化器使用那个索引。
也就是比如profession字段有一个联合索引和一个单列索引,你可以选择这条sql是走联合索引还是单列索引
举例来描述:
 A. 执行SQL : explain select * from tb_user where profession = ‘软件工程’;  
 查询走了联合索引。  
 B. 执行SQL,创建profession的单列索引
 C. 创建单列索引后,再次执行A中的SQL语句,查看执行计划,看看到底走哪个索引。  
 测试结果,我们可以看到,possible_keys中 idx_user_pro_age_sta,idx_user_pro 这两个 索引都可能用到,最终MySQL选择了idx_user_pro_age_sta索引。这是MySQL自动选择的结果。  
但是我们就是想让他走给他建的单列索引,那怎么办呢,那就用到了索引/SQL提示
 SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化 ...
彻底弄懂Redis的内存策略
Redis内存策略Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。我们可以通过修改配置文件来设置Redis的最大内存:
当内存使用达到上限时,就无法存储更多数据了
内存过期策略在学习Redis缓存的时候我们说过,可以通过expire命令给Redis的key设置TTL(存活时间):
可以发现,当key的TTL到期以后,再次访问name返回的是nil,说明这个key已经不存在了,对应的内存也得到释放。从而起到内存回收的目的。
这里其实之前我们没有想过:
Redis怎么知道一个key过期了
是不是TTL过期之后就立马删除了
解决第一个问题通过两个dict分别存储key-value和key-ttl
Redis本身是一个典型的key-value内存存储数据库,因此所有的key、value都保存在之前学习过的Dict结构中。不过在其database结构体中,有两个Dict:一个用来记录key-value;另一个用来记录key-TTL。
解决第二个问题
是不是TTL到期就立即删除了呢?
惰性删除
周期删除
 ...
一文教会你为什么索引的底层数据结构是B+树
一文教会你为什么索引的底层数据结构是B+树首先我们要知道: B+Tree索引 最常见的索引类型,大部分引擎都支持 B+ 树索引 。 
作为存储引擎的老大,InnoDB也采用的是B+树索引(但是提前说一下,他使用的B+树是经过优化的版本,比B+树更厉害,后文会详细介绍)
那么为什么B+树做存储引擎这么NB呢?
首先,我们要知道,存储引擎靠什么nb?答案:一是存储量,二是查询速度
我们可以从查询速度入手,先来看看二叉树
二叉树二叉树是我们比较熟悉的一种数据结构,二叉树查询速度要比普通的查询(可以理解为一个数组进行查询)快的多。
但是呢,我说几个不好的点,你就会知道为什么不使用二叉树做数据结构了
如果数据是顺序插入的,就会形成一个单向的二叉树。比如长这样
有没有发现它的层级很深很深,你可能会说,这也不深啊,不就几层,我要存储数据啊,肯定会深一点啊,这样你就错了,因为有更好的数据结构,比如说一个节点里面存储多个值,这样的话节点数少了,层数也少了,当然,这个后面就会说。
所以总结上面两条问题,所以二叉树如果做索引结构,会存在如下的缺点:
万一第一个根节点选的不好的话,顺序插入时,会形成一个 ...
什么是覆盖索引,一篇文章告诉你
什么是覆盖索引,一篇文章告诉你首先,先来看下覆盖索引的概念: 覆盖索引是指 查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到 
 接下来,我们来看一组SQL的执行计划,看看执行计划的差别,然后再来具体做一个解析。  
explain select id, profession 								 from tb_user where profession = '软件工程' and age = 31 and status = '0' ;explain select id,profession,age, status 			 from tb_user	where profession = '软件工程' and age = 31 and status = '0' ;explain select id,profession,age, status, name from tb_user where profession = '软件工程' and age = 31 and status = ...
图文并茂,深刻了解索引失效
图文并茂,深刻了解索引失效不满足最左前缀法则如果索引了多列(联合索引才有最左前缀法则),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过(这个跳过其实就是缺少,跟放的位置没有关系,放在哪里都可以,只要存在这个条件就好了)索引中的列。如果跳跃某一列,索引将会部分失效(后面的字段索引失效)。
以 tb_user 表为例,我们先来查看一下之前 tb_user 表所创建的索引。
在 tb_user 表中,有一个联合索引,这个联合索引涉及到三个字段,顺序分别为:profession, age,status。 
对于最左前缀法则指的是,查询时,最左边的列,也就是profession必须存在,否则索引全部失效。 而且中间不能跳过某一列(缺少查询某个字段),否则该列后面的字段索引将失效。 接下来,我们来演示几组案例,看一下 具体的执行计划:  
 explain select * from tb_user where profession = '软件工程' and age = 31 and status = '0'; 
explain sel ...
MySql之四种SQL性能分析工具
MySql之四种SQL性能分析工具本篇我将为大家讲解SQL性能的分析工具,而只有熟练的掌握了性能分析的工具,才可以更好的对SQL语句进行优化。
SQL执行频率首先我们可以考虑的是:看看这个数据库增删改查的次数是多少,如果查询多,就根据查询多的sql建索引,如果修改添加删除多,就删除索引。所以首先我们得看看这个数据库增删改查的次数分别是多少。
MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息。
通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:  
-- session 是查看当前会话 ;-- global 是查询全局数据 ;-- 其中的Com是固定的SHOW GLOBAL STATUS LIKE 'Com_______';
比如我们可以看到上面的查询比较多(一般都是查询多),那么如果我们想优化以下,让我们的mysql响应更快,我们咋知道哪个查询语句耗时长呢?所以就要用到MySQL中的慢查询日志了。
慢查询日志慢查询日志记录了所有执行时间超过指 ...
Go中的内存管理?
go中的内存管理
Go的内存分配机制是什么?
设计思想 内存分配算法采用Google的TCMalloc算法,每个线程都会自行维护一个独立的内存池,进行内存分配时优先从本线程的内存池中分配,当内存池不足时才会向加锁向全局内存池申请,减少系统调用并且避免不同线程对全局内存池的锁竞争 把内存切分的非常的细小,分为多级管理,以降低锁的粒度 回收对象内存时,并没有将其真正释放掉,只是放回内存池中,以便复用。只有内存闲置过多的时候,才会尝试归还部分内存给操作系统,降低整体开销
分配组件 Go的内存管理组件主要有:mspan、mcache、mcentral和mheap
内存管理单元:mspan mspan是 内存管理的基本单元,该结构体中包含 next 和 prev 两个字段,它们分别指向了前一个和后一个mspan,每个mspan 都管理 npages 个大小为 8KB 的页,一个span 是由多个page组成的,这里的页不是操作系统中的内存页,它们是操作系统内存页的整数倍。 page是内存存储的基本单元,Go中的“对象”就是放到page中的
Go有68种不同大小的spanClass,用于小对象的 ...
Go中的协程的底层是怎么实现的?
协程底层是怎么实现的?
什么是协程?
协程可以认为是轻量级的线程。与线程相比,创建协程的开销更小。比如说一个Go的应用程序同时运行数千个Go协程是很常见的做法
GPM 模型是什么?
GPM分别是什么?
G(Goroutine):叫做Go协程,每个go关键字都会创建一个协程。 P(Processor):叫做调度器(Go中定义的一个摡念,非CPU),里面包含运行Go代码的必要资源,用来调度 G 和 M 之间的关联关系,其数量可通过 GOMAXPROCS() 来设置,默认为核心数。 M(Machine):叫做工作线程,在Go中称为Machine,数量对应真实的CPU核数(真正干活的对象)。 M必须拥有P才可以执行G中的代码,P含有一个包含多个G的队列,P可以调度G交由M执行。
Goroutine调度策略是什么?
简单简述下线程发展: 1.原始的单线程操作系统: 单核,只能同时执行一个线程,线程按照顺序进行执行,一个执行完了再执行下一个。 存在一些问题:   只能一个线程一个线程执行。   如果线程阻塞了,整个系统都会阻塞   CPU浪费,因为大部分时间都在阻塞,CPU都没有用。
2 ...
Go中的map的底层是怎么实现的?
Go中的map的底层是怎么实现的?
map的底层实现是什么?
map指向一个结构,叫hmap,是hashmap的缩写 type hmap struct {    // 元素个数,调用 len(map) 时,直接返回此值 count     int flags     uint8 // B 是 buckets 数组的长度的对数,也就是说 buckets 数组的长度就是 2^B。 B         uint8 // overflow 的 bucket 近似数 noverflow uint16 // 计算 key 的哈希的时候会传入哈希函数 hash0     uint32    // 指向 buckets 数组,大小为 2^B    // 如果元素个数为0,就为 nil buckets    unsafe.Pointer // 等量扩容的时候,buckets 长度和 oldbuckets 相等 // 双倍扩容的时候,bucket ...
Go中的Channel的底层是怎么实现的?
Go中的Channel的底层是怎么实现的?
CSP模型是什么?
CSP是一种并发模型,他以通信的方式来共享内存,而不同于传统的多线程通过共享内存进行通信的方式。
channel的底层数据结构是什么?
type hchan struct { qcount   uint  // 队列中的总元素个数 dataqsiz uint  // 环形队列大小,即可存放元素的个数 buf      unsafe.Pointer // 环形队列指针(只针对有缓冲区的channel) elemsize uint16  //channel中每个元素的大小 closed   uint32  //标识channel的关闭状态 elemtype *_type // channel中数据的元素类型 sendx    uint   // 发送索引,元素写入时存放到队列中的位置 recvx    uint   // 接收索引,元素从队列的该位置读出 recv ...

