no-image

MYSql 學習優化筆記

                                    

在學習MySql優化的時候的筆記:

常用優化

1: max()優化: 在相應列上新增索引
2: count()優化:count(*) 會算出包含null記錄的數量, count(field_name)只包含不含 null的數量(這也是很多時候兩種count方式結果不一致的原因), count()的時候儘量用後一種, count(null)返回0,即不會記錄null記錄數量
3: 子查詢優化=====》(改為)聯接查詢(如果1對多的關係,注意重複記錄)
4: group by優化 如果包含子查詢,在子查詢裡面使用where條件和group by過濾, 避免在複雜查詢的最外層使用group by(如果最外層使用會用到臨時表)
5: order by , limit 優化:

方式1:儘量使用主鍵或有索引的列order by;

方式2: 使用自增型的欄位: 記錄上一次返回的主鍵或者自增列(此種方式該欄位不能有空值,否則會出現有的頁面數量不足的問題, 解決的方式是新增附加的index_id, 自增且索引), 過濾時先用大於上一次主鍵值且小於上一次的主鍵值 每頁的數量, 過濾該欄位,然後order by 和limit

PS: 複合索引有效條件:

1: where 條件中依次過濾(最左字首)

2:排序時: 索引欄位有正有反的時候不能使用

3:排序時: 某列有範圍查詢的時候該列右側的欄位不能使用索引

優化的思路就是儘量避免掃描過多的記錄。

建立索引的原則:

1: where, order by ,group by, on從句中的欄位
2:索引欄位越小越好
3:聯合索引時把離散程度高的欄位放前面

表級優化

1: 表的正規化優化
2: 適當增減一些冗餘, 做反正規化優化(以空間換取時間)
3: 表的列非常多的時候使用垂直拆分
       原則:
       1: 把不常用的單獨欄位放到一個表中
       2: 把大欄位獨立存放到一個表中
       3: 把經常一起用的欄位放在一起
4: 表的資料量非常大的時候使用水平拆分
       方法:
       1: 根據某個欄位進行hash預算, 如果要拆分成5個表, 用取餘的方式取到0-4,分表保到相應的表中
       2: 針對不同的hashID把資料存到不同的表中
       問題:
       1: 跨分割槽查詢的問題
       2: 統計及後臺報表操作
       (前臺使用分表查詢, 後臺使用匯總表查詢做彙總報表操作).

冗餘索引檢查工具

pt-duplicate-key-checker \
-uroot \
-p '111111' \
-h localhost

以上是學習時的筆記,如有錯誤和補充,請不吝賜教

關聯文章