1. 事務四大特性(ACID)
-
原子性:事務的操作要么全部成功,要么全部失敗回滾,不可分割。
-
一致性:事務執行前后,數據必須滿足業務規則(如賬戶總額不變)。
-
隔離性:多個并發事務之間互不干擾。
-
持久性:事務提交后,對數據的修改永久保存,即使系統故障也不丟失。
2. 并發事務的問題
-
臟讀:讀到其他事務未提交的數據,可能被回滾。
-
不可重復讀:同一事務內多次讀取同一數據,結果不一致(數據被其他事務修改)。
-
幻讀:同一事務內多次查詢同一范圍,結果集不同(其他事務新增或刪除了數據)。
3. 索引優缺點
-
優點:
-
大幅提高查詢速度(尤其WHERE、JOIN、ORDER BY)。
-
唯一索引保證數據唯一性。
-
-
缺點:
-
占用額外存儲空間。
-
增刪改操作需維護索引,可能降低寫性能。
-
不合理的索引設計可能拖慢查詢(如過多索引導致優化器選擇困難)。
-
4. 索引類型
-
主鍵索引:唯一且非空,表自動創建。
-
唯一索引:列值唯一,允許NULL。
-
普通索引:無唯一性約束,加速查詢。
-
全文索引:支持文本內容的模糊搜索(如LIKE '%keyword%')。
-
組合索引:多列聯合索引,遵循最左前綴原則。
5. 索引存儲形式分類
聚集索引 : 必須有 ,而且只 有一個
二級索引: 可以存在多個
6. SQL分析工具
-
EXPLAIN:分析執行計劃,關注
type
(掃描方式)、key
(使用的索引)、rows
(掃描行數)等字段。 -
慢查詢日志:記錄執行時間超過閾值的SQL。
-
Profiler工具:如MySQL的
SHOW PROFILE
,查看SQL執行各階段耗時。 -
第三方工具:如Percona Toolkit、pt-query-digest分析慢查詢。
7. SQL優化實踐
-
索引優化:
-
為高頻查詢條件建索引,避免全表掃描。
-
使用覆蓋索引(索引包含查詢字段,減少回表)。
-
-
避免SELECT *:只取必要字段,減少I/O和內存消耗。
-
分頁優化:
-
大分頁用延遲關聯:
SELECT * FROM table JOIN (SELECT id FROM table LIMIT 100000,10) t USING(id)
。
-
-
慎用函數操作索引列:如
WHERE YEAR(create_time)=2023
改為范圍查詢。 -
JOIN替代子查詢:減少嵌套查詢的臨時表開銷。
-
事務拆分:大事務拆小,減少鎖競爭和回滾開銷。
-
定期統計信息更新:如
ANALYZE TABLE
確保優化器選擇正確索引。
示例場景: 某分頁查詢SELECT * FROM orders LIMIT 100000,10
執行緩慢,優化步驟:
-
用EXPLAIN發現全表掃描。
-
改為覆蓋索引+延遲關聯:
sql
復制
下載
SELECT * FROM orders ? JOIN (SELECT id FROM orders ORDER BY id LIMIT 100000,10) AS tmp ? ON orders.id = tmp.id; ?
-
執行時間從2秒降至0.1秒。