Ubuntu下MySQL查詢優化的核心方法
WHERE
、JOIN
、ORDER BY
、GROUP BY
子句中頻繁使用的列創建索引;高選擇性列(如唯一ID、狀態字段)的索引效果更佳。例如,用戶表的status
字段(區分度高)適合建索引。WHERE age > 18 AND city = 'Beijing'
),創建復合索引(age, city)
,并遵循最左前綴原則(查詢條件需包含索引左側列)。避免冗余索引(如已有(a,b)
復合索引,無需再建a
的單列索引)。WHERE YEAR(create_time) = 2024
應改為WHERE create_time BETWEEN '2024-01-01' AND '2024-12-31'
)、隱式類型轉換(如WHERE varchar_col = 123
應改為WHERE varchar_col = '123'
)或OR
條件(除非每個條件都有索引)。SELECT column1, column2
代替SELECT *
,減少數據傳輸量和內存占用。JOIN
代替子查詢(如SELECT a.* FROM table_a a JOIN table_b b ON a.id = b.a_id
比SELECT * FROM table_a WHERE id IN (SELECT a_id FROM table_b)
更高效);優先使用UNION ALL
(不去重)代替UNION
(去重),減少排序開銷。LIMIT offset, size
的大偏移量(如LIMIT 100000, 10
),改用延遲關聯(先查ID再關聯原表):SELECT a.* FROM table a JOIN (SELECT id FROM table ORDER BY create_time LIMIT 100000, 10) b ON a.id = b.id
。innodb_buffer_pool_size
是InnoDB引擎的核心參數,設置為服務器物理內存的50%-80%(如16GB內存設為8GB-12GB),用于緩存數據和索引,顯著提升讀寫性能。max_connections
根據應用并發需求設置(如100-500),避免過多連接導致資源競爭;可配合連接池(如HikariCP)復用連接。slow_query_log = ON
、long_query_time = 2
(超過2秒的查詢)記錄慢查詢,結合mysqldumpslow
或pt-query-digest
工具分析瓶頸語句。INT
代替BIGINT
、VARCHAR(50)
代替TEXT
);避免TEXT
/BLOB
類型(除非存儲大量文本),如需使用可考慮分表。PARTITION BY RANGE
(按時間范圍)或HASH
(按哈希值)分區,將數據分散到多個物理文件,提升查詢效率。例如,訂單表按月份分區:ALTER TABLE orders PARTITION BY RANGE (TO_DAYS(create_time)) (PARTITION p202401 VALUES LESS THAN (TO_DAYS('2024-02-01')), PARTITION p202402 VALUES LESS THAN (TO_DAYS('2024-03-01')))
。ANALYZE TABLE table_name
更新表的統計信息,幫助優化器選擇更優的執行計劃。OPTIMIZE TABLE table_name
或ALTER TABLE table_name ENGINE=InnoDB
重建索引,消除數據插入/刪除導致的碎片,提升索引效率。SHOW STATUS
(查看狀態變量)、SHOW PROCESSLIST
(查看當前進程)監控數據庫狀態;使用MySQL Workbench
、Percona Monitoring and Management(PMM)
等工具可視化分析性能趨勢。