MySQL 索引使用有哪些注意事項呢?
可以從兩個維度回答這個問題:
- 索引哪些情況會失效,
- 索引不適合哪些場景
索引哪些情況會失效
- 查詢條件包含or,會導致索引失效。
- 隱式類型轉換,會導致索引失效,
例如age字段類型是int,我們where age = “1”,這樣就會觸發隱式類型轉換(int轉成string)。
- like通配符會導致索引失效。
注意:"ABC%“會走range索引,”%ABC"索引才會失效。
- 聯合索引,查詢時的條件列不是聯合索引中的第一個列,索引失效。
- 對索引字段進行函數運算。
對索引列運算(如,+、-、*、/),索引失效。
索引字段上使用(!= 或者 < >,not in)時,會導致索引失效。
索引字段上使用is null, is not null,可能導致索引失效。 - 相join的兩個表的字符編碼不同,不能命中索引,會導致笛卡爾積的循環計算
- mysql估計使用全表掃描要比使用索引快,則不使用索引。
索引不適合哪些場景
- 數據量少的不適合加索引
- 更新比較頻繁的也不適合加索引
- 離散性低的字段不適合加索引(如性別)
MySQL 遇到過死鎖問題嗎,你是如何解決的?
排查死鎖的步驟:
查看死鎖日志
show engine innodb status;
找出死鎖Sql
分析sql加鎖情況
模擬死鎖案發
分析死鎖日志
分析死鎖結果
日常工作中你是怎么優化SQL的?
可以從這幾個維度回答這個問題:
- 加索引
- 避免返回不必要的數據
- 適當分批量進行
- 優化sql結構
- 主從架構,提升讀性能
- 分庫分表
分庫分表的設計
分庫分表方案,分庫分表中間件,分庫分表可能遇到的問題
分庫分表方案
水平分庫:以字段為依據,按照一定策略(hash、range等),將一個庫中的數據拆分到多個庫中。
水平分表:以字段為依據,按照一定策略(hash、range等),將一個表中的數據拆分到多個表中。
垂直分庫:以表為依據,按照業務歸屬不同,將不同的表拆分到不同的庫中。
垂直分表:以字段為依據,按照字段的活躍性,將表中字段拆到不同的表(主表和擴展表)中。
常用的分庫分表中間件
- sharding-jdbc
- Mycat
分庫分表可能遇到的問題
- 事務問題:需要用分布式事務啦
- 跨節點Join的問題:解決這一問題可以分兩次查詢實現
- 跨節點的count,order by,group by以及聚合函數問題:分別在各個節點上得到結果后在應用程序端進行合并。
- 數據遷移,容量規劃,擴容等問題
- ID問題:數據庫被切分后,不能再依賴數據庫自身的主鍵生成機制啦,最簡單可以考慮UUID
- 跨分片的排序分頁問題(后臺加大pagesize處理?)