精华内容
下载资源
问答
  • 什么是NoSQL数据库

    2014-07-21 23:24:20
    当时的关系型数据库由于硬件性能低劣、处理速度过而迟迟没有得到实际应用。但之后随着硬件性能的提升,加之使用简单、性能优越等优点,关系型数据库得到了广泛的应用。 通用性及高性能 虽然本书是讲解NoSQL数据库...
  • 时序数据高效写入、低延迟读取、高压缩持久化特点 IoTDB(物联网数据库)是为时间序列数据设计的集成数据管理引擎,可以为用户提供特定的服务,以进行数据收集,存储和分析。凭借其轻巧的结构,高性能和实用的...

    需求

    工业物联网智能工厂,很多点位上传实时数据,1200多个点位,一分钟轮一次,float4字节,这个每天的存储量夸张了

    简介

    时序数据库,时序数据是基于时间的一系列的数据。时序数据高效写入、低延迟读取、高压缩比持久化特点

    IoTDB(物联网数据库)是为时间序列数据设计的集成数据管理引擎,可以为用户提供特定的服务,以进行数据收集,存储和分析。凭借其轻巧的结构,高性能和实用的功能,以及与Hadoop和Spark生态的紧密集成,IoTDB满足了IoT工业领域中海量数据集存储,高速数据输入和复杂数据分析的要求。

    开源代码库

     

    下载

    因为基于java开发的,安装前需JDK环境配好,版本≥1.8版本

    iotdb-0.10.1

     

    启动

    Windows下启动bat,Linux启动sh

    sbin/start-server.bat

     

    启动cli连上服务器

    安装完成默认用户root,密码root

    start-cli.bat -h 127.0.0.1 -p 6667 -u root -pw root

    基本命令

    SET STORAGE GROUP TO root.test //定义存储组
    SHOW STORAGE GROUP//检查创建的存储组

    创建时间序列

    //DATATYPE为数据类型,ENCODING为编码方式,root.test.wf01.wf01是路径,可以理解为wf01车间的wt01设备
    CREATE TIMESERIES root.test.wf01.wt01.status WITH DATATYPE=BOOLEAN, ENCODING=PLAIN
    
    CREATE TIMESERIES root.test.wf01.wt01.temperature WITH DATATYPE=FLOAT, ENCODING=RLE

    查询某个设备的相关的序列

    插入数据

    insert into root.test.wf01.wt01(timestamp, status, temperature) VALUES (1607410720627, true, 24.69)
    insert into root.test.wf01.wt01(timestamp, status, temperature) VALUES (1607413500875, false, 24.69)

     

    查询

    //车间
    select * from root.test.wf01
    //设备
    select * from root.test.wf01.wt01

     

    展开全文
  • 每次读取都要先seek,貌似缓冲区用不上,特别连续读一个段的数据,并用lambda过滤四五倍 写入 前面说过了,只append,不修改数据,而且每行日志最前面是时间戳。 多线程 查询数据,可以多线程同时查询,...
  • 分别从前端、后端、数据库阐述web项目的性能优化?...应用程序读取数据时,一般是先从缓存中读取,如果读取不到或数据已失效,再访问磁盘数据库,并将数据再次写入缓存。 2、异步方式,如果有耗时操作,

    分别从前端、后端、数据库阐述web项目的性能优化?

    前端优化:

    1、减少http请求、例如制作精灵图。

    2、html和CSS放在页面上部,javascript放在页面下面,因为js加载比HTML和Css加载慢,所以要优先加载html和css,以防页面显示不全,性能差,也影响用户体验差。

    后端优化:

    1、缓存存储读写次数高,变化少的数据,比如网站首页的信息、商品的信息等。应用程序读取数据时,一般是先从缓存中读取,如果读取不到或数据已失效,再访问磁盘数据库,并将数据再次写入缓存。

    2、异步方式,如果有耗时操作,可以采用异步,比如celery。

    3、代码优化,避免循环和判断次数太多,如果多个if else判断,优先判断最有可能先发生的情况。

    数据库优化:

    1、如有条件,数据可以存放于redis,读取速度快。

    2、建立索引、外键等。

    展开全文
  • Session最快,Db最,文件缓存有时redis快,有时redis Session不建议存储大量的数据,因为session是占用的服务器内存,所以内存越大,能存的值就越大,原则上讲无上限,一般用于存储...

    step1:往数据库里添加1000条测试数据
    在这里插入图片描述
    执行这个方法的结果:

    在这里插入图片描述
    在这里插入图片描述
    step2:将数据写入redis缓存,文件缓存,和session
    在这里插入图片描述

    经过测试发现四种方式,读取的快到慢的顺序为:
    Session最快,Db最慢,文件缓存有时比redis快,有时比redis慢
    在这里插入图片描述

    Session不建议存储大量的数据,因为session是占用的服务器内存,所以内存越大,能存的值就越大,原则上讲无上限,一般用于存储对安全要求较高的重要数据;
    tp5自带的文件缓存,存储方式单一,只能存字符串
    redis存储有多种方式,list,string,set,hashset等方式,相对文件缓存更加多样化,有选择的空间。
    Db连接比较耗时

    展开全文
  • 大量I/O请求的累积可能会明显降低系统性能和响应能力。...以不同请求形式在数据库读取写入单个记录以下示例从产品数据库读取数据。有三个表:Product、ProductSubcategory和ProductPriceListHistor...
    大量I/O请求的累积可能会明显降低系统性能和响应能力。


    问题描述
    网络调用和I/O操作与生俱来就比计算任务要慢。每个I/O请求通常会产生很高的开销,大量I/O操作的累积可能会使系统变慢。下面是出现琐碎I/O的一些常见原因。


    以不同请求形式在数据库中读取和写入单个记录


    以下示例从产品数据库中读取数据。有三个表:Product、ProductSubcategory和ProductPriceListHistory。代码通过执行一系列查询来检索子类别中的所有产品以及价格信息:
    查询ProductSubcategory表中的子类别。
    通过查询Product表来查找该子类别中的所有产品。
    对于每个产品,查询ProductPriceListHistory表中的价格数据。
    应用程序使用Entity Framework来查询数据库。可在此处找到完整示例。(https://github.com/mspnp/performance-optimization/tree/master/ChattyIO)


    public async Task<IHttpActionResult> GetProductsInSubCategoryAsync(int subcategoryId)
    {
        using (var context = GetContext())
        {
            // Get product subcategory.
            var productSubcategory = await context.ProductSubcategories
                    .Where(psc => psc.ProductSubcategoryId == subcategoryId)
                    .FirstOrDefaultAsync();
    
    
            // Find products in that category.
            productSubcategory.Product = await context.Products
                .Where(p => subcategoryId == p.ProductSubcategoryId)
                .ToListAsync();
    
    
            // Find price history for each product.
            foreach (var prod in productSubcategory.Product)
            {
                int productId = prod.ProductId;
                var productListPriceHistory = await context.ProductListPriceHistory
                    .Where(pl => pl.ProductId == productId)
                    .ToListAsync();
                prod.ProductListPriceHistory = productListPriceHistory;
            }
            return Ok(productSubcategory);
        }
    }

    此示例揭露了一些问题,但有时如果ORM隐式逐个提取子记录,则可能会掩盖问题。这就是所谓的“N+1问题”。


    以一系列HTTP请求的形式执行逻辑操作
    当开发人员尝试遵循面向对象的规则,并将远程对象视为内存中的本地对象时,就往往会发生这种情况。这可能导致过多的网络往返。例如,以下WebAPI通过GET方法公开User对象的单个属性。


    public class UserController : ApiController
    {
        [HttpGet]
        [Route("users/{id:int}/username")]
        public HttpResponseMessage GetUserName(int id)
        {
            ...
        }
    
    
        [HttpGet]
        [Route("users/{id:int}/gender")]
        public HttpResponseMessage GetGender(int id)
        {
            ...
        }
    
    
        [HttpGet]
        [Route("users/{id:int}/dateofbirth")]
        public HttpResponseMessage GetDateOfBirth(int id)
        {
            ...
        }
    }


    尽管此方法在技术上没有任何问题,但是,大多数客户端可能需要获取每个User的多个属性,从而导致需要编写如下所示的客户端代码。


    HttpResponseMessage response = await client.GetAsync("users/1/username");
    response.EnsureSuccessStatusCode();
    var userName = await response.Content.ReadAsStringAsync();
    
    
    response = await client.GetAsync("users/1/gender");
    response.EnsureSuccessStatusCode();
    var gender = await response.Content.ReadAsStringAsync();
    
    
    response = await client.GetAsync("users/1/dateofbirth");
    response.EnsureSuccessStatusCode();
    var dob = await response.Content.ReadAsStringAsync();


    读写磁盘文件
    文件I/O需要打开某个文件,转移到某个点,然后读取或写入数据。完成该操作后,文件可能会关闭,以节省操作系统资源。持续在文件中读取和写入少量信息的应用程序会产生很高的I/O开销。小规模写入请求还可能导致文件碎片,从而减慢后续I/O操作的速度。


    以下示例使用FileStream将Customer对象写入文件。创建FileStream会打开该文件,释放它会关闭该文件。(using 语句自动释放FileStream对象。)如果每次添加新客户应用程序都调用该方法,I/O开销可能会迅速累积。


    private async Task SaveCustomerToFileAsync(Customer cust)
    {
        using (Stream fileStream = new FileStream(CustomersFileName, FileMode.Append))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            byte [] data = null;
            using (MemoryStream memStream = new MemoryStream())
            {
                formatter.Serialize(memStream, cust);
                data = memStream.ToArray();
            }
            await fileStream.WriteAsync(data, 0, data.Length);
        }
    }

    解决方案
    将数据打包并减少请求数从而减少I/O请求的数量。
    单次大查询而不是多次小查询的形式从数据库中提取数据。下面是检索产品信息代码的修改版本。


    public async Task<IHttpActionResult> GetProductCategoryDetailsAsync(int subCategoryId)
    {
        using (var context = GetContext())
        {
            var subCategory = await context.ProductSubcategories
                    .Where(psc => psc.ProductSubcategoryId == subCategoryId)
                    .Include("Product.ProductListPriceHistory")
                    .FirstOrDefaultAsync();
    
    
            if (subCategory == null)
                return NotFound();
    
    
            return Ok(subCategory);
        }
    }

    遵循WebAPI的REST设计原则。下面是前一示例中WebAPI的修改版。不要针对每个属性单独使用GET方法,而可使用返回整个User的GET方法。这会导致每个请求的响应正文变得更大,但每个客户端对API调用的次数会减少。

    public class UserController : ApiController
    {
        [HttpGet]
        [Route("users/{id:int}")]
        public HttpResponseMessage GetUser(int id)
        {
            ...
        }
    }
    
    
    // Client code
    HttpResponseMessage response = await client.GetAsync("users/1");
    response.EnsureSuccessStatusCode();
    var user = await response.Content.ReadAsStringAsync();
    对于文件I/O,考虑在内存中缓冲数据,然后以单个操作的形式将缓冲数据写入文件。该方法可以减少由于反复打开和关闭文件所产生的开销,并有助于减少磁盘中的文件碎片。

    // Save a list of customer objects to a file
    private async Task SaveCustomerListToFileAsync(List<Customer> customers)
    {
        using (Stream fileStream = new FileStream(CustomersFileName, FileMode.Append))
        {
            BinaryFormatter formatter = new BinaryFormatter();
            foreach (var cust in customers)
            {
                byte[] data = null;
                using (MemoryStream memStream = new MemoryStream())
                {
                    formatter.Serialize(memStream, cust);
                    data = memStream.ToArray();
                }
                await fileStream.WriteAsync(data, 0, data.Length);
            }
        }
    }
    
    
    // In-memory buffer for customers.
    List<Customer> customers = new List<Customers>();
    
    
    // Create a new customer and add it to the buffer
    var cust = new Customer(...);
    customers.Add(cust);
    
    
    // Add more customers to the list as they are created
    ...
    
    
    // Save the contents of the list, writing all customers in a single operation
    await SaveCustomerListToFileAsync(customers);

    注意事项
    前两个示例发出更少的I/O调用,但每个示例检索了更多的信息。必须考虑这两种因素的利弊。正确答案取决于实际应用场景。例如,在WebAPI示例中,客户端可能往往只需检索用户名。在这种情况下,将该操作公开为单独的API调用可能更有利。有关详细信息,请参阅超量提取反模式。(https://docs.microsoft.com/en-us/azure/architecture/antipatterns/extraneous-fetching/index)


    读取数据时,不要发过多的I/O请求。应用程序应该只检索它要使用的信息。


    有时将对象的信息分区成两个区块可能会有帮助:经常访问的数据(大多数请求就是针对这些数据发出的),不经常访问的数据(极少使用的数据)。最常访问的数据往往是对象总体数据中较小的一部分,因此,只返回这一部分数据能够大幅节省I/O开销。


    写入数据时,避免将资源锁定超过必要的时间以减少在执行冗长操作期间发生资源争用的可能。如果写操作跨多个数据存储、文件或服务,则采用最终一致性方法。请参阅数据一致性指南。(http://https//msdn.microsoft.com/library/dn589800.aspx)


    如果在写数据之前在内存中缓存数据,发生进程崩溃时,数据可能会丢失。如果数据率经常出现喷发或相对稀疏的情况,在将数据保存在外部队列例如事件中心(https://azure.microsoft.com/en-us/services/event-hubs/)可能会更安全。


    考虑对服务或数据库检索的数据做缓存。可以避免针对相同的数据发出重复请求,从而减少I/O。有关详细信息,请参阅有关缓存的最佳实践。(https://docs.microsoft.com/en-us/azure/architecture/best-practices/caching)


    如何检测问题
    琐碎I/O的症状包括高延迟和低吞吐量。由于I/O资源争用的加剧,最终用户可能会反映响应时间延长,或服务超时而导致失败。可执行以下步骤来帮助确定问题的原因:


    对生产系统执行进程监视,识别响应时间不佳的操作。
    对上一步骤中识别到的每个操作执行负载测试。
    在负载测试期间,收集有关每个操作发出的数据访问请求的遥测数据。
    收集每个请求的详细统计信息。
    在测试环境中分析应用程序,判定可能出现I/O瓶颈的位置。


    确定是否存在以下任何症状:
    向同一个文件发出大量的小(数据)I/O请求。
    某个应用程序实例向同一个服务发出大量的小型网络请求。
    某个应用程序实例向同一个数据存储发出大量的小型请求。
    应用程序和服务受I/O约束。


    诊断示例
    以下部分将这些步骤应用到前面所示的查询数据库示例。


    对应用程序进行负载测试
    下图显示了负载测试的结果。中间响应时间是根据每个请求在数十秒内的表现测得的。该图显示延迟很高。每加载1000个用户,用户就可能需要等待将近一分钟才能看到查询结果。



    备注
    该应用程序是作为Azure应用服务的Web应用部署的,使用了AzureSQL数据库。负载测试使用了1000个并发用户来模拟步骤的工作负荷。数据库中配置了支持最多1000个并发连接的连接池,以减少连接争用。


    监视应用程序
    可使用应用程序性能监视(APM)包来捕获和分析可识别琐碎I/O的关键指标。至于哪些指标比较重要,取决于I/O工作负荷。对于此示例,要关注的I/O请求是数据库查询。


    下图显示了使用NewRelic的APM所生成的结果。在承受最大工作负荷期间,数据库的平均响应时间的峰值出现在每个请求的大约5.6秒处。在整个测试过程中,系统能够支持每分钟约410个请求。



    收集详细的数据访问信息
    对监视数据进行更深入发掘后,应用程序执行了三个不同的SELECT语句。这些语句对应于实体框架从ProductListPriceHistory、Product和ProductSubcategory表中提取数据时生成的请求。此外,从ProductListPriceHistory表中检索数据的查询是到目前为止最频繁执行的SELECT语句,其执行频率高过其他查询一个数量级。



    在测试中发现,前面所示的GetProductsInSubCategoryAsync方法执行了45个SELECT查询。每个查询都导致应用程序打开新的SQL连接。



    备注
    此图显示了负载测试中GetProductsInSubCategoryAsync操作的最缓慢实例的跟踪信息。在生产环境中,有用的做法是检查最缓慢的实例,以确定是否能够找到问题出现的规律。如果只需查看平均值,可能会忽略在承受负载的情况下急剧恶化的问题。


    下图显示了实际的SQL语句。提取价格信息的查询是针对产品子类别中的每个产品运行的。使用联接可大幅减少对数据库的调用数。



    如果使用EF等ORM,跟踪SQL查询可以洞察ORM如何将程序代码调用转换为SQL语句,并指明可优化的数据访问区域。


    实施解决方案并验证结果
    对EF调用部分的代码进行重写,再次测试,得到以下结果。



    此负载测试是使用相同的负载配置文件在相同的部署上执行的。这一次,图中显示的延迟要低得多。在加载1000个用户的情况下,平均请求时间下降为5至6秒,而前面的测试中为将近一分钟。这一次,系统可支持每分钟平均3,970个请求,而在前面的测试中为410个请求。



    跟踪SQL语句后发现,所有数据是在单个SELECT语句中提取的。尽管此查询要复杂得多,但只需为每个操作执行一次。此外,尽管复杂的联接可能会产生较高的开销,但关系型数据库系统已针对此类查询进行了优化。



    相关资源
    API设计的最佳实践(https://docs.microsoft.com/en-us/azure/architecture/best-practices/api-design)
    有关缓存的最佳事件(https://docs.microsoft.com/en-us/azure/architecture/best-practices/caching)
    数据一致性入门(http://https//msdn.microsoft.com/library/dn589800.aspx)
    超量提取反模式(https://docs.microsoft.com/en-us/azure/architecture/antipatterns/extraneous-fetching/index)
    无缓存反模式(https://docs.microsoft.com/en-us/azure/architecture/antipatterns/no-caching/index)
    展开全文
  • 二是,这些数据是从慢速数据库读取出来的,性能肯定不上从 Redis 中读取,导致使用这些数据的应用程序响应变。 AOF 日志正好相反,它是写后日志,“写后”的意思是 Redis 是先执行命令,把数据写入内存,然后...
  • Redis数据持久化之AOF

    2021-02-09 10:28:18
    如果我们通过从后端数据库恢复数据,则需要频繁访问数据库,给数据库带来巨大压力,并且直接从后端数据库读取数据,性能远远不上Redis,从而导致使用这些数据的应用程序响应变。 因此,Redis的数据持久化是非常...
  • 和计算机中CPU和内存之间的关系,我们知道CPU的速度很快,内存相比于数据库很多,为了解决这个问题,引入了高速缓存,作为连接CPU和内存的桥梁,前提是高速缓存的读取/写入速度要内存高很多,这样...
  • elasticsearch(ES) 无事务、近实时、成本比数据库高,几乎靠吃内存提高性能、最逆天的是,mapping不能改、缺乏访问控制、数据丢失和污染的问题、写入慢读取快 binlog 增量备份 主从同步 三种格式:STATEMENT、ROW...
  • 但如果数据量较大,加载时会一些,因此经过测试,将需要读取的数据先写入一个文本文件中,然后在加载页面时直接调用此文本文件的内容,省去了读取数据库浪费的时间,数据量大时速度先前快了许多。 数据库请见上...
  • 一次性的 在您的ORM层顶部的装饰器。 介绍 一次性使用的是ActiveRecord *缺少的API。 使命: 维护可操作对象图,该对象图是持久性结构的副本/映射。 在您说出sync之前,禁止对持久层进行任何...双胞胎只AR#FIXME
  • HADOOP不是第一个处理数据存储与查询的分布式系统,但是它的一些特性把它与 其它类似的系统区分开。我们看一下其中的一部分。  关系型数据库管理系统 ...寻道是指移动硬盘的磁头到指定位置来读取写入数据。它表示
  • 领导说公司的报表导出太还没有进度条展示,以前用的poi操作excel导出xls,从数据库查询数据,写入本地文件,然后读取本地文件下载效率低下,特别是数据量大的时候。所以我对后台cms系统导出做了优化,采用导出csv格式,...
  • CH341A1.16

    2012-11-02 15:15:36
    优化查空\读取\校验功能, 原有速度快差不多一半时间 增加状态栏显示当前操作状态 增加选项 写入完成后校验 1.11版 修正擦除后立刻写入时, 会报写入超时的问题 修正擦除后立刻查空时, 有时会报芯片不为空的问题 ...
  • ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。  拉里•埃里森  就业前景 从就业与择业的...
  • 缺点 AOF文件RDB文件大,并且恢复速度,因为它是以命令行的形式来进行恢复的 >>>我们可以简单的认为 AOF 就是日志文件,此文件只会记录“变更操作”(例如:set/del 等),如果 server 中持续的大量变更...
  • 需要 GC ,这会导致触发 GC 时,写入速度变 不需要 value 类型限制 无限制 对字符串类型支持的比较好 掉电保护 支持 支持 磨损平衡 支持 支持 增量升级 支持 支持 1.2、资源占用 最低要求: ROM: 6K ...
  • 3、数据库严格按照微服务的要求来切分,以满足业务高并发,实时或者准实时将各微服务数据库数据同步到NoSQL数据库中,在同步的过程中进行数据清洗,用来满足后台业务系统的使用,推荐使用MongoDB、HBase等。...
  • 国内用户如果访问GitHub比较的话,也可以关注我的知乎号Python-Jack上的“从零开始学Python”专栏,专栏会持续更新,还有大家比较期待的“数据分析”的内容也即将上线,欢迎大家关注我在知乎的专栏、文章和回答。...
  • golang面试题:拷贝大切片一定小切片代价大吗? map不初始化使用会怎么样 map不初始化长度和初始化长度的区别 map承载多大,大了怎么办 map的iterator是否安全?能不能一边delete一边遍历? 字符串不能改,那转...
  • Python读取文件以及读取大文件 gensim之Word2vec使用 心得:多动手,别只看 机器学习及深度学习篇 机器学习网站及教程 机器学习入门教程与实例-SofaSofa scikit-learn: Python 中的机器学习 — scikit-learn...
  • PHP虽然很容易学习,但是速度上mod_perl(植入web服务器的perl模块)。现在有了可以与mod_perl速度想媲美的被称作Zend的新引擎,而PHP4就可以充分利用这个引擎。PHP4还处在BETA测试阶段。Andy Gutmans和Zeev ...
  • IIS6.0 IIS,互联网信息服务

    热门讨论 2010-08-23 21:20:55
    Internet Information Services(IIS,互联网信息服务),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务。最初是Windows NT版本的可选包,随后内置在Windows 2000、Windows XP Professional和...
  • jpivot学习总结.doc

    2011-12-09 08:38:08
    memberReaderClass 设定一个成员读取器,默认情况下 Hierarchy 都是从关系型数据库读取的,如果你的数据不在 RDBMS 里面的话,你可以通过自定义一个 member reader 来表现一个 Hierarchy 。 3.5. Level 级别 , ...
  • 精易模块[源码] V5.15

    2015-03-21 22:03:37
    将原来的函数分割为:“写入键值Ex_数值”和“写入键值Ex_文本”。 3、修正“注册表操作Ex”不支持“#HKEY_CURRENT_USER”的BUG,感谢易友【pp25729391】反馈并帮助测试。 4、新增“注册表操作Ex->写QWORD_64值”...
  • 本文章已授权微信公众号郭霖(guolin_blog)转载。 本文章讲解的内容是MVC、MVP、MVVM以及使用MVVM搭建GitHub客户端,以下是框架的GitHub地址: Dagger2版本:Dagger2 Koin版本:Koin 在讲解之前,我想先聊一下MVC、...
  • 二十三种设计模式【PDF版】

    热门讨论 2011-05-30 14:13:49
    2.设计模式是 J2EE 等框架软件更小的体系结构,J2EE 中许多具体程序都是应用设计模式来完成的,当你深入到 J2EE 的内 部代码研究时,这点尤其明显,因此,如果你不具备设计模式的基础知识(GoF 的设计模式),你很难...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    � 采用了对有限内存、电池和 CPU 优化过的虚拟机 Dalvik , Android 的运行速度想象的要快很多。 � 运营商(中国移动等)的大力支持,产业链条的热捧。 � 良好的盈利模式( 3/7 开),产业链条的各方:运营商、...
  • java 面试题 总结

    2009-09-16 08:45:34
    forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect...

空空如也

空空如也

1 2
收藏数 32
精华内容 12
关键字:

数据库写入比读取慢