不论MSYQL过程如何,最后都要到磁盘上去读这个“文件”(记录存储区等效),因此固然这一切的前提是只读 内容,无关任何排序或查找操做。因此,读写任何类型的数据都没有直接操做文件来的快。算法
判断方法:数据库
一、若是信息的及时性要求不高 能够加入缓存来减小频繁读写数据库。缓存
二、一次读取的内容越大,直接读文件的优点会越明显并发
三、写文件和INSERT几乎不用测试就能够推测出,数据库效率只会更差。分布式
四、很小的配置文件若是不须要使用到数据库特性,更加适合放到独立文件里存取,无需单首创建数据表或记录,很大的文件好比图片、音乐等采用文件存储更为方便,只把路径或缩略图等索引信息放到数据库里更合理一些。高并发
一、读写分离性能
随着业务的发展,咱们的数据量和访问量都在增加。对于大型网站来讲,有很多业务是读多写少的,这个情况也会直接反应到数据库上。那么对于这样的状况,咱们能够考虑使用读写分离的方式。测试
这个结构的变化会带来两个问题:大数据
一、数据复制问题。优化
二、应用对于数据源的选择问题。
咱们但愿经过读库来分担主库上读的压力,那么首先就须要解决数据怎么复制到读库的问题。数据库系统通常都提供了数据复制的功能,咱们能够直接使用数据库系统的自身机制。但对于数据复制,咱们还须要考虑数据复制时延问题,以及复制过程当中数据的源和目标之间的映射关系及过滤条件的支持问题。数据复制延迟带来的就是短时间的数据不一致。例如咱们修改了用户信息,在这个信息尚未复制到读库时(由于延迟),咱们从读库上读出来的信息就不是最新的,若是把这个信息给进行修改的人看,就会让他以为没有修改为功。
对于应用来讲,增长一个读库对结构变化有一个影响,即咱们的应用须要根据不一样状况来选择不一样的数据库源。写操做要走主库,事务中的读也要走主库,而咱们也要考虑到备库数据相对于主库数据的延迟。就是说即使是不在事务中的读,考虑到备库的数据延迟,不一样业务下的选择也会有差别。
提到读写分离,咱们更多地是想到数据库层面。事实上,广义的读写分离能够扩展到更多的场景。咱们看一下读写分离的特色。简单来讲就是在原有读写设施的基础上增长了读“库”,更合适的说法应该是增长了读“源”,由于它不必定是数据库,而只是提供读服务的,分担原来的读写库中读的压力。由于咱们增长的是一个读“源”,因此须要解决向这个“源”复制数据的问题。
在这儿顺便说一下搜索引擎。
以咱们所举的交易网站为例,商品存储在数据库中,咱们须要实现让用户查找商品的功能,尤为是根据商品的标题来查找的功能。对于这样的状况,可能有读者会想到数据库中的like功能,这确实是一种实现方式,不过这种方式的代价也很大。还可使用搜索引擎的倒排表方式,它可以大大提高检索速度。不管是经过数据库仍是搜索引擎,根据输入的内容找到符合条件的记录以后,如何对记录进行排序都是很重要的。
搜索引擎要工做,首要的一点是须要根据被搜索的数据来构建索引。随着被搜索数据的变化,索引也要进行改变。这里所说的索引能够理解为前面例子中读库的数据,只不过索引的是真实的数据而不是镜像关系。而引入了搜索引擎以后,咱们的应用也须要知道什么数据应该走搜索,什么数据应该走数据库。构建搜索用的索引的过程就是一个数据复制的过程,只不过不是简单复制对应的数据。
搜索集群(Search Cluster)的使用方式和读库的使用方式是同样的。只是构建索引的过程基本都是须要咱们本身来实现的。
整体来讲,搜索引擎的技术解决了站内搜索时某些场景下读的问题,提供了更好的查询效率。而且咱们看到的站内搜索的结构和使用读库是很是相似的,咱们能够把搜索引擎当成一个读库。
二、擅用缓存
缓存(Cache Memory)位于与内存之间的临时存储器,它的容量比内存小但交换速度快。在缓存中的数据是内存中的一小部分,但这一小部分是短期内即将访问的,当调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。因而可知,在中加入缓存是一种高效的解决方案,这样整个内存储器(缓存+内存)就变成了既有缓存的高速度,又有内存的大容量的存储系统了。缓存对的性能影响很大,主要是由于CPU的数据交换顺序和CPU与缓存间的带宽引发的。 缓存是为了解决CPU速度和内存速度的速度差别问题。内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存,这样CPU就能够不常常到象“蜗牛”同样慢的内存中去取数据了,CPU只要到缓存中去取就好了,而缓存的速度要比内存快不少。 这里要特别指出的是: 1.由于缓存只是内存中少部分数据的复制品,因此CPU到缓存中寻找数据时,也会出现找不到的状况(由于这些数据没有从内存复制到缓存中去),这时CPU仍是会到内存中去找数据,这样系统的速度就慢下来了,不过CPU会把这些数据复制到缓存中去,以便下一次不要再到内存中去取。 2..由于随着时间的变化,被访问得最频繁的数据不是一成不变的,也就是说,刚才还不频繁的数据,此时已经须要被频繁的访问,刚才仍是最频繁的数据,如今又不频繁了,因此说缓存中的数据要常常按照必定的算法来更换,这样才能保证缓存中的数据是被访问最频繁的。
三、专库专用,数据垂直拆分
读写分离后,数据库又遇到瓶颈
垂直拆分的意思是把数据库中不一样的业务数据拆分到不一样的数据库中。结合如今的例子,就是把交易、商品、用户的数据分开,如图2-20所示。
这样的变化给咱们带来的影响是什么呢?应用须要配置多个数据源,这就增长了所需的配置,不过带来的是每一个数据库链接池的隔离。不一样业务的数据从原来的一个数据库中拆分到了多个数据库中,那么就须要考虑如何处理原来单机中跨业务的事务。一种办法是使用分布式事务,其性能要明显低于以前的单机事务;而另外一种办法就是去掉事务或者不去追求强事务支持,则原来在单库中可使用的表关联的查询也就须要改变实现了。
对数据进行垂直拆分以后,解决了把全部业务数据放在一个数据库中的压力问题。而且也能够根据不一样业务的特色进行更多优化。
四、分布式存贮
常见的分布式存储系统有分布式文件系统、分布式Key-Value系统和分布式数据库。
四、1 文件系统是你们所熟知的,分布式文件系统就是在分布式环境中由多个节点组成的功能与单机文件系统 同样的文件系统,它是弱格式的,内容的格式须要使用者本身来组织;
四、2 而分布式Key-Value系统相对分布式文件系统会更加格式化一些;
四、3 分布式数据库则是最格式化的方式了。
分布式存储系统自身起到了存储的做用,也就是提供数据的读写支持。相对于读写分离中的读“源”,分布式存储系统更多的是直接代替了主库。是否引入分布式系统则须要根据具体场景来选择。分布式存储系统经过集群提供了一个高容量、高并发访问、数据冗余容灾的支持。具体到前文提到的三个常见类,则是
1、经过分布式文件系统来解决小文件和大文件的存储问题,
2、经过分布式Key-Value系统提供高性能的半结构化的支持,
3、经过分布式数据库提供一个支持大数据、高并发的数据库系统。
分布式存储系统能够帮助咱们较好地解决大型网站中的大数据量和高并发访问的问题。引入分布式存储系统后,咱们的系统大概会是图2-19的样子。