如何通过选择 * 并使用 php 在执行时间 O(1) 中访问 mysql 字段

Posted

技术标签:

【中文标题】如何通过选择 * 并使用 php 在执行时间 O(1) 中访问 mysql 字段【英文标题】:How can access to a mysql field in execution time O(1) by select * and use php 【发布时间】:2014-11-06 13:23:16 【问题描述】:

假设我们有一个包含一些行的 mysql 表。我们要检查特定记录的存在,例如它的 'index'=0 。通过 php ,在进行“SELECT * from My_table”之类的查询后,我们总是使用 mysql_fetch_array 之类的命令,然后使用这个结构:

while ( $row = mysql_fetch_array($sql_result) )

  if ( $row['index'] == 0 )
       return true;

但是这种方法获得时间为 O(n) 。 如何将此算法优化到 O(1)? 然后写下我们搜索过的整个行?

请注意,我想通过 php 而不是通过 sql 来查找特定行,例如 SELECT ... WHERE index=1。 换句话说,我想从 mysql_fetch_array 产生的数组中获取行。

【问题讨论】:

"我们总是使用 mysql_fetch_array 之类的命令"。我们总是使用 mysqli_* 或 PDO 而不是 mysql_* 函数,因为 mysql_* 函数已被弃用。 如@lolka_bolka 所说,请阅读this question. 您可以使用LIMIT 来执行此操作,例如SELECT * FROM My_table ORDER BY ID LIMIT 120, 1; 将返回第 120 行。 非常重要的一点是,SQL 中的数据没有隐含的顺序,为了让“Row 20”有任何意义,您必须提供@987654326 @ 子句。 这听起来也像XY Problem,我正在努力想一个场景,即获取一个数组,遍历它以找到一个值,然后查询该行将是最好的解决方案。可能值得提供有关您要实现的目标的更多详细信息,有人可能会提出更好的实现方法。 唯一的O(1) 可能解决方案是让 MySQL 返回特定记录。根据定义,其他所有内容都不会也不能是O(1) 【参考方案1】:

你不能。最好的情况是 O(n),因为无论如何您都必须一次遍历所有项目 - 要么遍历它们以构建一个哈希表,然后查询它(这将至少需要 O(n)总计),或者您在找到该项目时返回。

如果您要多次查询结构,构建哈希仍然至少需要 O(n),但查询将是 O(1)(理论上)。

但这是一个实际使用数据库来做它擅长的事情的领域——检索信息,并有条件地进行——是合适的解决方案。数据库引擎可以拥有有助于使信息检索接近 O(1) 的索引(如果数据库引擎构建散列或二进制查找结构 (O(ln n)))。

【讨论】:

以上是关于如何通过选择 * 并使用 php 在执行时间 O(1) 中访问 mysql 字段的主要内容,如果未能解决你的问题,请参考以下文章

如何通过javascript执行php

如何在php中增加最大执行时间[重复]

如何选择并搭建php开发环境

如何使用Linux的Crontab定时执行PHP脚本的方法

如何设置PhpStorm以便Docker Compose Interpreter可以使用PHP可执行文件?

如何使用 pdo 执行功能来选择表?