在获取时检查行存在的最快方法是哪种?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在获取时检查行存在的最快方法是哪种?相关的知识,希望对你有一定的参考价值。
从以下查询中,哪一个是最优和最快的?
[COUNT(id)]
$SQL = "SELECT name, COUNT(id) as Count FROM names WHERE name = :name";
$row = $stmt->fetch();
if ($data['count'] > 0) {
while ($row) {
$name = $row['name'];
}
} else {
return;
}
或[rowCount()]
$SQL = "SELECT name FROM names WHERE name = :name";
if ($stmt->rowCount() > 0) {
while ($row = $stmt->fetch()) {
$name = $row['name'];
}
} else {
return;
}
或[EXISTS]
$SQLEX = "SELECT EXISTS (SELECT name FROM names WHERE name = :name LIMIT 1)";
if ($stmt->fetchColumn == 1) {
$SQL = "SELECT name FROM names WHERE name = :name";
while (row = $stmt->fetch()){
$name = $row['name'];
}
} else {
return;
}
或[RAW]
$SQL = "SELECT name FROM names WHERE name = :name";
$row = $stmt->fetch();
if ($row) {
while($row) {
$name = $row['name'];
}
} else {
return;
}
另外我想知道,为什么使用$stmt->fetch()
与$stmt->rowCount()
允许我获取数据,但使用它与$stmt->fetchColumn
不?
答案
好吧,似乎这个问题需要不止一个答案......
如果你需要检查存在,
- 如果该字段有唯一索引,则所有方法都相同,但其中一些方法没有意义。
- 如果没有唯一索引,则转到EXISTS
如果您需要获取实际数据并查看是否有任何返回,那么只需选择您的数据并获取它:
- 如果只需要一行中的一列,则使用fetchColumn()
- 如果只需要一行,那么使用fetch()
- 如果需要多行,则使用fetchAll()
然后使用结果值来查看您的查询是否返回任何数据。
因此,如果您最终了解了您所询问的内容,以下是适合您的最佳代码:
$SQL = "SELECT name FROM names WHERE name = :name";
$data = $stmt->fetchAll(PDO::FETCH_COLUMN);
if (!$data) {
return;
}
foreach ($data as $name) ...
除了你的想法之外,fetchColumn()没有任何问题。
另一答案
首先,如果你有names(name)
的索引,那么所有的速度都应该相当。
其次,总是值得在自己的系统上尝试这样的性能测试。
第三,如果在names
表中将名称声明为唯一(或主键),则所有名称都应该非常快。
但是,一般来说,确定行是否可用的最快方法是:
SELECT EXISTS (SELECT name FROM names WHERE name = :name)
子查询中的LIMIT 1
是不必要的 - EXISTS
在第一行停止(数据库是使用索引还是表扫描)。
通常,使用聚合的第一种方法是最差的解决方案。如果没有索引,它将导致全表扫描读取整个表。第二个可能会也可能不会读取整个表,具体取决于数据库是否在可用时开始返回匹配的行。它还有返回更多数据的缺点。
以上是关于在获取时检查行存在的最快方法是哪种?的主要内容,如果未能解决你的问题,请参考以下文章