最难进的十大央企新十条优化措施

当前位置: 首页 > news >正文

最难进的十大央企,新十条优化措施,百度商标注册查询,成都保洁公司03 Database Storage-Part Ⅰ 数据库存储上半部分 数据库分层划分结构图#xff1a; Disk Manager#xff1a;存储引擎#xff0c;管理磁盘上的文件Bufferpool Manager#xff1a;管理内存的缓存池Access Methods#xff1a;访问方法Operator Execution#xff1a;执行…03 Database Storage-Part Ⅰ 数据库存储上半部分 数据库分层划分结构图 Disk Manager存储引擎管理磁盘上的文件Bufferpool Manager管理内存的缓存池Access Methods访问方法Operator Execution执行器Query Planning计划、优化器 disk based architecture 基于磁盘的体系结构存储分层存储方式分级高速缓存特性volatile易失的NVnon-volatile不易失的 fast smaller expensive更快、更小、更贵的内存volatilerandom易失的随机访问slower laeger cheaper更慢更便宜的内存non-volatileorder不易失的顺序访问 越往上越贵越快 Volatile Random Access Byte-Addressable掉电易失、随机访问可以按照字节获取地址的 CPU CPU RegistersCPU寄存器CPU CaChesCPU高速缓存CPU上说的L1、L2、L3 Memory DRAM内存DDRDynamic Random Access Memory动态随机存取存储器 Non-Volatile Sequential Access Block-Addressable不易失的掉电数据仍然存在、顺序访问按照块编辑地址无法精确获取块中的每个字节只能将整个块读取然后才能获取块中内容修改块中字节需要先将块中内容读取修改块中字节然后将块写回去云计算中很多块设备意思相同就是它按照块存储 Disk Non-volatile Memory新型的存储器它的速度比SSD快他还是非易失的。市面上还很少但是intel已经把它做出来了有个Non-Volatile Memoey Database Management System【非易失性备忘录数据库管理系统】以及intel的OPTANE DC【intel傲腾持久存储】persistent memory持久化内存。可能会改变数据库的架构因为落到内存上就不会丢失SSD固态硬盘Fast Network Storage云计算高速存储器云服务器一般是要比本地快因为是本地高速光纤过来的挂载云硬盘HDD机械硬盘Network Storage网盘 access times访问时间单位对应1sec量化 比如有一些老旧的数据库不想仍以后可能有用但是估计长时间没有用的数据就可以使用磁带的方式存储磁带是磁化很稳定适合于存储长时间不使用的大量数据机械也是类似只要不去非常频繁的读写磁化是很稳定的 ​ 0.5 ns L1 Cache Ref ← 0.5 sec ​ 7 ns L2 Cache Ref ← 7 sec ​ 100 ns DRAM ← 100 sec ​ 150,000 ns SSD ← 1.7 days ​ 10,000,000 ns HDD ← 16.5 weeks ~30,000,000 ns Network Storage ← 11.4 moths 1,000,000,000 ns Tape Archives磁带塔 ← 31.7 years sequential VS. random access 对比顺序存储和随机存储 连续存取要比随机存取要远远快得多 开发数据库的要求用户的存取是随机的因为不能要求用户的存取所以目的就是把用户需要的随机存取尽量转化为数据库对磁盘的连续存取这是考验数据库设计能力的环节。例如用户取用随机的数据我们先将其缓存到内存中然后找一个合适的时间再将其写道硬盘中去 文件的一个块/也叫一个页一个页对应一个文件的小分区存储也有页数据库自己也有页页和页概念也不一样 system design goals 设计这样一个存储引擎的目标是什么 Allow the DBMS to manage database that exceed the amount of memory available.【允许DBMS管理超过可用内存量的数据库】为了将可能大于内存的数据加载到内存中需要有一个好的替换策略来保证数据库的加载Reading/writing to disk is expensive, so it must be managed carefully to avoid large stalls and performance degradation.【读取/写入磁盘的成本很高因此必须谨慎管理以避免出现大的停顿和性能下降】即使使用ssd读写数据库的成本也是很高的所以不要经常的读写Random access on disk is usually much slower than sequential access, so the DBMS will want to maximize sequential access.【磁盘上的随机访问通常比顺序访问慢得多因此DBMS希望最大化顺序访问】一个优秀的存储引擎应该尽可能的去将随机访问转化为顺序访问 disk-oriented DBMS 大部分的数据库都是面向硬盘的有些数据库是memory数据存在内存中的面向内存的数据库容量小但是速度特别快 Disk Database File数据库文件一个大的数据库文件都是存放在一个database中的这些数据库文件在数据库中是分pages的db page结构就是在前面会有一个类似于目录的东西告诉你什么东西在哪一个页每一个page中每一个页可以认为是一块数据他有固定的大小4k/ 8k/ MySQL 16k每一块数据还有一个headerheader就是数据头对数据进行一些解释类似于http头。 Memory Buffer Pool内存池:会将需要的数据库数据加载到内存池中在游戏中是一个loading的过程需要那部分就加载那部分池是因为需要控制它的大小他不能占太大内存否则要不导致系统崩溃要不被操作系统干掉 Execution执行器执行器在内存中获取一个页Get page #2内存中会先将目录加载到内存中然后看需要那页在把需要的页loading到内存中然后返回给执行器pointer to page #2 Q. why not use the OS? The DBMS can use memory mapping(mmap) to store the contents of a file into the address space of a program. 【数据库管理系统可以通过将内存映射去将文件内容存储到程序的地址空间中】 The OS is responsible for moving the pages of the file in and out of memory, so the DBMS dosen’t need to worry about it. 【操作系统允许文件的页移入和移出内存所以数据库管理系统不需要担心】 mmap提供虚拟内存如果想把disk磁盘中的数据全都加载到内存中是不可能的例如1T硬盘和8G内存如果想使用就需要一些办法swap替换、加载一块啊什么的但是mmap提供了一个虚拟内存virtual memory这个虚拟内存和实际的物理内存是一样大的软件直接访问虚拟内存然后需要访问page1时操作系统将page1去load到physical memory物理内存中再把虚拟内存链接过来mmap访问虚拟内存中的page1就相当于访问了内存中的page1这样就不需要去管理内存加载卸载的过程了但是这样的方法会有问题当物理内存都填满的情况下我还要继续加载新的page页到内存中这时候操作系统是不知道内存中的页那个可以卸载的因为两个页都是数据库再用用完之后没有告诉操作系统那个页不用了所以新的页需要加入但是操作系统满了的话就会卡住 mmap问题 如果只读的话还可以但是如果有很多并发写的话mmap也会有问题 然后衍生出了一些辅助mmap的方法 madvice告诉操作系统你期望的阅览方式Tell the OS how you expect to read certain pages.mlock告诉操作系统那些内存页不使用了Tell the OS that memory ranges cannot be paged out.msync告诉操作系统将内存中的内容刷新到磁盘Tell the OS to flush memory ranges out to disk. DBMS (almost) always wants to control things itself and can do a better job than the OS. 【DBMS希望自己管理和控制并且希望比操作系统管理的更好】Flushing dirty pages to disk in the correct order. 【按照正确的顺序将脏数据刷新到磁盘中】我们需要自己控制将这些修改的脏数据刷到磁盘中的时间是立即就放到磁盘中还是等几秒和更多的脏数据一起放到磁盘中如果不自己控制的话数据库系统性能会非常的差。 Specialized prefetching. 【预先将磁盘的数据取出来】用户没有需要的时候就取出来例如用户进行全表扫描执行器取出第1、2、3块的时候存储引擎预先将4、5、6块取出送到内存里去这样执行器访问就省去了等待磁盘加载到内存的过程这个是需要完全的自己控制的 Buffer replacement policy. 【缓冲区替换策略】来了新数据需要把什么数据替换掉例如LRU这种 Thread/process scheduling. 【进程/线程调度】用户并发读写时候先后顺序需要我们自己控制
上述的工作无法交给操作系统完成所以不去使用操作系统 database storage 数据库存储两大关键问题 problem #1How the DBMS represents the database in files on disk. 【如何在磁盘上表示数据库】也就是数据库最终落到一个什么样的文件上 problem #2How the DBMS manages its memory and moves data back-and-forth from disk. 【DBMS如何管理内存和磁盘来回转移的数据】什么时候将数据复制到内存什么时候将修改的数据写回磁盘
problem #1 How the DBMS represents the database in files on disk. 数据库最终落到的文件表示细分为三个小问题文件、页、一行数据分别长什么样 File storage【文件存储】 文件存储就是把用户数据存在操作系统磁盘里一个或者多个文件当中这些文件内容是什么操作系统不知道也不关心操作系统只知道有这些数据你给我存里 早期系统在原始存储上使用自定义文件管理系统就是说拿到一个磁盘自动进行格式化怎么存的你也不用知道就是一个一体机现在这种情况越来越少了更多的是交给操作系统去格式化操作系统格式化之后例如使用MySQL出现两个文件你在操作系统中你是可以看到的格式化的文件系统交给数据库数据库在里面存 storage manager【存储管理】管理维护操作系统里的数据库文件 它会自己管理在时间空间上的存取数据一般来说我们的存储引擎会将这个文件当成一组page页 database pages【数据库页】 一个页就是一小块数据它可以是元组、元数据、索引、日志。对于数据库来说如果它存索引那么这个数据库就是存索引存日志他就是存日志存元数据就是存元数据它不会是存多个数据的。有一些系统会存一些字节页你不知道数据库存的是什么类型的你可以根据这几个字节来知道这个数据库存的是什么类型的这几个字节用于告诉存储类型 每一个页都有一个唯一的id为了方便管理页的概念有不同的解释hardware page硬盘层面的话通常是4KB操作系统的页通常是4KB我们无法直接操作硬件我们需要将我们操作的数据先交给操作系统由操作系统去接触硬件这个操作的最小单位就是4k数据库自己的页概念512B~16KB512B什么经常是一些便携式设备例如手机16K是操作系统和硬盘的整数倍对于自己来说写了16K就是写了一个页对于它们来说就是写了4个页最小管理单位一个hardware page是最小的保证原子操作的页如果磁盘告诉我写失败了那么这4k就全写失败了如果写了16k告诉我写失败了哪不知道哪里写失败了4KBSQLite移动、DB2、Oracle8KBSQLServer、PostgreSQL16KBMySQL database heap【数据库堆文件】 A heap file is an unordered collection of pages with tuples that are stored in random order. Create/Get/Write/Delete Page Must also support iterating over all pages. 【堆文件是一堆无序的页的集合这些页要满足增删改查的功能然后这些页必须可以迭代】 Two ways to represent a heap file: Linked List Page Directory 多文件【表示堆文件的两种方式链表和页目录】 链表方案使用空文件链表和数据文件链表表示目录方案一个目录用于索引告诉你几号页在哪 Page Layout【页布局】 每个页的布局是什么样的 Every page contains a header of metadata about the page’s contents.【每个页都有一个关于元数据的标题】 pagesize每个页多大 Checksum校验MD5什么的或者说是哈希 DBMS Version管理系统版本防止版本不兼容 Transaction Visibility事务的可见性 Compression Information页怎么压缩的 一个页包含一个元数据区和一个数据区数据区的存取方式有两个流派 Tuple-oriented只存一行行数据 想法就是最初我都数据是0然后来一个数据我就加入一个数据但是如果加入1、2、3之后2删除了1、3之间就会有内存空隙产生这时候加入一个4就会想到加入到13之间但是这样可能会产生小的内存碎片难以利用或者因为过大没办法放进去出现这样的问题 解决方法是使用一个slots array插槽数组将数据元素都堆放到后面数组前面只存放地址然后当元素移除之后堆后面的数据元素进行整理就像是指针数组一样 recqrd ids每一个tuple元组数据需要一个idid用于在全局寻找这个数据或者这个记录一般这个id就是pageidoffset/slot然后就可以让数据库定位到每一行数据这个recqrd id是数据库内部使用的id外部一般不使用这个id。外部你只能使用主键或者有意义的东西不能使用它这个无意义的id比如page页一整理页号就会改变 PostgreSQLCTID、6-bytes、SQLite(ROWID、8-bytes)、OracleROWID、10-bytes都有自己的行id Log-structured存log Tuple Layout【一个元组的布局】 数据在磁盘上的表示就是一组二进制的字节不去解析它的话就是没有意义的。数据库的工作就是把数据编码好然后放到磁盘上 一个Tuple也有一个header头一般来说一个表创建时候每个字段的数据类型是什么顺序就按照什么顺序存储因为在一个元组中数据是连续不断的不按照顺序存会有问题一般都是按照字段类型顺序存的 denormalized tuple data【非规范的元组数据】就是说学术界认为这个问题有一个表foo和另一个表barfoo中有字段a主键、bbar表中有字段c、a外键这时候学术就认为你读的时候总要连表读本来存的时候是分开存的然后就和到一起但是这种存储方式不利于后期数据的修改 CREATE TABLE foo(a INT PRIMARY KEY,b INT NOT NULL ); CREATE TABLE bar(c INT PRIMARY KEY,a INTREFERGNCES foo (a), );conclusion Database is organized in pages.【数据库按页组指的方式】Different ways to track pages.【找到页的方式】Different ways to store pages.【存储页的方式】Different ways to store tuples.【存储数据的方式】 04 Database Storage-Part Ⅱ log-structured file organization 【日志的结构化文件】一行中tuple元组存的不是数据的本身而是数据的log存储的是数据的变化 The system appends log records to the file of how the database was modified: Inserts store the entire tuple.Deletes mark the tuple as deleted.Updates contain the delta of just the attributes that were modified. 【就是说操作系统允许文件记录修改数据库的方式1、是插入整个元组2、是记录删除数据的操作而不是删除数据本身3、是记录改写数据的操作而不是改写数据本身】 当读取数据的时候会将该数据相关的所有操作读出来进行回放然后推断这个数据应有的样子推断是从新到旧的然后如果在日志中寻找某一数据觉得速度比较慢可以做一些索引或者目录。 但是这样存储日志的数据库会比较大就需要周期性的压缩日志压缩之后应该保留当页操作之后的数据结果但是仅仅可以压缩当前页的数据如果该页中没有出现某个数据的插入只记录了数据的删除那么这个操作就是不能压缩的 大概在使用这个log的方式的数据库有hbasek-v数据库、cassardra时序数据库、levelDBk-v数据库、RocksDBk-v数据库levelDB是RockDB的原型 log数据库更多的使用在k-v数据库上因为k-v数据库修改的数据就是最终的数据所以log在k-v数据库上更加的好用relational数据库修改一个字段之后想要拿出这行数据还需要回溯其他字段 log-structured compaction 【日志结构压缩原则】压缩的时候单个字段记录最终结果 Level compaction分层压缩Rocks DB压缩的基本原理在同一块中的操作一个插入一个修改两个块内部之间永远无法合并所以就对他进行了一个按层压缩将两个log合并成一个一长串的log然后就能压缩了。然后一共能压缩七层找的时候就从第0层开始找如果找到这个文件就返回没有找到就去第1层以此类推Universal compaction觉得两个块可以合并就进行压缩是一种比较通用的压缩方法 上述方法 说的就是tuple存的不是数据是块的时候在插入的时候就可以将随机的写转化为顺序的写以前存数据的时候就是在需要改数据的时候把数据从页中加载进来然后修改然后将修改的数据协会去之后在需要修改这个数据就再从磁盘中页加载修改然后再写回去。有了这个日志的好除就是在需要修改这个数据的时候我就用一个新的页一个新的块然后按照日志对这个数据操作就完事了相当于把随机的写转化成了连续的写所以着各种方法在持续更新大量数据的时候效率高但是效率不好的地方就是读起来比较费劲回放这些日志再有就是压缩的时候比较麻烦压缩本身也是有开销的 data representation 【数据在磁盘上是怎么表示的】 在C/C与DB中的数据表达是不一样的 浮点数类型 在取少数位的时候可能看不出区别但是如果取小数点后20位甚至更多就会出现精度问题一般银行系统等对精度要求是很高的在写业务的时候一般关于钱的是严谨使用浮点类型的在java中有一个Big decimal的类型是专门给这这样高精度的浮点使用的 PG numeric在数据库中也有类似的实现方式例如PGPostgresQL它里面有一个数据类型是numeric typedef unsigned char NumericDigit; typedef struct {int ndigits; // 位数int weight; // 权重或者说数量级int scale; // 指数 乘10 乘100…int sign; // 标志位正数/负数/没有 positive/negative/NANNumericDigit* digits; // 字面量地址 }numeric;PG源码是全世界源码的模范 MySQL numeric typedef int32 decimal_digit_t; struct decimal_t {int intg, frac, len; // 小数点 前位数/后位数/数据由多少字节长度bool sign; // 标志 / -decimal_digit_t *buf; // 字面量指针 };large values在一行数据中存了一个特别长的字符串大到这个页都存不下这时候就会新开一个页叫Overflow Page溢出页来存这个字符串对于数据库的管理溢出页的管理也是很麻烦的 PostgresTOASTPG中的常量2KBMySQLOverFlow1/2 size page一个页最少存两个数据SQL ServerOverFlow size page一个页最少一个数据溢出页后面可以接一个溢出页但是尽量避免这么使用因为一个页只存一个数据对于数据库来说是非常低效的磁盘存储的单位就是页读取一次磁盘只能拿到一页的数据如果真的需要放一个比较大的数据例如图片就在数据库中放一个地址把图片存放位置的地址放到数据库中 external value storage有一个外部文件我不想自己去管理交给数据库管理我使用链接连接到数据库但是这个文件可能系统或者别的软件会修改它数据库没有办法保证这个数据存储进去别人用没用过。所以尽量使用地址存储到数据库中不让数据库去管理自己去管理
system catalogs 【系统元数据】 表结构、列结构、索引、视图用户、权限内部信息 在链接数据库的三方软件中点开数据库可以直接看到这些表结构 accessing table schema访问表方法 SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_catalog db name; SQL-92 \d; Postgres SHOW TABLES; MySQL .table SQLitedatabase workloads数据库工作负载 On-Line Transaction ProcessingOLTP在线交易数据更倾向于写On-Line Analytical ProcessingOLAP在线分析数据更倾向于读Hybrid Transaction Analytical ProcessingHTAP交易分析处理
用户不关心数据存储时候是怎么样的取出来的是一行是因为想要一行取出来存储对于用户来说是不可见的 storage models 【存储数据的模型】 n-ary storage modelNSM行存模型一个元组保存了一行属性这种按行存储的类型适合TP类型在用户登录之后只需要将关于用户的一行数据取出来就可以了不涉及到其他任何东西。查询走索引找到行然后将数据取出。在AP的时候行存会做很多无用功。 优势增删改查都很快、需要一整行数据的时候行存就是优势劣势需要扫描一整列的时候行存就是劣势取行的时候需要把所有数据都拿出来然后把一段数据取出来 decomposition storage modelDSM拆分数据模型列存模型一个tuple存一列列存对分析的性能是好的 ​ 怎么识别取出来的列的行号两种方法 使用offset偏移量存储每一列的固定位置有固定的行号给每一列的元素加上id但是存储开销比较大但是更好找 优点去更多跑磁盘IO操作的时候所需资源会大量减少只需要某几列不需要全表扫描。对于查询和压缩更加的友好缺点点查询一行删除插入都不友好不好维护列存面临数据分裂的问题
现代的数据库很多都做了列存引擎当TP交易的时候使用行存存的时候也备份列存一份当AP的时候就使用列存 conclusion The storage manager is not entirely independent from the rest of the DBMS. It is important to choose the right storage model for the target workload: OLTP Row StoreOLAP Column Store 数据库存储并非是独立于数据库管理系统的部分为目标负载选择正确的存储模型很重要