数据库的底层原理,数据库底层存储原理
1. MySQL数据优化。
不要使用NULL来优化数据类型。 空值需要特殊处理。 在许多情况下,必须使用NOT NULL,或者使用特殊值,例如0、-1作为缺省值。
只能使用小于o的字段。 MySQL从磁盘读取数据,然后存储在内存中,并使用cpu周期和磁盘I/O进行读取。 这意味着数据类型越小,占用的空间就越小。 注意字符集转换客户端或APP应用程序使用的字符集可能与表本身的字符集不同。 这需要MySQL在运行期间隐式转换。 您还必须验证字符集(如UTF-8 )是否支持多字节字符
当优化的count(mycol )和count(mycol ) *优化子查询遇到子查询时,MySQL查询优化引擎效果不一定最好。 因此,越来越多地将子查询转换为连接查询,优化程序现在可以正确处理连接查询。 当然,请注意连接表(第二个表)中的连接列有索引
要优化UNION,有趣的优化方法是在跨多个不同的数据库时使用UNION。 UNION从两个互不相关的表中返回数据。 这意味着不会发生重复的行为,数据也需要排序。 我知道排序非常耗费资源,尤其是对大表进行排序。
UNION ALL可以大幅提高速度。 如果您知道数据不包含重复行,或者不介意是否出现重复行,则使用UNION ALL更好。
此外,UNION ALL和UNION返回相同的结果,但为了避免对UNION ALL进行排序,也可以采用在APP应用逻辑中避免重复行为的方法。
2. MySQL关键字。
添加索引: alter table tableName add索引(索引字段)主键:主键唯一: unique全局: fulltext一般: index多列: index index_name页级别:索引
辅助锁定一组相邻的记录。
表级:引擎MyISAM,理解为锁定整个表,能同时读,不能写。
行级:引擎INNODB,单独锁定一行记录,然后锁定指定记录。 这将允许其他进程操作同一表中的其他记录。
时钟级锁定速度快,但冲突多,行级冲突少,但速度慢。
3 .存储引擎。
简而言之,存储引擎就是如何存储数据、索引和更新已存储数据、查询数据等技术的实现方式。
MyISAM :这个引擎是mysql首先提供的。
有三种类型的引擎:静态MyISAM、动态MyISAM和压缩MyISAM。 静态MyISAM :如果数据表中每个数据列的长度是固定的,服务器会自动选择此表类型。
数据表中的每条记录占用的空间都相同,因此访问和更新这些表非常高效。
如果数据损坏,恢复工作也会变得容易。
动态MyISAM :如果数据表显示varchar、text或BLOB字段,服务将自动选择此表类型。
对于静态MyISAM,这种表的存储区域相对较小,但每个记录的长度不同,因此多次修改数据后,数据表中的数据会离散地存储在存储器中,执行效率可能会降低。
同时,内存也可能出现很多碎片。
因此,这种类型的表经常使用optimize table命令或优化工具进行优化。
MyISAM压缩:以上两种表都可以使用myisamchk工具进行压缩。
这种类型的表进一步减少了使用的存储,但不能修改压缩的表。
另外,因为是压缩数据,所以这样的表在读入时必须先解压缩。
但是,MyISAM表目前不支持事务、行级锁和外键约束功能。
MyISAM Merge引擎:该类型是MyISAM类型的变种。
合并表是指将同一个MyISAM表合并到几个虚拟表中。
它经常应用于日志和数据仓库。
InnoDB:InnoDB表类型被认为是MyISAM的进一步更新,提供了事务、行级锁定机制和外键约束功能。
内存( heap ) :这种类型的数据表只能存在于内存中。
由于使用了散列索引,所以对数据的访问速度非常快。
该类型经常应用于临时表,因为它存在于内存中。
archive :此类型仅支持select和insert语句,不支持索引。
Desc[ribe] tablename :显示数据表的结构。
show engines :命令显示当前数据库支持的存储引擎的状态。
4 .数据库备份。
未登录时整个数据库的mysqldump -u用户名-p数据库名称导出的文件名导出表mysqldump -u用户名-p数据库名称导出的文件名导出数据库结构mysqld /dbname_db.sql-d中没有数据。 –add-drop-table在每个create语句之前添加drop table5. truncate delete drop的差异。
DOP(DDL语句) :是一种有损操作,释放表占用的所有空间; truncate(DDL语句) )仅对于删除表的操作,在删除期间不会激活与表相关的删除触发器,并且不会记录删除记录。 如果表被truncate,则表和索引将恢复为初始大小。 delete(DML语句) :可以删除表或删除行,但删除记录将记录并保存,并且表空间不会恢复为原始大小。 执行速度: droptruncatedelete。
6 .什么是6. Redis? 用一句话来概括一下吧。
是完全开源且免费的key-value内存数据库2。 通常被认为是数据结构服务,但主要是因为有丰富的数据结构strings、map、list、sets和sorted sets。
使用Redis的最佳方法是所有数据in-memory。
Redis多用于代替Memcached。
如果需要对非key/value数据类型的支持,则使用Redis更好。
如果无法删除已保存的数据,最好使用Redis。
7. Redis (管道,散列)。
Redis不仅支持简单的k/v类型的数据,还提供数据结构的存储,如list、set、zset和hash。
Redis支持数据备份,也就是主模式的数据备份。
Redis支持数据持久性,可以将内存中的数据保存在磁盘上,并在重新启动时重新加载和使用。
8. Redis的实现原理或机制。
Redis是密钥值存储系统。
与Memcached类似,它解决了关闭电源后数据完全丢失的情况,并支持更多的禁用值类型。 除了字符串外,还支持lists、sets和zsets数据类型。
这些数据类型都支持推式/pop、add/remove、交集和差集以及更丰富的操作,所有这些操作都是原子的。
Redis是基于客户端服务模型和请求/响应协议的TCP服务。
这意味着以下请求通常遵循以下步骤: 客户端向服务器端发送查询请求,并接收套接字的响应。 通常在阻塞模式下等待服务器端的响应。
服务器端处理命令并将结果返回给客户端。
如果服务器端没有响应,客户端可以继续向服务器端发送请求,最终一次读取所有服务器端的响应。
Redis流水线技术最明显的优点是提高了Redis服务的性能。
由于分区是将数据划分为多个Redis实例的处理过程,因此每个实例只保留一个key子集。
通过利用多个计算机内存的值,可以构建更大的数据库。
多核和多台计算机允许您扩展计算能力借助多台计算机和网络适配器扩展网络带宽。
Redis的一些特性在分区方面不是很好。 通常不支持与许多key相关的操作。
例如,如果两个set映射到不同的Redis实例,则不能对这两个set执行相交操作。
涉及多个密钥的Redis事务不可用。
使用分区会使数据处理变得复杂,包括必须处理多个rdb/aof文件以及从多个实例和主机备份持久性文件。
增加和删除容量也很复杂。
许多Redis群集支持在运行时添加和删除节点透明数据平衡,但其他系统(如客户端分区或代理)不支持此功能。
但是,被称为presharding的技术对这个很有帮助。
9. Redis有两种类型的分区。
最简单的分区方法是按范围划分分区。 这意味着将特定范围的对象映射到特定的Redis实例。
例如,ID为0到10000的用户存储在实例R0中,ID为10001到20000的用户存储在R1中。
此方法是可行的,实际使用中需要区间范围到实例的映射表。
此表需要进行管理,同时还需要各种对象的映射表,这通常对Redis来说不是一个好方法。
散列分区:另一种分区方法是散列分区。
这适用于任何key。 它也不必是object_name。 这种格式很简单,如下所述。 例如,用hash函数将key转换为数值,以便使用crc32 hash函数。
在keyfoobar上运行CRC32(foobar )时,将输出整数,如93024922。
通过取此整数为模并将其转换为0到3之间的数字,可以将此整数映射到四个Redis实例之一。
93024922 % 4=2,即key foobar应该保存在R2实例中。
注意:取模操作是多余的,通常用多种编程语言通过%操作符实现。
实际上,上面的集群模型有两个问题。 1 .扩张问题。 因为使用一致的散列创建了分片,所以不同的key分布在不同的RedisServer上。 如果需要扩展,则必须将机器添加到分片列表中。 此时,相同的key将计算在与原来不同的机器上。 像这样,取某个值的话有可能取不到。 针对这种情况,Redis的作者提出了PreSharding这种方式。 Pre-Sharding方法是对每个物理机执行多个不同的中断实例。 假设有三个物理计算机,每个物理计算机运行三个Redis实例,则分片列表实际上有九个Redis实例,如果需要扩展,2 .此Redis-Server将显示( slaveof )分片3 .主从复制完成后,将客户端分片列表中的RedisA和端口更改为新物理计算机上的Redis-Server和端口; 停止修复。
这相当于将某个Redis-Server移动到了新计算机上。
Prd-Sharding实际上是一种在线扩展容量的方法,但还是依赖于Redis自身的复制功能,如果主库的快照数据文件太大,这种复制的过程也会变长,给主库带来压力
因此,我们建议您选择在业务访问高峰时段进行此拆分过程。
2 .单点故障问题:仍然使用Redis主从复制的功能。 两台物理主机分别运行RedisServer。 一个Redis-Server是另一个从站,采用双机热备技术。 客户端通过虚拟IP访问主库的物理IP,当主库宕机时,切换到主库的物理IP。
但是,如果要在事后修复主库,请将以前的从库更改为主库(使用命令slaveof noone ),将主库更改为该从库(使用命令slaveof IP PORT )
10 .什么是MongoDB?
非关系数据库( NoSql )很好地实现了Mongo DB面向对象思想( OO思想),在Mongo DB中各记录是Document对象。
Mongo DB的最大优点是,所有数据持久性操作都不需要开发人员手动编写SQL语句,只需直接调用方法就可以轻松实现CRUD操作. 11. MongoDB的特征。
高性能、易于部署、易于使用,存储数据非常方便。
主要功能特性是面向集合存储,便于存储对象类型的数据。
模式是自由的。
支持动态查询。
支持包含内部对象的完整索引。
支持查询。
支持复制和回切。
使用包含视频等大型对象的高效二进制数据存储。
可扩展性,可自动处理碎片并支持云计算层,支持Python、PHP、Ruby、Java、c、C#、Javascript、Perl和c语言驱动程序。 社区还为Erlang和. NET等平台提供驱动程序。
文件的保存格式为BSON(JSON的扩展)。
可以通过网络访问。
12. MongoDB的功能。
面向集合的存储:适用于存储对象和JSON格式的数据。
动态查询: Mongo支持丰富的查询表达式。
查询指令可以使用JSON格式的标记来方便地查询文档中嵌入的对象和数组。
完整索引支持:包含嵌入在文档中的对象和数组。
Mongo的查询优化程序分析查询表达式并生成高效的查询计划。
查询监视: Mongo包含用于分析数据库操作性能的监视工具。
复制和自动故障转移: Mongo数据库支持服务器之间的数据复制,并支持主从模式和服务器之间的相互复制。
复制的主要目标是提供冗馀和自动故障切换。
高效的传统存储方法:支持二进制数据和大型对象(如照片和照片)的自动平铺,并支持云级可扩展性。 自动分片功能支持动态添加其他计算机的水平数据库群集。
13. MongoDB的应用场景。
网站数据: Mongo非常适合实时插入、更新和查询,具有网站实时数据存储所需的复制和高级可扩展性。
缓存:由于性能高,Mongo也适合作为信息基础设施的缓存层。
重新启动系统后,由Mongo构建的持久性缓存层将避免下层数据源过载。
较大、较低价值的数据:使用传统的关系数据库存储某些数据可能会增加成本。 在此之前,程序员往往选择并保存传统文件。
可伸缩方案: Mongo非常适合于包含几十台或几百台服务器的数据库。
MapReduce引擎的内置支持包括在Mongo路线图中。
用于存储对象和JSON数据: Mongo的BSON数据格式非常适合文档格式的存储和查询。
14. Redis、memcache和MongoDB比较。
mongodb和memcached不是类别内的东西。
mongodb是文档类型的非关系数据库,查询功能比较强大,具有可以存储大量数据的优点。
与memcached接近的是Redis。
它们都是内存型数据库,数据存储在内存中,可以通过tcp直接访问。 具有高速、并发性高的优点。 缺点是数据类型有限,查询功能不强,一般用作缓存。
1 .性能Redis与memcache相同,且大于mongodb。
2 .操作简便memcache数据结构单一。
Redis丰富,在数据操作方面Redis更好,网络I/o次数少。
mongodb支持丰富的数据表示、索引和最相似的关系数据库,支持的查询语言非常丰富。
3 .内存空间大小和数据量大小Redis自2.0版以来,增加了自己的VM特性,突破了物理内存的限制; 可以为key value设置过期日期。 就像memcache一样。
memcache可以使用LRU算法更改最大可用内存。
mongoDB适用于大数据量的存储,并依赖OSVM进行内存管理。 吃内存也很厉害。 服务不要和其他服务一起。
4 .可用性(单点问题) Redis针对单点问题,依靠客户端实现分布式读写; 对于主从复制,每次从节点重新连接主节点时,主节点都依赖于整个快照,没有增量复制,由于性能和效率问题,单个问题很复杂。 不支持自动散列,必须依赖程序设置一致的散列机制。
作为替代方案,是自己进行主动复制(多个存储),还是改为增量复制(必须自己实现),而不使用Redis本身的复制机制,存在一致性问题和性能挑战
Memcache本身没有数据冗馀机制,在不必要的故障预防中,采用成熟的散列或环状依赖算法,解决单点故障引起的抖动问题。
mongoDB支持主标签、复制(内部采用paxos选举算法,自动回切)、自动握手机制,为客户端屏蔽故障转移和拆分机制
5 .可靠(持久化)对于数据持久化和数据恢复,Redis支持的)快照、AOF ) :依赖快照进行持久化。 AOF在提高可靠性的同时,影响性能。
不支持memcache,它通常用于缓存以提高性能。 MongoDB从1.8版开始采用binlog方式支持持续化的可靠性。
6 .数据完整性(事务支持) Memcache在同时场景下确保cas中的完整性。
对Redis事务的支持很弱,只能确保事务中的所有操作都是连续执行的。
mongoDB不支持事务。
7 .数据分析mongoDB内置数据分析功能( mapreduce ),其他不支持。
8 .应用场景Redis :在数据量较少的更高性能的操作和运算上。
memcache :在动态系统中创建高速缓存以减少数据库负载并提高性能(适合多读多写)。 如果数据量很大,可以采用sharding。
MongoDB :主要解决海量数据的访问效率问题。
15. Redis有什么用? 只有知道它有什么特性,我们才能在使用时扬长避短,为我们所用。
1 .高速:用标准C书写,所有数据在内存内完成,读写速度分别达到10万/20万。
2 .持久化:数据更新采用写入时复制技术,可以异步保存到磁盘。 主要有两个策略。 一种是根据时间的不同,基于更新次数的快照( save 300 10 )和另一种是语句添加方式( Append-only file,aof )。
3 .自动操作:对不同数据类型的操作都是自动、安全的。
4 .快速主控—文案,官方提供数据,Slave秒完成亚马逊网站10G key set的文案。
5. Sharding技术:能够容易地将数据分布在多个Redis实例中。 数据库的扩展是一个永恒的话题。 在关系数据库中,主要通过增加硬件、以分区为主要技术形式的纵向扩展解决了许多应用场景,但随着web2.0、移动互联网、云计算等APP应用的兴起,这种扩展
【关注】转发更多内容