mysql分表後怎麼索引 分庫分表後的索引問題

2021-10-19 19:11:08 字數 1832 閱讀 1712

摘要

最近遇到乙個慢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。優點 使用資料庫原有的功能,相對簡單 能夠保證唯一 能夠保證遞...