摘要
最近遇到乙個慢sql,在排查過程中發現和分庫分表後的索引設定有關係,總結了下問題。
問題在進行應用健康度盤點時,發現有個慢sql
如下select brandgoodid from brandgood_0020
where userid = *** and
brandgoodid in("***1","***2")
表結構,按照userid進行的分表。
create table`brandgood_0020` (
`brandgoodid` char(30) not null comment ,
`user_id` int(10) unsigned default null comment '使用者id',
`created` timestamp null default current_timestamp,
`last_modified` timestamp null default current_timestamp on update current_timestamp,
`deleted` bit(1) not null default b'0',
primary key (`brandgoodid`),
key `idx_userid` (`userid`) using btree,
) engine=innodb default charset=utf8
explain一下發現走的是userid這個索引,乙個使用者下面有很多商品,也就有了很多brandgoodid,所以有可能會很慢,因為要掃瞄很多的索引鍵去過濾brandgoodid值。
而寫這個sql的人期望走的主鍵索引,而不是『userid『的索引。因為用主鍵索引,就是n次主鍵掃瞄(n表示in中的數量)。
分析直接原因很明顯
in 這個查詢誤導了mysql的優化器,選錯了索引
in 查詢常常會影響mysql server的判斷。主要是in裡面的值數量不同,會影響掃瞄行數的不同,所以常常會出現索引選擇不一致。之前也總結過一篇sql in 一定走索引嗎
解決因為使用者查詢的brandgoodlid是限定在某個group維度下的,乙個group對應的brandgood是有限的,在這個業務中,通常小於10。所以這個地方使用主鍵索引,效率更高。解決方法也就是這地方需要force index強制走primary index。
擴充套件分庫分表後的索引
為什麼題目叫分庫分表後的索引問題的,直接原因和分庫分表並沒有什麼關係啊?
因為在排查問題時,犯了乙個錯誤。以為路由到具體的brandgood_0020表後,可以直接根據brandgoodid主鍵索引來查詢了。認為和一些分布式資料庫(cassandra)一樣,是clustering key+partition key這種索引資料。可以根據clustering key到資料的節點的partition塊,然後根據local index 找到對應的資料。
但其實mysql的分庫分表不一樣,分表鍵不是索引,只是客戶端路由。只負責找到對應的表。到表以後,就是和單錶一樣查詢邏輯。
因為分表鍵不是索引,但是查詢語句是必須要帶著分表鍵,那意味著我們的分庫分表以後的表索引大部分要建成聯合索引了,分表鍵+索引鍵。
要不然我們的查詢語句 select xx from table where 分表鍵=*** and a =***,是走不了聯合索引的。只能走單索引。單索引mysql server要面臨著索引選擇的問題。
當然並不是絕對的,比如上面我舉的那個案例。按照這個思路檢視了下其他的分表索引。果然表上的大部分索引都是非聯合索引,還是直接從單錶copy過來的索引。這些索引基本上都是無用的,因為都的是userid索引.
索引選擇的問題
我們這個案例是因為判斷掃瞄行數的時候出問題了。
原文:
mysql分表後怎麼索引 分庫分表後的索引問題
摘要 最近遇到乙個慢sql,在排查過程中發現和分庫分表後的索引設定有關係,總結了下問題。問題在進行應用健康度盤點時,發現有個慢sql 如下 select brandgoodid from brandgood 0020 where userid and brandgoodid in 1 2 表結構,按...
mysql分表分庫實現 MySql分表分庫思路
一.資料庫瓶頸 1.1io瓶頸 第一種 磁碟讀io瓶頸,熱點資料太多,資料庫快取放不下,每次查詢時會產生大量的io 分庫和垂直分表 第二種 網路io瓶頸,請求的資料太多,網路頻寬不夠 分庫 1.2cpu瓶頸 第一種 sql問題,如sql中包含join,group by,order by,非索引字段條...
MySQL範圍分表分庫 mysql 分表分庫策略
唯一id的生成 下面列舉幾種常見的唯一id生成方案,需要滿足兩大核心需求 1.全域性唯一 2趨勢有序 1.用資料庫的auto increment 自增id 來生成,每次通過寫入資料庫一條記錄,利用資料庫id自增的特性獲取唯一,有序的id。優點 使用資料庫原有的功能,相對簡單 能夠保證唯一 能夠保證遞...