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),行數不一致提示索引與數據不一致。
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:明確標記為損壞。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+ 樹葉子節點 | 索引缺失導致行數少 |
CHECK TABLE 納入巡檢腳本,異常即時告警。kill -9、斷電導致 MyISAM 未刷新索引緩存;配置 myisam_recover_options=FORCE,BACKUP 啟動時自動修復。CHECK TABLE,確保備份可用。MyISAM 索引損壞是導致「同表不同查詢行數不一致」的經典案例。CHECK TABLE 快速定位,REPAIR TABLE 原地修復。長期治本:遷移至 InnoDB + 完善備份巡檢體系。