以下是大多数php代码中常用的两种获取mysql数据的方法。
mysql_fetch_array()
mysql_fetch_assoc()
现在,我有一个大数据库。为了在循环中获取数据(while
),什么更快更好?
我找到了this benchmark。
您的选择是什么?
答案 0 :(得分:16)
这取决于您的表的设置方式:
mysql_fetch_array()
本质上返回两个数组索引,一个带有关联字符串索引。
因此,使用mysql_fetch_array()
而未指定MYSQL_ASSOC
或MYSQL_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()作为可选的第二个参数。它只返回一个关联数组。