SELECT COUNT(*) FROM `feed` WHERE `uid` = 1121293;
返回符合條件的總筆數。缺點: 全表掃描或索引掃描計數,大表效能差。
SELECT 1 FROM `tablename` WHERE `col` = 'value' LIMIT 1;
找到第一筆即停止。搭配 PDO::rowCount() 或驅動程式的 affected_rows 判斷。優點: 索引命中即返回,極快。
SELECT EXISTS(SELECT 1 FROM `feed` WHERE `uid` = 1121293);
返回 1(存在)或 0(不存在)。子查詢的 SELECT 1 被優化器忽略,不實際讀取資料行。理論效能最佳。
<?php
$sql = "SELECT * FROM checklist WHERE game_id=$gid AND task='$task' AND status='$status'";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
if (!mysql_num_rows($result)) {
echo "Record doesn't exist";
} else {
echo $row['game_id'] . $row['task'];
}
?>
注意: mysql_* 函數已棄用,請改用 PDO 或 mysqli。
| 方法 | 執行計劃 | 網路傳輸 | 推薦指數 |
|---|---|---|---|
| COUNT(*) | Full/Index Scan + Aggregate | 1 行 1 列 | ⭐⭐ |
| LIMIT 1 | Index Lookup (Stop at 1) | 1 行 1 列 | ⭐⭐⭐⭐ |
| EXISTS | Index Lookup (Semi-Join) | 1 行 1 列 | ⭐⭐⭐⭐⭐ |
| 應用層 SELECT * | Index Lookup + Row Fetch | 整行資料 | ⭐⭐ |
SELECT 1 FROM t WHERE pk = ? LIMIT 1LIMIT 1 或 EXISTSIN 或 JOIN 一次查多筆,避免 N+1 問題-- 查看執行計劃
EXPLAIN SELECT 1 FROM feed WHERE uid = 1121293 LIMIT 1;
-- 期望看到 type=ref/eq_ref, rows=1, Extra=Using where