mysql優化學習

2021-09-29 07:45:54 字數 3214 閱讀 3573

2.大表拆小表

1、一般不會設計屬性過多的表

2、一般不會超過500到1000萬資料的表

3、有大資料的列單獨拆為小表

3.根據需求展示更加合理的表結構

4.常用屬性分離為小表

2、方法

3、建立

2、分類

3、隔離級別

2、latch《輕量級鎖,鎖的時間非常短,用來操作臨界資源》

3、一致性的非鎖定讀

4、一致性鎖定讀

5、死鎖

3、永遠用小結果集驅動大的結果集

4、在索引中完成排序

5、使用最小columns

6、使用最有效的過濾條件

7、避免複雜的join和子查詢

4、執行計畫與執行明細

1,explain:可以讓我們檢視mysql執行一條sql所選擇的執行計畫;

1,id:執行查詢的序列號;

2,select_type:使用的查詢型別

dependent subquery:子查詢中內層的第乙個select,依賴於外部查詢的結果集;

dependent union:子查詢中的union,且為union 中從第二個select 開始的後面所有select,同樣依賴於外部查詢的結果集;

primary:子查詢中的最外層查詢,注意並不是主鍵查詢;

******:除子查詢或者union 之外的其他查詢;

subquery:子查詢內層查詢的第乙個select,結果不依賴於外部查詢結果集;

uncacheable subquery:結果集無法快取的子查詢;

union:union 語句中第二個select 開始的後面所有select,第乙個select 為primary

union result:union 中的合併結果;

3,table:這次查詢訪問的資料表;

4,type:對錶所使用的訪問方式:

all:全表掃瞄

const:讀常量,且最多隻會有一條記錄匹配,由於是常量,所以實際上只需要讀一次;

eq_ref:最多隻會有一條匹配結果,一般是通過主鍵或者唯一鍵索引來訪問;

fulltext:全文檢索,針對full text索引列;

index:全索引掃瞄;

index_subquery:子查詢中的返回結果字段組合是乙個索引(或索引組合),但不是乙個主鍵或者唯一索引;

rang:索引範圍掃瞄;

ref:join 語句中被驅動表索引引用查詢;

ref_or_null:與ref 的唯一區別就是在使用索引引用查詢之外再增加乙個空值的查詢;

system:系統表,表中只有一行資料;

unique_subquery:子查詢中的返回結果字段組合是主鍵或者唯一約束;

5,possible_keys:可選的索引;如果沒有使用索引,為null;

6,key:最終選擇的索引;

7,key_len:被選擇的索引長度;

8,ref:過濾的方式,比如const(常量),column(join),func(某個函式);

9,rows:查詢優化器通過收集到的統計資訊估算出的查詢條數;

10,extra:查詢中每一步實現的額外細節資訊

distinct:查詢distinct 值,所以當mysql 找到了第一條匹配的結果後,將停止該值的查詢而轉為後面其他值的查詢;

full scan on null key:子查詢中的一種優化方式,主要在遇到無法通過索引訪問null值的使用使用;

impossible where noticed after reading const tables:mysql query optimizer 通過收集到的統計資訊判斷出不可能存在結果;

no tables:query 語句中使用from dual 或者不包含任何from 子句;

not exists:在某些左連線中mysql query optimizer 所通過改變原有query 的組成而使用的優化方法,可以部分減少資料訪問次數;

select tables optimized away:當我們使用某些聚合函式來訪問存在索引的某個欄位的時候,mysql query optimizer 會通過索引而直接一次定位到所需的資料行完成整個查詢。當然,前提是在query 中不能有group by 操作。如使用min

()或者max()的時候;

using filesort:當我們的query 中包含order by 操作,而且無法利用索引完成排序操作的時候,mysql query optimizer 不得不選擇相應的排序演算法來實現。

using index:所需要的資料只需要在index 即可全部獲得而不需要再到表中取資料;

using index for group-by:資料訪問和using index 一樣,所需資料只需要讀取索引即可,而當query 中使用了group by 或者distinct 子句的時候,如果分組欄位也在索引中,extra 中的資訊就會是using index for group-by;

using temporary:當mysql 在某些操作中必須使用臨時表的時候,在extra 資訊中就會出現using temporary 。主要常見於group by 和order by 等操作中。

using where:如果我們不是讀取表的所有資料,或者不是僅僅通過索引就可以獲取所有需要的資料,則會出現using where 資訊;

using where with pushed condition:這是乙個僅僅在ndbcluster 儲存引擎中才會出現的資訊,而且還需要通過開啟condition pushdown 優化功能才可能會被使用。控制引數為engine_condition_pushdown 。

2,profiling:可以用來準確定位一條sql的效能瓶頸;

1,開啟profiling:set profiling=1;

2,執行query,在profiling過程中所有的query都可以記錄下來;

3,檢視記錄的query:show profiles;

4,選擇要檢視的profile:show profile cpu, block io for query 6;

status是執行sql的詳細過程;

duration:執行的具體時間;

cpu_user:使用者cpu時間;

cpu_system:系統cpu時間;

block_ops_in:io輸入次數;

block_ops_out:io輸出次數;

profiling只對本次會話有效;

mysql優化學習筆記

定位執行效率低的sql語句 通過explain分析效率低的sql 通過show profile分析sql 通過trace分析優化器如何選擇執行計畫 確定問題,採取措施優化 匹配全值,條件所有列都在索引中而且是等值匹配 匹配值的範圍查詢,字段必須在索引中 匹配最左字首,復合索引只會根據最左列進行查詢 ...

MySQL優化 學習筆記(2)

資料庫設計 3nf 1.第一正規化 列欄位資訊不可再分割,關係型資料庫自然滿足。2.第二正規化 滿足第一正規化,完全依賴主鍵,既是無重複行資料,通常設定主鍵實現。3.第三正規化 滿足第二正規化,要求乙個資料庫表中不包含已在其它表中已包含的非主關鍵字資訊,減少冗餘。注意 有時候需要反第三正規化,有必要...

mysql效能優化學習筆記

數量比頻率更好 64位使用32位的伺服器版本 32位不能使用超過4g的內容,因此選擇的時候需要注意。myisam innodb cpu 64位的cpu執行64位的系統 高併發的場景,cpu數量比頻率重要 cpu密集型的場景和複雜sql則頻率越高越好 記憶體 i o 選擇伺服器版本,而不是桌面版本。核...