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 選擇伺服器版本,而不是桌面版本。核...