如何通过选择 * 并使用 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 字段的主要内容,如果未能解决你的问题,请参考以下文章