MySQL編程 基礎篇(一)EXPLAIN + SQL編程 + 數據類型

目錄

explain執行計劃

字段說明

select_type

type:Join Types

Extra Information

sql編程

數據類型


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類型數據列前一部分數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章