mysql優化積累 持續更新中

2021-10-06 09:36:21 字數 2566 閱讀 3068

大表資料查詢

主從複製

讀寫分離

垂直拆分

水平切分

資料庫設計和查詢原則:

盡量設定主鍵

推薦使用自增id,不要使用uuid

字段定義為not null而不是null

密碼雜湊,鹽,使用者身份證號等固定長度的字串應該使用char而不是varchar來儲存,這樣可以節省空間且提高檢索效率。

避免犯如下sql語句錯誤

查詢不需要的資料。解決辦法:使用limit解決

多表關聯返回全部列。解決辦法:指定列名

總是返回全部列。解決辦法:避免使用select *

重複查詢相同的資料。解決辦法:可以快取資料,下次直接讀取快取

是否在掃瞄額外的記錄。解決辦法:

使用explain進行分析,如果發現查詢需要掃瞄大量的資料,但只返回少數的行,可以通過如下技巧去優化:

使用索引覆蓋掃瞄,把所有的列都放到索引中,這樣儲存引擎不需要回表獲取對應行就可以返回結果。

改變資料庫和表的結構,修改資料表正規化

優化長難的查詢語句

一次性刪除1000萬的資料要比一次刪除1萬,暫停一會的方案更加損耗伺服器開銷。

分解關聯查詢,讓快取的效率更高。

執行單個查詢可以減少鎖的競爭。

count(*)會忽略所有的列,直接統計所有列數,不要使用count(列名)

myisam中,沒有任何where條件的count(*)非常快。

當有where條件時,myisam的count統計不一定比其它引擎快。

確定on或者using子句中是否有索引。

確保group by和order by只有乙個表中的列,這樣mysql才有可能使用索引。

優化group by和distinct

這兩種查詢據可以使用索引來優化,是最有效的優化方法

如果不需要order by,進行group by時加order by null,mysql不會再進行檔案排序。

limit偏移量大的時候,查詢效率較低

可以記錄上次查詢的最大id,下次查詢時直接根據該id來查詢

union all的效率高於union

應盡量避免在 where 子句中使用!=或<>操作符,否則引擎將放棄使用索引而進行全表掃瞄。

應盡量避免在 where 子句中使用or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃瞄,如:

select id from t where num=10 or num=20

-- 可以這樣查詢:

select id from t where num=10 union all select id from t where num=20

in 和 not in 也要慎用,否則會導致全表掃瞄,如:

select id from t where num in(1,2,3)

-- 對於連續的數值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

下面的查詢也將導致全表掃瞄:select id from t where name like 『%李%』若要提高效率,可以考慮全文檢索。

如果在 where 子句中使用引數,也會導致全表掃瞄。因為sql只有在執行時才會解析區域性變數,但優化程式不能將訪問計畫的選擇推遲到執行時;它必須在編譯時進行選擇。然 而,如果在編譯時建立訪問計畫,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃瞄:

select id from t where num=@num

-- 可以改為強制查詢使用索引:

select id from t with(index(索引名)) where num=@num

應盡量避免在 where 子句中對字段進行表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:

select id from t where num/2=100

-- 應改為:

select id from t where num=100*2

應盡量避免在where子句中對字段進行函式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:

select id from t where substring(name,1,3)=』abc』

-- name以abc開頭的id應改為:

select id from t where name like 『abc%』

不要在 where 子句中的「=」左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引。

沒有掌握的部分:

正規化是什麼意思?

超大分頁優化

explain就是在執行sql語句前面加個explain,mysql執行的時候會出乙個"執行分析"

慢查詢的優化首先要搞明白慢的原因是什麼?是查詢條件沒有命中索引?是load了不需要的資料列?還是資料量太大?

reference:

[1]mysql面試題-sql優化

mysql 大表優化 持續更新

單錶優化 除非單錶資料未來會一直不斷 否則不要一開始就考慮拆分,拆分會帶來邏輯 部署 運維的各種複雜度,一般以整型值為主的表在千萬級以下,字串為主的表在五百萬以下是沒有太大問題的。而事實上很多時候mysql單錶的效能依然有不少優化空間,甚至能正常支撐千萬級以上的資料量 字段 索引 查詢sql 總結 ...

mysql優化理解筆記(持續更新)

目前最常見的是innodb和myisam兩個儲存引擎 1 innodb 支援事務處理,提供行級鎖 外來鍵約束索引,行鎖 2 myisam 支援全文搜尋,表鎖 對於經常需要增刪改操作的表建議使用innodb,因為有事務處理 要麼成功要麼失敗回滾 而需要大量查詢操作的表建議用myisam 索引可以大大提...

SQL效能優化 持續更新中。。。。。。

1 通過rowid訪問表 索引 你可以採用基於rowid的訪問方式情況,提高訪問表的效率,rowid包含了表中記錄的物理位置資訊.oracle採用索引 index 實現了資料和存放資料的物理位置 rowid 之間的聯絡.通常索引提供了快速訪問rowid的方法,因此那些基於索引列的查詢就可以得到效能上...