目錄
explain執行計劃
數據庫版本:SELECT VERSION() 5.7.18-log
官網:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
字段說明
字段 | 說明 |
---|---|
id | SQL執行的順序的標識,越大越先執行,如果說數字一樣大,那麼就從上往下依次執行 |
select_type | 查詢類型,如:simple,primary,union,derived,subquery等 |
table | 輸出行所引用的表的名稱,也可以是:union,derived,subquery |
partitions | 訪問的分區,沒有分區 null |
type | 聯接類型,system > const > eq_ref > ref > (fulltext > ref_or_null > index_merge > unique_subquery > index_subquery) > range > index >all |
possible_keys | 可能用到的索引 |
key | 實際使用的索引 |
key_len | 實際用到的索引長度,null會比not null長度多1 |
ref | 列或者常量被用於查找索引列上的值 |
rows | 必須檢查的用來返回請求數據的行數(估算值) |
filtered | 滿足查詢的記錄數量的比例 |
Extra | 處理查詢的額外信息 |
select_type
-
simple,簡單select,不使用union或子查詢
-
primary, 一個需要union操作或者含有子查詢的select,位於最外層的單位查詢的select_type即爲primary
-
union, union中的第二個或後面的SELECT語句
-
dependent union,union中的第二個或後面的SELECT語句,依賴外部查詢
-
union result,union的結果
-
subquery,子查詢
-
dependent subquery,相關子查詢,依賴外部查詢
-
derived,派生表,
-
materialized,具體化的子查詢
-
uncacheable subquery,子查詢,其結果無法緩存,必須針對外部查詢的每一行重新進行評估
-
uncacheable union,結果無法緩存
-
...
type:Join Types
-
system,表只有一行,const的特殊情況
-
const,使用主鍵和唯一索引時,返回一行記錄;很快,只讀取一次數據
-
eq_ref,多表連接使用主鍵或者唯一索引作爲關聯條件
-
ref, 查找非唯一性索引,返回匹配某一條件的多條數據。屬於精確查找、數據返回可能是多條
-
range,索引的範圍掃描
-
index,全索引掃描
-
all,全表掃描
-
...
Extra Information
-
Impossible WHERE ,where子句始終爲false,查詢不到任何行
-
Distinct,一旦找到了與行相聯合匹配的行,就不再搜索了
-
Using filesort,需要進行額外的步驟來對返回行排序,常見於order by和group by語句中
-
Using index,不需要回表查詢,直接通過索引就可以獲得查詢的數據
-
Using join buffer (Block Nested Loop),Using join buffer (Batched Key Access) ,優化關聯查詢的兩個算法,主要是減少內表的循環次數以及比較順序地掃描查詢
-
Using MRR,使用到了 Multi-Range Read 優化策略,查詢輔助索引時,對查詢結果按照主鍵進行排序,再查詢聚集索引。目的是將隨機訪問轉化爲較爲順序的順序訪問
-
Using temporary ,需要使用到臨時表存儲中間結果,常用於group by和order by
-
Using where,使用到了where過濾條件
摘自官網:
摘自網絡:
Extra中看到了Using where,代表是按照where條件進行了過濾,和是否走索引、回表無必然的關係。 只有在使用了索引,且Extra是Using where的情況下,才代表回表查詢數據。 還有一種情況,Extra中是using index & using where,表示select的數據在索引中能找到,但需要根據where條件過濾,這種情況也不回表。
-
..
sql編程
1. 簡單來說,MySQL數據庫的發展可以概括爲三個階段:
-
初期開源數據庫階段
-
Sun MySQL階段
-
Oracle MySQL階段
2. 一般來說,可將數據庫的應用類型分爲 OLTP(OnLine Transaction Processing ,聯機事務處理) 和 OLAP(OnLine Analysis Processing,聯機分析處理) 兩種
-
OLTP主要執行基本的、日常的事務處理,比如在銀行存取一筆款,就是一個事務交易
-
OLAP是數據倉庫系統的主要應用,其典型的應用就是複雜的動態報表系統
-
衡量OLTP系統的一個重要性能指標是 系統性能 ,具體體現爲實時響應時間(Response Time),即從用戶在終端輸入數據到計算機對這個請求做出回覆所需的時間
3. MySQL數據庫組成
5. InnoDB存儲引擎
關於InnoDB存儲引擎的技術詳情,可以參見我的博客:https://blog.csdn.net/qq_41541619/article/details/100777058
這裏就只是簡單地說一下!
-
支持事務,其設計目標主要面向聯機事務處理(OLTP)的應用
-
其特點是行鎖設計、支持外鍵,並支持類似Oracle的非鎖定讀,即默認讀取操作不會產生鎖
-
從MySQL 5.5.8版本開始是默認的存儲引擎
-
表空間、多版本併發控制(MVCC)(插入緩衝、二次寫、自適應哈希索引、預讀)、以聚集的方式存儲數據
數據類型
摘取是一些我認爲重要的知識點!
1. 如果一個頁內可以存放盡可能多的行,那麼數據庫的性能就越好,因此選擇一個正確的數據類型至關重要。
2. UNSIGNED屬性
-
UNSIGNED屬性就是將數字類型無符號化
例如,INT的類型範圍是-2147483648~2147483647, INT UNSIGNED的範圍類型就是0~4294967295
-
在MySQL數據庫中,對於UNSIGNED數的操作,其返回值都是UNSIGNED的
-
儘量不要使用UNSIGNED,因爲可能會帶來一些意想不到的效果。另外,對於INT類型可能存放不了的數據,INT UNSIGNED同樣可能存放不了,與其如此,還不如在數據庫設計階段將INT類型提升爲BIGINT類型
3. ZEROFILL屬性
可以看到int(10),這代表什麼意思呢?整型不就是4字節的嗎?這10又代表什麼呢?其實如果沒有ZEROFILL這個屬性,括號內的數字是毫無意義的。
ZEROFILL屬性的作用,如果寬度小於設定的寬度(這裏的寬度爲4),則自動填充0。要注意的是,這只是最後顯示的結果,在MySQL中實際存儲的還是1。
ZEROFILL可以格式化顯示整型,一旦啓用ZEROFILL屬性,MySQL數據庫爲列自動添加UNSIGNED屬性。
4. 數據類型
MySQL數據庫支持兩種浮點類型:單精度的FLOAT類型及雙精度的DOUBLE PRECISION類型。
這兩種類型都是非精確的類型,經過一些操作後並不能保證運算的正確性,例如 M*G/G不一定等於M 。
DECIMAL和NUMERIC類型在MySQL中被視爲相同的類型,用於保存必須爲確切精度的值。
位類型,即BIT數據類型可用來保存位字段的值。BIT(M)類型表示允許存儲M位數值,M範圍爲1到64,佔用的空間爲(M+7)/8字節。
5. Unicode字符編碼
Unicode是一種在計算機上使用的字符編碼。它爲每種語言中的每個字符設定了統一且唯一的二進制編碼,以滿足跨語言和跨平臺進行文本轉換和處理的要求。
需要注意的是,Unicode是字符編碼,不是字符集。
Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。Unicode用數字0~0x10FFFF來映射這些字符,最多可以容納1114112個字符,或者說有1114112個碼位。碼位就是可以分配給字符的數字。utf8、utf16和utf32都是將數字轉換到程序數據的編碼方案。
對於Unicode編碼的字符集,強烈建議將所有的CHAR字段設置爲VARCHAR字段,因爲對於CHAR字段,數據庫會保存最大可能的字節數。
有一些常用的命名規則。如:
_ci結尾表示大小寫不敏感(case insensitive
_cs表示大小寫敏感(case sensitive)
_bin表示二進制的比較(binary)。
utf8字符集默認的排序規則是utf8_general_ci。
6. CHAR 和 VARCHAR(★)
CHAR(N)和VARCHAR(N)中的N都代表字符長度,而非字節長度。
對於CHAR類型的字符串,MySQL數據庫會自動對存儲列的右邊進行填充(Right Padded)操作,直到字符串達到指定的長度N。而在讀取該列時,MySQL數據庫會自動將填充的字符刪除。
LENGTH函數返回的是字節長度,而不是字符長度。
對於多字節字符集,CHAR(N)長度的列最多可佔用的字節數爲該字符集單字符最大佔用字節數*N。
gbk字符集中的中文字符佔用兩個字節。
VARCHAR類型存儲變長字段的字符類型,與CHAR類型不同的是,其存儲時需要在前綴長度列表加上實際存儲的字符,該字符佔用1~2字節的空間。當存儲的字符串長度小於255字節時,其需要1字節的空間,當大於255字節時,需要2字節的空間。
對於有些多字節的字符集類型,其CHAR和VARCHAR在存儲方法上是一樣的,同樣需要爲長度列表加上字符串的值。對於GBK和UTF-8這些字符類型,其有些字符是以1字節存放的,有些字符是按2或3字節存放的,因此同樣需要1~2字節的空間來存儲字符的長度。
BINARY(N)和VARBINARY(N)中的N指的是字節長度,而非CHAR(N)和VARCHAR(N)中的字符長度。
7. 行溢出數據
沒有詳說,具體的可以參看我的另外一篇博客:https://blog.csdn.net/qq_41541619/article/details/101552096#4.3.2%20%E8%A1%8C%E6%BA%A2%E5%87%BA%E6%95%B0%E6%8D%AE
在數據庫中,最小的存儲單元是頁(也可以稱爲塊)。爲了有效存儲列類型爲BLOB或TEXT的大數據類型,一般將列的值存放在行溢出頁,而數據頁存儲的行數據只包含BLOB或TEXT類型數據列前一部分數據。