| 方案 | 預估查詢延遲 | 實施成本 | 適用場景 |
|---|---|---|---|
| 1. 單表 + 覆蓋索引 | 10~50 ms | 極低 | 查詢模式固定,僅按姓名/身份證 |
| 2. 分表(按姓名首字母/拼音首字母 26/100 表) | 5~20 ms | 中(應用層路由) | 寫入頻繁,需並行導入 |
| 3. Elasticsearch 全文檢索 | 5~30 ms | 高(運維集群) | 模糊搜索、多條件組合 |
4. Linux 命令行 grep | 1~5 s | 零 | 一次性臨時查詢,無並發 |
CREATE TABLE hotel_records (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
id_card VARCHAR(18) NOT NULL,
checkin_date DATE NOT NULL,
room_no VARCHAR(10),
-- 其他字段
PRIMARY KEY (id),
-- 覆蓋索引:查詢只需掃描索引樹,無需回表
INDEX idx_name_cover (name, id_card, checkin_date, room_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
LOAD DATA INFILE 批量導入,關閉索引後重建最快。
ALTER TABLE hotel_records DISABLE KEYS;
LOAD DATA INFILE '/path/data.csv' INTO TABLE hotel_records
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'
IGNORE 1 LINES (name, id_card, checkin_date, room_no);
ALTER TABLE hotel_records ENABLE KEYS;
SELECT id_card, checkin_date, room_no
FROM hotel_records
WHERE name = '張三'
ORDER BY checkin_date DESC;
-- EXPLAIN 顯示 Using index,無 Using where/Using filesort
# 精確匹配姓名(需排序後用二分,或建立輔助索引文件)
# 簡單粗暴:
grep -a '"張三"' data.csv | head -20
# 大文件建議先 split -l 1000000 再並行 grep
LIKE '%張三%' 導致全表掃描。ANALYZE TABLE 更新統計信息,防止優化器走錯索引。2000 萬行在優化得當的 MySQL 上屬於「小數據」。**覆蓋索引 + 禁用鍵導入 + 讀寫分離** 是性價比最高的組合,無需上分庫分表或 ES。