萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 判斷資料是否存在的 4 種方法與效能比較

四種常見寫法

1. COUNT(*) 統計

SELECT COUNT(*) FROM `feed` WHERE `uid` = 1121293;

返回符合條件的總筆數。缺點: 全表掃描或索引掃描計數,大表效能差。

2. LIMIT 1 取單筆(推薦)

SELECT 1 FROM `tablename` WHERE `col` = 'value' LIMIT 1;

找到第一筆即停止。搭配 PDO::rowCount() 或驅動程式的 affected_rows 判斷。優點: 索引命中即返回,極快。

3. EXISTS 子查詢

SELECT EXISTS(SELECT 1 FROM `feed` WHERE `uid` = 1121293);

返回 1(存在)或 0(不存在)。子查詢的 SELECT 1 被優化器忽略,不實際讀取資料行。理論效能最佳。

4. 應用層判斷(PHP 範例)

<?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 + Aggregate1 行 1 列⭐⭐
LIMIT 1Index Lookup (Stop at 1)1 行 1 列⭐⭐⭐⭐
EXISTSIndex Lookup (Semi-Join)1 行 1 列⭐⭐⭐⭐⭐
應用層 SELECT *Index Lookup + Row Fetch整行資料⭐⭐

最佳實踐

  1. 唯鍵/主鍵查詢: 直接 SELECT 1 FROM t WHERE pk = ? LIMIT 1
  2. 非唯一索引: 同樣用 LIMIT 1 或 EXISTS
  3. 批次檢查: 使用 IN 或 JOIN 一次查多筆,避免 N+1 問題
  4. 緩存層: 高頻存在性檢查優先走 Redis/Bloom Filter

驗證技巧

-- 查看執行計劃
EXPLAIN SELECT 1 FROM feed WHERE uid = 1121293 LIMIT 1;
-- 期望看到 type=ref/eq_ref, rows=1, Extra=Using where
copyright © 萬盛學電腦網 all rights reserved