Mysql 工作筆記

DeepInThought發表於2024-04-18

一、運維相關

1、刪除binlog日誌

二、 索引相關

2.1、索引建立

  1. 在區分度高的欄位上建立索引;
    索引區分度 = count(distint 記錄) / count(記錄)。

  2. 巧用組合索引實現** Index Condition Pushdown(ICP)索引下推**,避免回表。

--  先對 name 匹配索引找到 主鍵,在回表根據主鍵 找到資料記錄後 判斷 sex 條件
select count(id) from test1 a where name like 'cookie%' and sex = 1
-- 建立聯合索引:(name,sex),透過索引資料即可完成整個條件過濾,避免回表。
  1. 巧用組合索引最佳化排序。
-- 使用 user_id 索引匹配到資料後,回表找到所有資料 在排序
select user_id, order_time from order where user_id = 'cookie'  order by order_time
--  建立聯合索引:(user_id, order_time),透過user_id檢索的資料已按order_time升序,將結果翻轉即可得到降序。
  1. 聯合索引注意最左匹配原則:按照從左到右的順序匹配,mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配。
    比如 a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d 用不到索引,如果建立(a,b,d,c)在都可以使用索引,a,b,d 的順序可任意調整。

2.2、索引使用

  1. 使用between、>、<等區間查詢,若範圍太大,跨度page過多,速度也會較慢;

  2. in 檢索欄位使用索引不一定比關聯慢;

  3. 當多個條件中有索引的時候,並且關係是and的時候,會走索引區分度高的;

  4. 謹慎使用*,最小查詢。儘量去利用索引覆蓋,可以減少 回表 操作 。;

  5. 查詢資料都在索引樹中時,出現索引覆蓋,避免回表;

2.3、索引失效

  1. 對於 '%cookie'、'_cookie' 型別的模糊查詢,索引失效;

  2. 索引欄位為字串,條件值為數字(如:name=1),索引失效;

  3. 索引欄位使用了函式(如:concat(a.name,'1') ='cookie1'),索引失效;

  4. 索引欄位使用了運算子(如: id + 1 < 2),索引失效;

相關文章