哪一个检查行时存在的最快方法?
从以下查询中,哪一个是最优化和最快使用的?哪一个检查行时存在的最快方法?
[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;
}
OR [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;
}
OR [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
不?
回答:
好吧,看来这个问题需要一个以上的答案...
F你需要检查只存在,
- 如果有一个领域的唯一索引,所有方法是平等的,但其中一些只是没有意义。
- 如果没有唯一索引,然后去EXISTS
如果你需要获取的实际数据,看看是否有什么回来了,然后只需选择您的数据,并把它拿来:
- 如果从单个行只有一列的预期,然后使用fetchColumn()
- 如果只有一行被预期的,然后使用取()
- 如果多排料,然后使用使用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
停止(数据库是否使用索引或表扫描)。
通常,使用聚合的第一种方法是最差的解决方案。如果没有索引,它将导致全表扫描,从而读取整个表。第二个可能会或可能不会读取整个表,具体取决于数据库是否开始返回可用的匹配行。它也有返回更多数据的缺点。
以上是 哪一个检查行时存在的最快方法? 的全部内容, 来源链接: utcz.com/qa/264327.html