首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

2000 萬條數據快速查詢:數據庫優化實戰方案

     編輯:程式設計綜合問答

數據規模評估

  • CSV 3 GB → MySQL 約 1.5 GB(壓縮後)。
  • 2000 萬行屬於中等數據量,單表單機 MySQL 可支撐,關鍵在索引設計。

方案對比

方案預估查詢延遲實施成本適用場景
1. 單表 + 覆蓋索引10~50 ms極低查詢模式固定,僅按姓名/身份證
2. 分表(按姓名首字母/拼音首字母 26/100 表)5~20 ms中(應用層路由)寫入頻繁,需並行導入
3. Elasticsearch 全文檢索5~30 ms高(運維集群)模糊搜索、多條件組合
4. Linux 命令行 grep1~5 s零一次性臨時查詢,無並發

推薦方案:MySQL 覆蓋索引 + 讀寫分離

  1. 建表:
    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;
    
  2. 導數據: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;
    
  3. 查詢:
    SELECT id_card, checkin_date, room_no 
    FROM hotel_records 
    WHERE name = '張三' 
    ORDER BY checkin_date DESC;
    -- EXPLAIN 顯示 Using index,無 Using where/Using filesort
    
  4. 架構擴展:主庫寫、從庫讀;從庫專跑查詢,主庫不受影響。

若必須用 CSV 直接查

# 精確匹配姓名(需排序後用二分,或建立輔助索引文件)
# 簡單粗暴:
grep -a '"張三"' data.csv | head -20
# 大文件建議先 split -l 1000000 再並行 grep

避坑指南

  • 不要用 LIKE '%張三%' 導致全表掃描。
  • 姓名非唯一,務必返回主鍵/身份證供二次確認。
  • 定期 ANALYZE TABLE 更新統計信息,防止優化器走錯索引。

2000 萬行在優化得當的 MySQL 上屬於「小數據」。**覆蓋索引 + 禁用鍵導入 + 讀寫分離** 是性價比最高的組合,無需上分庫分表或 ES。

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