mysql fetch assoc VS mysql fetch数组

时间:2012-03-02 21:16:11

标签: php mysql fetch

以下是大多数php代码中常用的两种获取mysql数据的方法。

  1. mysql_fetch_array()
  2. mysql_fetch_assoc()
  3. 现在,我有一个大数据库。为了在循环中获取数据(while),什么更快更好?

    我找到了this benchmark

    您的选择是什么?

10 个答案:

答案 0 :(得分:16)

这取决于您的表的设置方式:

mysql_fetch_array()本质上返回两个数组索引,一个带有关联字符串索引。

因此,使用mysql_fetch_array()而未指定MYSQL_ASSOCMYSQL_NUM,或指定MYSQL_BOTH将返回两个数组(基本上是mysql_fetch_assoc()mysql_fetch_row()会返回)所以mysql_fetch_assoc()更快。

如果您的表设置正确并且查询编写正确mysql_fetch_assoc(),那么明智的代码可读性$result['username']$result[0]更容易理解。

答案 1 :(得分:1)

我更喜欢fetch_assoc。它返回一个“关联数组”(就像一个python字典)。这意味着您的数组按字符串索引(在我的通常情况下)。

fetch_array的默认值给出了编号索引和关联索引。

但是我从不使用带编号的索引,所以我喜欢用fetch_assoc来加快它的速度

答案 2 :(得分:1)

在这种情况下,查询结果的“大小”无关紧要。

mysql_fetch_array()通常会通过返回关联数组 plus 索引结果来产生开销。

应该决定查询的类型以及是否使用mysql_fetch_array()mysql_fetch_assoc()的所需结果。

如果开销是“可忽略的”,我确信查询成功,我知道只有一个结果,我偶尔会这样做:

$q = mysql_query('SELECT `column1`,`column2` FROM `table` WHERE `id` = 123');
list($column1,$column2) = mysql_fetch_array($q);
mysql_free_result($q);

对于迭代过程(如while循环),这不会削减它。如果不需要“快速提取”结果(通过list运算符)并且结果必须在代码中进一步处理,我总是使用mysql_fetch_assoc() *。


*当被迫实际使用 PHP的过时的程序数据检索功能时。 There are alternatives

答案 3 :(得分:1)

你的例子中显示的benchark使用没有任何参数的mysql_fetch_array()来指定MYSQL_ASSOC或MYSQL_NUM,因此它默认为MYSQL_BOTH ...这将倾向于结果,因为它必须加载两倍于mysql_fetch_assoc()的数组元素。所以我建议它不是一个有效的基准。

实际上,应该很少区分mysql_fetch_array()与MYSQL_ASSOC和mysql_fetch_assoc(),并且它绝对不会成为你脚本中最大的开销。

答案 4 :(得分:1)

这是结果  的 mysql_fetch_array()

$row['fieldname'] = 'some value';

$row[0] = some value';

这是 mysql_fetch_assoc()的结果只会返回

$row['fieldname'] = 'some value';

答案 5 :(得分:0)

mysql_fetch_assoc()可能是更好的选择。有轻微的性能损失(mysql扩展需要查找列名称,但这应该只发生一次,无论你有多少行),但可能不足以证明使用mysql_fetch_array()。如果您只选择一列,则mysql_fetch_array()会非常有用。

答案 6 :(得分:0)

我想这取决于你对big的定义。从该基准测试中您可以看到,只有在您执行超过1,000,000,000次提取之前,您实际上才能获得可衡量的差异?你的数据库那么大吗?如果没有,那么请使用更容易使用的东西(这可能是为了获取关联数组)。

另一点要考虑的是,如果它是如此之大以至于存在可衡量的差异,那么我将从使用这些功能中获得一种方式。考虑使用MySQLi甚至更好地使用PDO!

答案 7 :(得分:0)

http://php.net/manual/en/function.mysql-fetch-assoc.php个州

  

注意:效果

     

需要注意的一点是,使用mysql_fetch_assoc()并不比使用mysql_fetch_row()慢得多,同时它提供了一个重要的附加值。

所以差异不应该让人担心。

答案 8 :(得分:0)

要记住的另一点是<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="team-member"> <div class="team-member-info"> <h3 class="team-member-name">Ann</h3> </div> </div>可能无法返回您期望的每一列。如果2个输出列具有相同的名称,则fetch_assoc()将仅检索该列的最后一个实例。例如,以下查询:

fetch_assoc()

假设两个表都有一个名为SELECT * FROM orders LEFT JOIN line_items ON orders.id = line_items.order_id 的列,结果关联数组将有一个名为id的键,其值设置为id,您将无法检索{{ 1}}来自结果!

您可以绕过此重复的列名称问题,并通过手动对line_items.id列进行别名来继续使用orders.id,为每列提供唯一的别名:

fetch_assoc()

或者您可以切换为使用SELECT,这样您就可以通过索引而非按键访问SELECT o.id AS order_id, #unique alias i.id AS line_item_id, #unique alias o.date, i.qty, i.price FROM orders o LEFT JOIN line_items i ON i.order_id = o.id

答案 9 :(得分:0)

mysql_fetch_array()vs mysql_fetch_assoc()

mysql_fetch_array():返回与获取的行对应的数组,并将内部数据指针向前移动。 for better documentation click here! to learn more mysql_fetch_assoc():相当于使用MYSQL_ASSOC调用mysql_fetch_array()作为可选的第二个参数。它只返回一个关联数组。