数据库
文章平均质量分 88
No_Game_No_Life_
这个作者很懒,什么都没留下…
展开
-
面试准备:MySQL建立索引的原则
文章目录1. =和in可以乱序2. 最左前缀匹配原则3. 尽量选择区分度高的列作为索引4. 索引列不能参与计算5. 尽量的扩展索引,不要新建索引6. 为经常需要排序、分组和联合操作的字段建立索引7. 为常作为查询条件的字段建立索引8. 限制索引的数目9. 尽量使用数据量少的索引10. 尽量使用前缀来索引11. 删除不再使用或者很少使用的索引1. =和in可以乱序比如:a = 1 and b = 2 and c = 3建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的原创 2021-08-15 11:28:45 · 1416 阅读 · 3 评论 -
LevelDB——Compaction操作理解
文章目录LevelDBLevelDB组件LevelDB读/写操作读写LevelDB压缩操作(Compaction)Minor CompactionMajor CompactionLevelDBLevelDB的数据是存储在磁盘上的,采用LSM-Tree的结构实现。LSM-Tree将磁盘的随机写转化为顺序写,从而大大提高了写速度。为了做到这一点LSM-Tree的思路是将索引树结构拆成一大一小两颗树,较小的一个常驻内存,较大的一个持久化到磁盘,他们共同维护一个有序的key空间。写入操作会首先操作内存中的树原创 2021-08-07 17:46:43 · 893 阅读 · 0 评论 -
Distributed Database System —— Mysql Binlog实现异地多活
文章目录引入数据冲突数据回环解决方案引入数据库架构在部署时,往往会部署到不同的地区,甚至跨洲,这样做有一些好处:部署到多个地区(IDC),不同的用户可以选择离自己最近的机房进行访问。比如部署到华北地区时,北京用户访问该数据库可能就会比上海用户速度快,而如果在华东地区再部署一个数据库时,可能上海用户延迟高的情况就会得到优化。解决容灾问题。这里容灾不是单台机器故障,而是指机房断电,自然灾害,或者光纤被挖断等重大灾害。一旦出现这种问题,将无法正常为用户提供访问,甚至出现数据丢失的情况。当然有一个问题原创 2021-03-10 20:44:19 · 406 阅读 · 1 评论 -
Distributed Database System —— Mysql Binlog不止是主从同步
文章目录引入Binlog应用场景读写分离数据恢复保证数据最终一致性异地多活引入Mysql 5.0以后,支持通过binary log(二进制日志)以支持主从复制。复制允许将来自一个MySQL数据库服务器(master) 的数据复制到一个或多个其他MySQL数据库服务器(slave),以实现灾难恢复、水平扩展、统计分析、远程数据分发等功能。下面以mysql主从复制为例,讲解一个从库是如何从主库拉取binlog,并回放其中的event的完整流程。mysql主从复制的流程如下图所示:主要分为3个步骤:原创 2021-03-10 18:08:17 · 184 阅读 · 1 评论 -
Distributed Database System —— 什么是嵌入式数据库?
文章目录什么是嵌入式数据库(Embedded Database)数据库服务器的架构嵌入式数据库架构区别像Oracle、Sybase、MySQL和SQL Server这些大家熟知的数据库都属于数据库服务器(当然不排除某些也提供嵌入式版本),而像SQLite、Berkeley DB、包括在Crdb里使用的RocksDB、Pebble、Hyperledger Fabric中使用的CouchDB 等属于嵌入式数据库。那么什么是嵌入式数据库呢? 为什么要使用嵌入式数据库? 嵌入式数据库有什么优势?以及它的应用场景原创 2021-03-09 17:10:45 · 408 阅读 · 2 评论 -
Distributed Database System —— Snapshot Isolation 快照隔离的各种实现方案
文章目录SI & MVCCSI运作过程SI & Write SkewSSISI & MVCC快照隔离(SI,Snapshot Isolation)是讨论隔离性时常见的术语,可以做两种的解读,一是具体的隔离级别,SQL Server、CockroachDB都直接定义了这个隔离级别;二是一种隔离机制用于实现相应的隔离级别,在Oracle、MySQL InnoDB、PostgreSQL等主流数据库中普遍使用。多版本并发控制(MVCC,multiversion concurrency c原创 2020-12-15 21:15:57 · 1102 阅读 · 0 评论 -
InnoDB存储引擎——表的逻辑存储及实现
文章目录表的逻辑存储结构表分区表的逻辑存储结构在InnoDB存储引擎上,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table),如果一个表没有指定主键,那么会:首先判断是否存在唯一非空索引,如果有则为主键。否则InnoDB会自动创建一个6个字节大小的指针。所有的数据都被逻辑的存放在一个空间里,成为表空间。表空间又由段(Segment)、区(extent)、页(page)组成。表空间表空间分为独立表空间和共享表空间。如果启用了独立表空原创 2020-11-23 16:14:16 · 178 阅读 · 0 评论 -
InnoDB存储引擎——InnoDB关键特性
文章目录插入缓冲InnoDB存储引擎的关键特性包括:插入缓冲(Insert Buffer)两次写(Double Write)自适应哈希索引(Adaptive Hash Index)异步IO(Async IO)刷新邻接页(Flush Neighbor Page)插入缓冲原创 2020-11-23 15:32:41 · 431 阅读 · 0 评论 -
InnoDB存储引擎——缓冲池
文章目录缓冲池缓冲池中的三种链CheckPoint技术缓冲池虽然InnoDB是基于磁盘存储的,但是由于CPU和磁盘速度的巨大鸿沟,所以对于数据库中的页的修改操作,首先会修改在缓冲池中的页,然后再以一定频率刷新到磁盘上。具体来看,在缓冲池中占主要(大部分)的是索引页和数据页,但缓冲池还会包含undo页、插入缓冲、自适应哈希索引、InnoDB存储的锁信息、数据字典信息等。从InnoDB 1.x开始,允许有多个缓冲池实例(默认值为1),每个页根据哈希值被平均分配到不同的缓冲池实例中,减少数据库内部的资源原创 2020-11-22 18:47:47 · 260 阅读 · 0 评论 -
高性能Mysql——一条SQL语句执行很慢的原因有哪些?
文章目录引入SQL偶尔执行很慢数据库在刷新脏页数据库缓存过期了数据库上锁了其他原因SQL一直执行很慢没有用到索引或者索引失效查询出的数据量过大硬件问题引入之前一直没有很详细的讨论这个问题,只是将问题的解决方法归于Explain方法和慢查询日志,这里需要详细的讨论下SQL是如何慢下来的。SQL变慢,可以大致上分为偶尔执行很慢和一直很慢,后一种才是上述解决方法针对的情况,而偶尔很慢实际上可能有很多原因导致。所以这里分类讨论下两种慢查询的原因。SQL偶尔执行很慢一条 SQL 大多数情况正常,偶尔才能出原创 2020-06-08 18:44:07 · 632 阅读 · 0 评论 -
高性能Mysql——Mysql通过基数判断放弃索引而走全表扫描
文章目录引入什么时候走全表扫描mysql如何预测判断引入有时候我们使用explain来做分析的时候,有时候明明是设置了索引,但是也还是不走索引,而是走了全表扫描。是因为Mysql做出了一个估计——走全表扫描的效率相比索引来说更高。那么Mysql判断全表扫描更高效的依据有哪些呢?我们假设数据库表是这样的:CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL,原创 2020-06-08 22:45:22 · 3042 阅读 · 1 评论 -
高性能Mysql——InnoDB事务是如何通过日志来实现的?
文章目录Redo logredo log buffer会不会丢失事务?双“1”设置为什么还是要经过磁盘?Undo log总结InnoDB的日志分为redo log和undo log。Redo logredo log叫做重做日志,是用来实现事务的持久性(用于数据库的崩溃恢复),当事务提交之后会把所有修改信息都会存到该日志中。该日志由两部分组成,一个是在内存里的redo log buffer,另一个是在磁盘里的redo log文件。mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到B原创 2020-06-12 16:47:32 · 1591 阅读 · 2 评论 -
高性能Mysql——一条SQL语句在Mysql中是如何执行的?
文章目录MySQL 基本架构概览Server层介绍SQL执行过程查询语句更新语句本篇文章会分析下一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的。在分析之前我会先带着你看看 MySQL 的基础架构,知道了 MySQL 由那些组件组成已经这些组件的作用是什么,可以帮助我们理解和解决这些问题。MySQL 基本架构概览简单来说 MySQL 主要分为 Server 层和存储引擎层:Server 层:主要包括连接器、查询缓存原创 2020-06-28 16:41:34 · 601 阅读 · 1 评论 -
伸缩自如的ElasticSearch——数据库索引原理
文章目录引言B/B+ Tree聚集索引非聚集索引覆盖索引引言使用索引很简单,只要能写创建表的语句,就肯定能写创建索引的语句,要知道这个世界上是不存在不会创建表的服务器端程序员的。然而, 会使用索引是一回事, 而深入理解索引原理又能恰到好处使用索引又是另一回事,这完全是两个天差地别的境界(我自己也还没有达到这层境界)。很大一部份程序员对索引的了解仅限于到“加索引能使查询变快”这个概念为止。那么思...原创 2019-05-17 10:36:40 · 729 阅读 · 0 评论 -
高性能Mysql——SQL执行计划分析(EXPLAIN)
文章目录通过EXPLAIN进行执行计划分析IDselect_typeTablePartitionsTypeExtrapossible_keysKeykey_lenRefRowsFilteredEXPLAIN不能完成的事项通过EXPLAIN进行执行计划分析在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个...原创 2019-12-02 16:05:51 · 1307 阅读 · 0 评论 -
高性能Mysql——分区表详解
文章目录分表和分区分表和分区的区别分表和分区分表MySQL 的分表是真正的分表,一张表分成很多表后,每一个小表都是完整的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。分区一张大表进行分区后,它还是一张表,不会变成多张表,但是存放数据的区块变多了。分表和分区的区别实现方式上a) mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正...原创 2019-12-02 14:48:58 · 259 阅读 · 0 评论 -
高性能Mysql——电商项目用户模块设计示例
文章目录用户实体用户表逻辑设计用户表的表结构设计用户实体用户实体中包含的属性如下:有些属性是通过用户录入进行输入的,而有些属性则是通过后台计算得到的。保存上述一个用户实体,最简单的方法当然是简单粗暴的把用户实体内的属性保存在一个表里面,如下图所示:这样做的好处很明显:容易进行数据的存取,不用考虑多个表中的数据一致性问题,当然也不用关联数据表,查询时是很方便的。用户表逻辑设计但是上...原创 2019-12-01 20:29:04 · 903 阅读 · 0 评论 -
高性能Mysql——Mysql开发规范
文章目录数据库字段设计规范索引设计规范主键常见索引列建议如何选择索引顺序其他原则SQL开发规范数据库操作行为规范数据库字段设计规范(一)优先选择符合存储需要的最小数据类型比如将字符串转化为数字类型存储(mysql提供了如下两个函数):INET_ATON('255.255.255.255')=4294967295INET_NTOA(4294967295)='255.255.255.255'...原创 2019-12-01 10:27:21 · 184 阅读 · 0 评论 -
高性能Mysql——Schema与数据类型优化
文章目录选择优化的数据类型整数类型实数类型字符串类型选择优化的数据类型MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。通常又以下几个原则:更小的通常更好。一般情况下,应该尽量使用可以正确存储数据的最小数据类型(比如,只需要存储0-200,使用tinyint unsigned更好)。更小的数据类型通常更快,因为占用更少的磁盘、内存和CPU缓存,并且处理时需要的CP...原创 2019-07-23 14:11:10 · 300 阅读 · 0 评论 -
高性能Mysql——范式与反范式
数据库结构设计我们知道,在开发中数据库往往会采用反范式的设计,也就是说,数据库表产生冗余以加强数据查询操作的效率。所以,我们需要一套方法,来衡量何时需要何种数据库设计来保证效率。先来看数据库优化的目的:减少数据冗余。注意:这里是减少,而不是消除。尽量避免数据维护中出现异常(插入、删除、更新异常)。提高查询效率。第二范式:一个表只能有一个业务主键,不存在非主键的列对部分主键的依赖...原创 2019-07-22 17:31:17 · 548 阅读 · 0 评论 -
高性能Mysql——查询性能优化
文章目录查询慢的原因慢查询基础:优化数据访问查询慢的原因如果把查询看作一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上是要优化其子任务,要么消除一些子任务,要么减少子任务的执行次数。慢查询基础:优化数据访问查询性能低下最基本的原因是访问的数据太多,某些查询可能不可避免的需要筛选大量数据,但并不十分常见。大部分性能低下的查询都可以通过减少访问的数据量的...原创 2019-07-24 11:22:13 · 458 阅读 · 0 评论 -
高性能Mysql——创建高性能的索引
文章目录索引类型高性能的索引策略独立的列前缀索引和索引选择性多列索引覆盖索引使用索引扫描来做排序重复索引和冗余索引索引类型我们知道,索引的实现有很多种,在Mysql中,索引是在引擎中实现的,所以没有统一的索引类型标准。B-Tree索引关于这方面的索引原理,参考我之前写的文章伸缩自如的ElasticSearch——数据库索引原理。哈希索引基于哈希表的实现,只有精确匹配索引所有列的查询才有...原创 2019-07-23 17:02:27 · 385 阅读 · 0 评论