首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 查詢結果不一致:索引損壞導致 select * vs select col 差異排查

     編輯:MySQL 資料庫相關知識

同一 MyISAM 表執行 SELECT * 返回 4 行,SELECT uid 僅返回 3 行,丟失 uid='uid_3' 記錄。根因:**索引文件損壞,.MYI 與 .MYD 不一致**。

現象分析

  • SELECT *:全表掃描數據文件,按記錄鏈表順序讀取,不依賴索引,**不受索引損壞影響**。
  • SELECT uid:優化器選擇索引掃描,遍歷 .MYI 索引項,**受損壞索引影響,僅返回索引中存在的 3 條**。

診斷與修復

-- 檢查表狀態
CHECK TABLE table_myisam;
-- 輸出關鍵錯誤:
-- "Size of indexfile is: 2049 Should be: 2048"
-- "Found 3 keys of 4"
-- "Corrupt"

-- 修復索引
REPAIR TABLE table_myisam;
-- 返回 "status OK"

-- 再次驗證
CHECK TABLE table_myisam;  -- status OK
SELECT * FROM table_myisam;    -- 4 rows
SELECT uid FROM table_myisam;  -- 4 rows

預防建議

  • 定期執行 CHECK TABLE 或 mysqlcheck -A 掃描損壞。
  • 重要業務表優先使用 InnoDB,具備崩潰恢復與校驗和機制。
  • 異常斷電/殺進程後,啟動前執行 myisamchk -r 離線修復。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved