进程与线程之间的区别与联系
多线程多线程笔记
0.2.网络通信 0.3.设计模式设计模式
1.JVM JVM虚拟机笔记JVM虚拟机笔记
2.数据库 2.1.MySql MySql的隔离级别MySQL的四种事务隔离级别
MySql的底层实现原理、InnoDB原理、MyISAM原理MySQL索引底层实现原理
MySQL数据库的底层原理,InnoDB和Myisam两种引擎的区别myisam 更适合读取大于写入的业务,同时不支持事物。
innodb 支持事物,效率上比myisam稍慢。
文件存储:
myism物理文件结构为:
-
.frm文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。
-
.myd文件:myisam存储引擎专用,用于存储myisam表的数据
-
.myi文件:myisam存储引擎专用,用于存储myisam表的索引相关信息
innodb的物理文件结构为:
-
.frm与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。
-
.ibd文件和.ibdata文件:
这两种文件都是存放innodb数据的文件,之所以用两种文件来存放innodb的数据,是因为innodb的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。
独享表空间存储方式使用.ibd文件,并且每个表一个ibd文件
共享表空间存储方式使用.ibdata文件,所有表共同使用一个ibdata文件
觉得使用哪种方式的参数在mysql的配置文件中 innodb_file_per_table
B-tree/b+tree 原理以及聚簇索引和非聚簇索引,为什么选用B+/-Tree浅谈算法和数据结构: 十 平衡查找树之B树
B-tree/b+tree 原理以及聚簇索引和非聚簇索引
聚簇索引与非聚簇索引(也叫二级索引)
-
聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据
-
非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因
为什么MySQL数据库索引选择使用B+树?
为什么使用索引查数据更快?什么时候使用索引查数据比全表扫描还更慢?使用什么关键字会触发全表扫描?因为这个二叉树算法,让查询速度快很多,二叉树的原理,就是取最中间的一个数,然后把大于这个数的往右边排,小于这个数的就向左排,每次减半,然后依次类推,每次减半,形成一个树状结构图
上面的例子,我们不使用索引的话,需要查询11次才把编号为4的数据取出,如果加上索引,我们只需要4次就可以取出。
举一个非常好理解的场景(scenario:通过索引读取表中20%的数据)解释一下这个有趣的概念:
假设一张表含有10万行数据--------100000行
我们要读取其中20%(2万)行数据----20000行
表中每行数据大小80字节----------80bytes
数据库中的数据块大小8K----------8000bytes
所以有以下结果:
每个数据块包含100行数据---------100行
这张表一共有1000个数据块--------1000块
上面列出了一系列浅显易懂的数据,我们挖掘一下这些数据后面的故事:
通过索引读取20000行数据 = 约20000个table access by rowid = 需要处理20000个块来执行这个查询
但是,请大家注意:整个表只有1000个块!
所以:**如果按照索引读取全部的数据的20%相当于将整张表平均读取了20次!!**So,这种情况下直接读取整张表的效率会更高。很幸运,Oracle也是这么想的
-
应尽量避免在where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,
-
应尽量避免在where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
-
应尽量避免在where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
-
in 和not in 也要慎用,否则会导致全表扫描,
-
下面的查询也将导致全表扫描:
https://www.cnblogs.com/jameslif/p/6406167.html
数据库中,exist和in的区别?链接
数据库四大特性和隔离级别,脏读,不可重复读,虚读不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
数据库的四种隔离级别
全文索引,索引什么时候会失效?索引的优化,最左前缀原则 数据库设计三大范式(简单易懂)https://www.cnblogs.com/1906859953Lucas/p/8299959.html
数据库索引类型及实现方式
唯一索引、主键索引和聚集索引B+树,位图索引,散列索引
主键索引和非主键索引的区别
从图中不难看出,主键索引和非主键索引的区别是:非主键索引的叶子节点存放的是主键的值,而主键索引的叶子节点存放的是整行数据,其中非主键索引也被称为二级索引,而主键索引也被称为聚簇索引。
根据这两种结构我们来进行下查询,看看他们在查询上有什么区别。
1、如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树。
2、如果查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,得到ID=100,再到ID索引树搜索一次,这个过程也被称为回表。
高并发下数据库分库分表面试题整理
分库分表后会有哪些坑?1、事务一致性问题
由于表分布在不同库中,不可避免会带来跨库事务问题。一般可使用"XA协议"和"两阶段提交"处理,但是这种方式性能较差,代码开发量也比较大。
通常做法是做到最终一致性的方案,往往不苛求系统的实时一致性,只要在允许的时间段内达到最终一致性即可,可采用事务补偿的方式。
2、分页、排序的坑
日常开发中分页、排序是必备功能,而多库进行查询时limit分页、order by排序,着实让人比较头疼。
分页需按照指定字段进行排序,如果排序字段恰好是分片字段时,通过分片规则就很容易定位到分片的位置;一旦排序字段非分片字段时,就需要先在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序,最终返回给用户,过程比较复杂。
3、全局唯一主键问题
由于分库分表后,表中的数据同时存在于多个数据库,而某个分区数据库的自增主键已经无法满足全局唯一,所以此时一个能够生成全局唯一ID的系统是非常必要的。那么这个全局唯一ID就叫分布式ID。
分库分表要解决的问题 2.2.Redis 对外封装的数据结构最详细的Redis五种数据结构详解
内部的数据结构redis底层设计(一)——内部数据结构
Redis 为什么不直接使用 C 字符串,而要自己构建一种字符串抽象类型 SDS(simple dynamic string)?了解下Redis的sds结构
- C语言使用长度N+1的字符数组来表示长度为N的字符串,并且最后一个字符串总是空字符串’ ‘. ,而且它并不记录自身的长度信息,如果要获取,必须全部遍历;但SDS不一样,他有len属性记录了长度,所以获取长度的复杂度很高。
- C字符串容易缓冲区溢出,而SDS的空间分配策略则不会,当需要操作字符串时,会先检测空间大小,如果不满足,则需要对空间做扩展。
- C在对字符串做修改时,因为没有记录长度信息,所以需要频繁对内存做分配,而SDS通过free属性来记录未使用的空间,实现空间预分配和惰性空间释放。
Redis的字符串的底层实现SDS
Redis持久化方式Redis持久化方式
Redis 中如何实现的消息队列?Redis 中如何实现的消息队列?实现的方式有几种?
Redis如何实现延迟队列延时队列:基于 Redis 的实现
3.大数据 3.1.Hadoop/HDFS 3.2.Hive 3.3.HBase 3.4.Presto 3.5.Kudu 3.6.StarRocks 3.7.Kafka 3.8.Flink 3.9.Flink 3.10.ElasticSearch elasticsearch选主流程elasticsearch 选主流程
深入elasticsearch(三):elasticsearch选主流程详解
10.Misc 20.八股文每日一题- [八股文每日一题](



