以下是大多数php代码中常用的两种获取mysql数据的方法。
-
mysql_fetch_array()
-
mysql_fetch_assoc()
现在,我有一个大数据库。对于循环获取数据(while
(,什么更快更好?
我找到了这个基准。
哪个是你的选择?
这取决于表格的设置方式:
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]
更容易理解。
这是 mysql_fetch_array((
$row['fieldname'] = 'some value';
或
$row[0] = some value';
这是 mysql_fetch_assoc(( 只会返回的结果
$row['fieldname'] = 'some value';
我更喜欢fetch_assoc。它返回一个"关联数组"(如 python 字典(。这意味着您的数组按字符串索引(在我通常的情况下(。
fetch_array 的默认值同时提供编号索引和关联索引。
但我从不使用编号索引,所以我喜欢用fetch_assoc让它更快一点
示例中所示的 benchark 使用没有任何参数的 mysql_fetch_array(( 来指定MYSQL_ASSOC或MYSQL_NUM,因此它默认为 MYSQL_BOTH...这将扭曲结果,因为它必须加载两倍于 mysql_fetch_assoc(( 的数组元素。所以我建议它不是一个有效的基准。
实际上,mysql_fetch_array(( 与 MYSQL_ASSOC 和 mysql_fetch_assoc(( 之间的区别应该很少,而且它不会是脚本中最大的开销。
在这种情况下,查询结果的"大小"无关紧要。
mysql_fetch_array()
通常通过返回关联数组和索引结果来产生开销。
应该决定查询的类型以及是使用 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 相当过时的过程数据检索功能时。还有其他选择。
mysql_fetch_assoc()
可能是更好的选择。有一个轻微的性能下降(mysql 扩展需要查找列名,但这应该只发生一次,无论你有多少行(,但可能不足以证明使用 mysql_fetch_array()
的合理性。 不过,如果您只选择一列,mysql_fetch_array()
会很有用。
我想这取决于你对大的定义。从该基准测试中,您可以看到,只有在您执行超过 1,000,000 亿次抓取之前,您才能真正获得可衡量的差异?你的数据库有那么大吗?如果没有,那么使用更容易使用的方法(可能是获取关联数组(。
要考虑的另一点是,如果它是如此之大以至于存在可测量的差异,那么我将从一起使用这样的功能中获得一种方法。考虑使用MySQLi,甚至更好地使用PDO!
好吧 http://php.net/manual/en/function.mysql-fetch-assoc.php 状态
注意:性能
需要注意的重要一点是,使用 mysql_fetch_assoc(( 并不比使用 mysql_fetch_row(( 慢得多,尽管它提供了显着的附加值。
因此,差异不应该是值得担心的事情。
要记住的另一点是,fetch_assoc()
可能不会返回您期望的每一列。 如果 2 个输出列具有相同的名称,则 fetch_assoc()
将仅检索该列的最后一个实例。 例如,以下查询:
SELECT * FROM orders LEFT JOIN line_items ON orders.id = line_items.order_id
假设两个表都有一个名为 id
的列,生成的关联数组将具有一个名为 id
的键,其值设置为 line_items.id
,您将无法从结果中检索orders.id
!
您可以避免此重复列名问题,并通过手动为SELECT
列指定别名并为每个列指定唯一的别名来继续使用 fetch_assoc()
:
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
或者您可以切换到使用 fetch_array()
,这将允许您按索引而不是按键访问id
mysql_fetch_array(( vs mysql_fetch_assoc((
mysql_fetch_array((:返回与读取的行对应的数组,并将内部数据指针向前移动。如需更好的文档,请单击此处!以了解更多信息mysql_fetch_assoc((:等效于调用 mysql_fetch_array(( 并MYSQL_ASSOC用于可选的第二个参数。它只返回一个关联数组。