My SQL数据库实用技术(34)
时间:2007-12-23 来源:不详 作者:迈克DB
与mysql_use_result() 相比,mysql_store_result() 有着较高的内存和处理需求,因为是在客户机上维护整个结果集,所以内存分配和创建数据结构的耗费是非常巨大的,要冒着溢出内存的危险来检索大型结果集,假如想一次检索多个行,可用mysql _ use _result( )。mysql_use_result() 有着较低的内存需求,因为只需给每次处理的单行分配足够的空间。这样速度就较快,因为不必为结果集建立复杂的数据结构。另一方面, mysql_use_result() 把较大的负载加到了服务器上,它必须保留结果集中的行,直到客户机看起来适合检索所有的行。这就使某些类型的客户机程序不适用mysql _ use _ result( ):
■ 在用户的请求下提前逐行进行的交互式客户机程序(不必仅仅因为用户需要喝杯咖啡而让服务器等待发送下一行)。
■ 在行检索之间做了许多处理的客户机程序。在所有这些情况下,客户机程序都不能很快检索结果集的所有行,它限制了服务器,并对其他客户机程序产生负面的影响,因为检索数据的表在查询过程中是读锁定的。要更新表的客户机或要插入行的任何客户机程序都被阻塞。
偏移由mysql_store_result() 引起的额外内存需求对一次访问整个结果集带来相当的好处。结果集中的所有行都是有效的,因此,可以任意访问: mysql _ data _ seek( )、mysql _ rowseek( )和mysql_row_tell() 函数答应以任意次序访问行。而mysql_use_result() 只能以mysql_fetch_row() 检索的顺序访问行。假如想要以任意次序而不是从服务器返回的次序来处理行,就必须使用mysql _ store _ result( )。例如,假如答应用户往返地浏览查询所选的行,最好使用mysql _ store _ result( )。
织梦内容管理系统
使用mysql_store_result() 可以获得在使用mysql_use_result() 时是无效的某些类型的列信息。通过调用mysql_num_rows() 来获得结果集的行数,每列中的这些值的最大宽度值存储在MYSQL_FIELD 列信息结构的max_width 成员中。使用mysql _ use _ result( ),直到提取完所有的行,mysql_num_rows() 才会返回正确值,而且max_width 无效,因为只有在每行的数据都显示后才能计算。
由于mysql_use_result() 比mysql_store_result() 执行更少的操作,所以mysql _ use _ result( )就强加了一个mysql_store_result() 没有的需求:即客户机对结果集中的每一行都必须调用mysql _ fetch _ row( ),否则,结果集中剩余的记录就会成为下一个查询结果集中的一部分,并且发生“不同步”的错误。这种情形在使用mysql_store_result() 时不会发生,因为当函数返
回时,所有的行就已被获取。事实上,使用mysql_store_result() 就不必再自己调用mysql _ fetch _ row( )。对于所有感爱好的事情就是是否得到一个非空的结果,而不是结果所包含的内容的查询来说,它是很有用的。例如,要知道表my_tbl 是否存在,可以执行下面的查询:
SHOW TABLES LIKE "my_tb1"
假如在调用mysql_store_result() 之后,mysql_num_rows() 的值为非零,这个表就存在,就不必再调用mysql_fetch_row() (当然仍需调用mysql _ free _ result( ))。假如要提供最大的灵活性,就给用户选择使用任一结果集处理方法的选项。mysql 和mysqldump 是执行这个操作的两个程序,缺省时,使用mysql _ store _ result( ),但是假如指定--quick 选项,则使用mysql _ use _ result( )。 本文来自织梦
6.6.6 使用结果集元数据
结果集不仅包括数据行的列值,而且还包括数据信息,这些信息成为元数据结果集,包括:
■ 结果集中的行数和列数,通过调用mysql_num_rows() 和mysql_num_fields() 实现。
■ 行中每列值的长度,通过调用mysql_fetch_lengths() 实现。
■ 有关每列的信息, 例如列名和类型、每列值的最大宽度和列来源的表等。
MYSQL_FIELD 结构存储这些信息,通过调用mysql_fetch_fields() 来获得它。附录F具体地描述了MYSQL_FIELD 结构,并列出了提供访问列信息的所有函数。元数据的有效性部分决定于结果集的处理方法,如在上节中提到的,假如要使用行计数或者列长度的最大值,就必须用mysql_store_result() 而不是mysql_use_result() 创建结果集。结果集元数据对确定有关如何处理结果集非常有帮助:
上一篇:My SQL数据库实用技术(33) 下一篇:My SQL数据库实用技术(35)
文章评论
共有位Admini5网友发表了评论 查看完整内容