windows系统下 mysql和MFC CFile文件操作的效率 比较mysql,访问接口用capi,单独的一个mediumblob字段的表。插入数据,480K,用CFile写15ms,mysql 8ms 差不多但是读数据
CFile 读 4M的文本 6ms
mysql 读1行 blob字段需要 60ms为什么差距这么大呢?有更好的读取数据的方法吗?
mysql访问如下CString sql="select blo from test";
stmt=mysql_stmt_init(conn);
mysql_stmt_prepare(stmt, sql, strlen(sql));
mysql_stmt_execute(stmt);
mysql_stmt_store_result(stmt);

解决方案 »

  1.   

    没办法,数据库存取是需要额外开销的。数据库访问 比 直接文件操作 相比,你要通过CAPI 调数据的接口,把SQL语句传给数据库,然后由数据库进行分析,权限检查,然后再去 由数据库软件来进行文件操作,返回数据。 当然会耗时。 所以许多工业系统没有办法用数据库,只能自己把数据存在文件中。
      

  2.   


    嗯,有个问题请教:存数据数据库的性能还会高一点,因为CFile操作的Seek很耗时。工业系统应该是存储为主,数据库应该更有优势吧。?读取CFile用的是整个文档读取,如果要截取中间部分读取,CFile也很慢。和数据库的读取时间差不多。
      

  3.   


    首先,不管是什么,最终的数据都在磁盘文件中,这一点我想没有什么疑问。那么数据库系统是如何从这些数据文件中取得数据呢?  想通这一点就明白很多了。 CFILE显然做了些封装,如果你直接用C的 fopen 则会体会到实际的速度。 另外数据是记录格式,如果索引做好,其实就是直接计算出记录所在位置。 同样,你直接用CFILE也可以利用相同的算法。工业控制系统主要以实时为准。
      

  4.   


    嗯 :) 非常万分感谢版主。还有几个疑问,呵呵。1)存储归根到底肯定是文件快了,除非数据库自己做了个更高效的文件和磁盘管理,绕开OS的文件系统。呵呵,用数据库也是考虑开发效率和远程数据访问。存储的性能损失很小,所以就忽略不计了。:)2)但是读取数据性能损失的比较大,纠结中,呵呵。看来只好这样了,是硬伤了。3)实时很关键的采集部分,我们用的是商业实时数据库。对这部分我研究不深,只是了解。好像实时数据库的存储也是类似于mysql,只是做了些内存缓存管理。?
    用mysql的采集部分是不关注很实时的,以存储为主,主要用于回放。省钱呵呵。
      

  5.   

    1)存储归根到底肯定是文件快了,除非数据库自己做了个更高效的文件和磁盘管理,绕开OS的文件系统。呵呵,用数据库也是考虑开发效率和远程数据访问。存储的性能损失很小,所以就忽略不计了。:)这是个陈述句,不是疑问名。所以这不是个疑问。 直接文件存取比数据库理论上快 4-10 倍。
    2)但是读取数据性能损失的比较大,纠结中,呵呵。看来只好这样了,是硬伤了。
    同上3)实时很关键的采集部分,我们用的是商业实时数据库。对这部分我研究不深,只是了解。好像实时数据库的存储也是类似于mysql,只是做了些内存缓存管理。?
    实时数据,仅做必要处理,直接写入文件,然后由另一进程慢慢导入数据库。用mysql的采集部分是不关注很实时的,以存储为主,主要用于回放。省钱呵呵。