我一直在对从 PHP 中的 MySQL 获取信息的各种方法进行一些计时测试。目标是找到将一列数据传输到简单数组中的最快方法。我已经针对 enSEMBL 数据库对其进行了测试,该数据库非常有用。
以下代码对于方法 1 到 8(9 使用 GROUP_CONCAT 和 10 使用 PDO)很常见:
$query = "SELECT DISTINCT `name` FROM species LIMIT 5000";
$result = $mysqli->query($query);
*Method code*
print_r(array_filter($species));
方法一:教科书法
while ($row = $result->fetch_row()) {
$species[] = $row[0];
}
方法 2:while 和 reset(注意一些 IDE 在这里检测到错误)
while ($species[] = reset($result->fetch_row())) ;
方法3:foreach和reset
foreach ($result->fetch_all() as $value) $species[] = reset($value);
方法四:while、foreach、reset
while ($species[] = $result->fetch_row()) ;
foreach ($species as $key => $value) $species[$key] = reset($value);
方法五:while 和 index
while ($row = $result->fetch_row()) $species[] = $row[0];
方法六:foreach 和 index
foreach ($result->fetch_all() as $value) $species[] = $value[0];
方法七:递归数组
$species = call_user_func_array('array_merge', $result->fetch_all());
方法8:array_column
$species = array_column($result->fetch_all(), 0);
方法 9:在查询中使用 GROUP_CONCAT。
$species = explode(',', $result->fetch_row()[0]);
方法 10:PDO
$species = $sth->fetchAll(PDO::FETCH_COLUMN, 0);
令人惊讶的是,方法 1(教科书)始终比实际上相同的方法 5 长约 4 倍,但与方法 10 (PDO) 花费的时间大致相同。
方法 2 一直是最慢的方法,长 50 倍,大概是因为系统在某处写警告。
方法 4(两个循环)是第二慢的,耗时 10 倍。
如前所述,方法 1(教科书)和 10(PDO)排在第三位。
方法 9 是第四慢的(长 2 倍,缺点是在没有任何警告的情况下达到 GROUP_CONCAT 限制)。
然而,最快的方法并不一致。从 3、5、6、7 和 8 中选择。
方法 8 (array_column) 通常是最快的方法,但并非总是如此。但是我认为它是最优雅的方法,并且提供了更多的灵活性,因为它可以使用您的查询选择的任何两列返回一个关联数组(但不要弄乱查询中的顺序!)