萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 百萬級數據優化 30 條鐵律:索引、查詢、架構全方位

索引篇

  1. WHERE/ORDER BY/JOIN 列建索引:但避免過度索引(單表 ≤ 5-6 個)
  2. 避免 NULL 判斷:WHERE col IS NULL 不走索引 → 設置默認值 0/空串,查 col = 0
  3. 拒絕 != / <>:導致全掃 → 用 col < val OR col > val 或業務層過濾
  4. 慎用 OR:WHERE a=1 OR b=2 多半全掃 → 改 UNION ALL 走各自索引
  5. IN / NOT IN 謹慎:值少用 IN,值多或連續用 BETWEEN;子查詢 IN 改 EXISTS
  6. LIKE '%abc%' 導致全掃 → 全文索引或 Elasticsearch
  7. 參數化查詢可能全掃:優化器無法識別值 → FORCE INDEX 或拆分語句
  8. 列運算殺索引:WHERE col/2=100 → 改 WHERE col=200
  9. 列函數殺索引:WHERE SUBSTRING(name,1,3)='abc' → 改 WHERE name LIKE 'abc%'
  10. 復合索引最左前綴:INDEX(a,b,c) 必須從 a 開始用,順序一致
  11. 避免 SELECT *:增加 I/O、網絡、緩存壓力 → 顯式列出所需列
  12. 覆蓋索引:SELECT a,b FROM t WHERE c=1 配合 INDEX(c,a,b) 避免回表

數據類型篇

  1. 優先數字類型:比較快、存儲小、索引窄
  2. VARCHAR 替代 CHAR:InnoDB 下節省空間、減少 I/O
  3. NOT NULL:統計準確、簡化判斷、節省位圖
  4. 低基數用 ENUM:內部存整數,比較極快
  5. PROCEDURE ANALYSE():自動建議優化類型

表設計篇

  1. 大字段拆表:BLOB/TEXT 移副表,主表固定行、高緩存命中
  2. 合成索引:MD5/SHA1 值建索引,精確匹配大文本
  3. 避免大事務:拆分、異步、補償,提升並發
  4. 限制結果集:分頁加 LIMIT,禁止無限制大查詢

DML 優化篇

  1. 批量 INSERT:VALUES (...),(...) 或 LOAD DATA,減少解析/刷新
  2. 導入先禁索引:大量導入前 DROP INDEX,後 CREATE INDEX
  3. 短 SQL:減少解析、網絡傳輸
  4. 臨時表謹慎:優先導出表/CTE,臨時表最後手段
  5. 游標慎用:>1萬行改集合操作;小集合可用 FAST_FORWARD 游標
  6. SET NOCOUNT ON:存儲過程減少網絡包(SQL Server 習慣,MySQL 無此項)

系統篇

  1. 內存分配公式:(connections × buffers) + global_buffers < 物理內存 70%
  2. Linux 調優:swappiness=1、huge pages、memlock
  3. 工具輔助:mysqltuner、pt-query-digest、EXPLAIN ANALYZE

實戰檢查清單

# 1. 慢查詢分析
pt-query-digest /var/log/mysql/slow.log --limit 20

# 2. 索引使用情況
SELECT * FROM sys.schema_unused_indexes;
SELECT * FROM sys.schema_redundant_indexes;

# 3. 表碎片
SELECT TABLE_NAME, DATA_FREE/1024/1024 AS free_mb 
FROM information_schema.TABLES 
WHERE DATA_FREE > 100*1024*1024;

# 4. 檢查未命中索引的查詢
SELECT * FROM sys.statements_with_full_table_scans LIMIT 10;

優化無終點,只有持續觀測、量化分析、針對性調整。將上述鐵律內化為代碼審查標準,才能從根源遏制劣質 SQL。

copyright © 萬盛學電腦網 all rights reserved