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

MySQL 查詢結果不一致排查實戰:MyISAM 索引損壞導致 select * 與 select col 行數不同

     編輯:MySQL 資料庫相關知識

現象描述

mysql> SELECT * FROM table_myisam;
+----------+-------+-----------+------+
| datetime | uid   | content   | type |
+----------+-------+-----------+------+
| 1        | uid_1 | content_1 | 1    |
| 2        | uid_2 | content_2 | 1    |
| 4        | uid_4 | content_4 | 1    |
| 3        | uid_3 | content_3 | 1    |
+----------+-------+-----------+------+
4 rows in set

mysql> SELECT uid FROM table_myisam;
+-------+
| uid   |
+-------+
| uid_1 |
| uid_2 |
| uid_4 |
+-------+
3 rows in set  -- 丟失 uid_3

SELECT * 走全表掃描(數據文件 .MYD),SELECT uid 走索引掃描(索引文件 .MYI),行數不一致提示索引與數據不一致。

根因確認:CHECK TABLE

mysql> CHECK TABLE table_myisam;
+--------------------+-------+----------+-------------------------------------------------------+
| Table              | Op    | Msg_type | Msg_text                                              |
+--------------------+-------+----------+-------------------------------------------------------+
| qitai.table_myisam | check | warning  | 1 client is using or hasn't closed the table properly |
| qitai.table_myisam | check | warning  | Size of indexfile is: 2049  Should be: 2048           |
| qitai.table_myisam | check | error    | Found 3 keys of 4                                     |
| qitai.table_myisam | check | error    | Corrupt                                               |
+--------------------+-------+----------+-------------------------------------------------------+
  • Found 3 keys of 4:索引文件僅有 3 條鍵值,少於數據行數 4。
  • Corrupt:明確標記為損壞。

修復方案:REPAIR TABLE

mysql> REPAIR TABLE table_myisam;
+--------------------+--------+----------+----------+
| Table              | Op     | Msg_type | Msg_text |
+--------------------+--------+----------+----------+
| qitai.table_myisam | repair | status   | OK       |
+--------------------+--------+----------+----------+

修復後再次 CHECK TABLE 顯示 status OK,SELECT * 与 SELECT uid 均返回 4 行。

原理深度解析

查詢方式訪問路徑受損壞影響
SELECT *順序讀取 .MYD 數據文件,通過行鏈表遍歷不依賴 .MYI 索引,故不受影響
SELECT uid遍歷 .MYI 索引文件的 B+ 樹葉子節點索引缺失導致行數少

預防與最佳實踐

  • 優先使用 InnoDB:事務崩潰恢復、雙寫緩衝區、校驗和機制大幅降低損壞概率。
  • 定期校驗:CHECK TABLE 納入巡檢腳本,異常即時告警。
  • 優雅關閉:避免 kill -9、斷電導致 MyISAM 未刷新索引緩存;配置 myisam_recover_options=FORCE,BACKUP 啟動時自動修復。
  • 備份驗證:備份後在備用庫執行 CHECK TABLE,確保備份可用。

總結

MyISAM 索引損壞是導致「同表不同查詢行數不一致」的經典案例。CHECK TABLE 快速定位,REPAIR TABLE 原地修復。長期治本:遷移至 InnoDB + 完善備份巡檢體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved