你的问题还挺刁钻的。估计是老师布置的作业吧?自带库中的表叫系统表MASTER:核心数据库 主要配合完成数据库的权限,日志,登陆信息,设定,进程管理等数据库系统与 *** 作系统级别的服务 *** 作MODEL:模版数据库主要配合完成用户自定义数据库创建时提供各种模板MSDB:自动化任务 主要完成一些定时,预 *** 作比如发送邮件,提示等等等等。TEMPDB:临时缓存 NORTHWIND和PUBS:样例库 2个附属的样例库。northwind是著名的超市连锁店数据库样例
可以
定义:原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。
原理:缓存的工作原理是当CPU要读取一个数据时,首先从CPU缓存中查找,找到就立即读取并送给CPU处理;没有找到,就从速率相对较慢的内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在CPU缓存中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先缓存后内存。
2 web缓存
扯了这么多,其实web缓存的产生和原理跟上面一样一样的:客户端浏览器在显示一个完整网页前,需要去服务器获取一些必要的数据(js,css,image等),因为浏览器的数据处理和渲染速度很快,而通过网络传输的方式去服务器取数据的过程却很慢(虽然现在网速还算比较快,下载1M的文件都用不了1s,但相较于处理器,这就非常慢了),所以页面显示出来前都有一段时间的白屏,如果每次打开相同的页面,获取相同的资源都要等待一段时间的白屏,作为用户,岂能忍。如果把已经获取过的资源存在本地,下次用的时候就不用从服务器去取了,这样速度就要快很多了。这种机制便是web缓存。
其实web缓存的优点还有很多: - 减轻服务器压力 - 减少数据传输,节省网络带宽和流量 - 缩短页面加载时间,提升用户体验
二、web缓存分类
了解了缓存的由来和原理,下面针对web缓存(以下统一简称缓存)具体介绍一下。缓存是一个抽象的代名词,用以提高访问效率而临时存储副本的机制都可以称之为缓存。我们常说的缓存,根据资源存放位置、具体用途和运行机制不同,一般可以分为:
数据库缓存
服务器缓存
客户端缓存
1mysql和redis的数据库类型
mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。
redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限
2mysql的运行机制
mysql作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在着I/O *** 作,如果反复频繁的访问数据库。第一:会在反复链接数据库上花费大量时间,从而导致运行效率过慢;第二:反复的访问数据库也会导致数据库的负载过高,那么此时缓存的概念就衍生了出来。
3缓存
缓存就是数据交换的缓冲区(cache),当浏览器执行请求时,首先会对在缓存中进行查找,如果存在,就获取;否则就访问数据库。
缓存的好处就是读取速度快
4redis数据库
redis数据库就是一款缓存数据库,用于存储使用频繁的数据,这样减少访问数据库的次数,提高运行效率。
5redis和mysql的区别总结
(1)类型上
从类型上来说,mysql是关系型数据库,redis是缓存数据库
(2)作用上
mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢
redis用于存储使用较为频繁的数据到缓存中,读取速度快
(3)需求上
mysql和redis因为需求的不同,一般都是配合使用。
SQLite创建的数据库有一种模式IN-MEMORY,但是它并不表示SQLite就成了一个内存数据库。IN-MEMORY模式可以简单地理解为,(2020 表述勘误:本来创建的数据库文件是基于磁盘的,现在整个文件使用内存空间来代替磁盘空间,没有了文件作为backingstore,不必在修改数据库后将缓存页提交到文件系统),其它 *** 作保持一致。也就是数据库的设计没有根本改变。
inmemory与tempdb是两种节约模式,节约的对象为(rollback)日志文件以及数据库文件,减少IO。inmemory将日志写在内存,并且去除数据库文件作为backingStore,缓存页不用提交到文件系统。tempdb只会在只会在脏的缓存页超过当前总量的25%才会同步刷写到文件,换句话说在临时数据库模式下,事务提交时并不总同步脏页,因此减少了IO数量,事务日志也受这种机制影响,所以在临时数据库模式下,事务日志是不是MEMORY并不重要。回过头来看,内存模式则是临时模式的一种极致,杜绝所有的IO。这两种模式都只能存在一个sqlite3连接,关闭时销毁。
提到内存,许多人就会简单地理解为,内存比磁盘速度快很多,所以内存模式比磁盘模式的数据库速度也快很多,甚至有人望文生意就把它变成等同于内存数据库。
它并不是为内存数据库应用而设计的,本质还是文件数据库。它的数据库存储文件有将近一半的空间是空置的,这是它的B树存储决定的,(2020 勘误:对于固定长度记录,页面使用率最大化,对于非自增计数键的索引,页面一般会保留20~60%的空间,方便插入)请参看上一篇SQLite存储格式。内存模式只是将数据库存储文件放入内存空间,但并不考虑最有效管理你的内存空间,其它临时文件也要使用内存,事务回滚日志一样要生成,只是使用了内存空间。它的作用应该偏向于临时性的用途。
(2020 补充:下面的测试有局限性,)
我们先来看一下下面的测试结果,分别往memory和disk模式的sqlite数据库进行1w, 10w以及100w条数据的插入,采用一次性提交事务。另外使用commit_hook捕捉事务提交次数。
(注:测试场景为在新建的数据库做插入 *** 作,所以回滚日志是很小的,并且无需要在插入过程中查找而从数据库加载页面,因此测试也并不全面)
内存模式

磁盘模式

在事务提交前的耗时 (事务提交后的总耗时):
1w 10w 100w
内存模式 004s 035s 360s
磁盘模式 006s (027s) 047s (072s) 395s (462s)
可以看到当 *** 作的数据越少时,内存模式的性能提高得越明显,事务IO的同步时间消耗越显注。
上图还有一组数据比较,就是在单次事务提交中,如果要为每条插入语句准备的话
1w 10w 100w
内存模式 019s 192s 1946s
磁盘模式 021s (035s) 206s (226s) 1988s (2041s)
我们从SQLite的设计来分析,一次插入 *** 作,SQLite到底做了些什么。首先SQLite的数据库 *** 作是以页面大小为单位的。在单条记录插入的事务中,回滚日志文件被创建。在B树中查找目标页面,要读入一些页面,然后将目标页面以及要修改的父级页面写出到回滚日志。 *** 作目标页面的内存映像,插入一条记录,并在页面内重排序(索引排序,无索引做自增计数排序,参看上一篇《SQLite数据库存储格式》)。最后事务提交将修改的页面写出到数据库文件,成功后再删除日志文件。在这过程中显式进行了2次写磁盘(1次写日志文件,1次同步写数据库),还有2次隐式写磁盘(日志文件的创建和删除),这是在 *** 作目录节点。以及为查找加载的页面读 *** 作。更加详细可以参看官方文档的讨论章节《Atomic Commit In SQLite》。
如果假设插入100条记录,每条记录都要提交一次事务就很不划算,所以需要批量 *** 作来减少事务提交次数。假设页面大小为4KB,记录长度在20字节内,每页可放多于200条记录,一次事务提交插入100条记录,假设这100条记录正好能放入到同一页面又没有产生页面分裂,这样就可以在单条记录插入事务的IO开销耗损代价中完成100条记录插入。
当我们的事务中,插入的数据越多,事务的IO代价就会摊得越薄,所以在插入100w条记录的测试结果中,内存模式和磁盘模式的耗时都十分接近。实际应用场合中也很少会需要一次插入100w的数据。有这样的需要就不要考虑SQLite。
(补充说明一下,事务IO指代同步数据库的IO,以及回滚日志的IO,只在本文使用)
除了IO外,还有没有其它地方也影响着性能。那就是语句执行。其实反观一切,都是在对循环进行优化。

for (i = 0; i < repeat; ++i)
{
exec("BEGIN TRANS");
exec("INSERT INTO ");
exec("END TRANS");
}

批量插入:

exec("BEGIN TRANS");
for (i = 0; i < repeat; ++i)
{
exec("INSERT INTO ");
}
exec("END TRANS");

当我们展开插入语句的执行

exec("BEGIN TRANS");
for (i = 0; i < repeat; ++i)
{
// unwind exec("INSERT INTO ");
prepare("INSERT INTO ");
bind();
step();
finalize();
}
exec("END TRANS");

又发现循环内可以移出部分语句

exec("BEGIN TRANS");
// unwind exec("INSERT INTO ");
prepare("INSERT INTO ");
for (i = 0; i < repeat; ++i)
{
bind();
step();
}
finalize();
exec("END TRANS");

这样就得到了批量插入的最终优化模式。
所以对sql语句的分析,编译和释放是直接在损耗CPU,而同步IO则是在饥饿CPU。
请看下图

分别为内存模式1w和10w两组测试,每组测试包括4项测试
1只编译一条语句,只提交一次事务
2每次插入编译语句,只提交一次事务
3只编译一条语句,但使用自动事务。
4每次插入编译语句,并使用自动事务。
可以看到测试项目4基本上就是测试项目2和测试项目3的结果的和。
测试项目1就是批量插入优化的最终结果。
下面是探讨内存模式的使用:
经过上面的分析,内存模式在批量插入对比磁盘模式提升不是太显注的,请现在开始关注未批量插入的结果。
下面给出的是磁盘模式01w和02w两组测试,每组测试包括4项测试

可以看到在非批量插入情况,sqlite表现很差要100秒来完成1000次单条插入事务,但绝非sqlite很吃力,因为cpu在空载,IO阻塞了程序。
再来看内存模式20w测试

可以看到sqlite在内存模式,即使在20w次的单条插入事务,其耗时也不太逊于磁盘模式100w插入一次事务。
01w 02w 20w
内存模式(非批量插入) 1587s
磁盘模式(非批量插入) 974s 19828s
编译1次插入语句 每次插入编译1次语句
内存模式(20w,20w次事务) 1110s 1587s
磁盘模式(100w,1次事务) 462s 2041s
以上就是关于SQL Server 2000包含哪些系统数据库全部的内容,包括:SQL Server 2000包含哪些系统数据库、一台服务器可以作为数据库缓存web、redis和mysql区别是什么(mysql+redis)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)