第二彈:數(shù)據(jù)類型與索引

7、數(shù)據(jù)類型

  • 整數(shù)類型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
  • 浮點數(shù)類型:FLOAT、DOUBLE、DECIMAL
  • 字符串類型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
  • 日期類型:Date、DateTime、TimeStamp、Time、Year
  • 其他數(shù)據(jù)類型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等

8、字符串(char,varchar,_text)

  • char類型存儲的字符串末尾不能有空格,varchar不限于此。
  • char(n) 固定長度,char(4)不管是存入幾個字符,都將占用4個字節(jié)
  • varchar是存入的實際字符數(shù)+1個字節(jié)(n<=255)或2個字節(jié)(n>255)
  • char類型的字符串檢索速度要比varchar類型的快
  • text類型不能有默認值,索引不起作用
  • BLOB 保存二進制數(shù)據(jù),TEXT 保存字符數(shù)據(jù)。
MySQL數(shù)據(jù)類型 含義
date 日期 '2020-05-09'
time 時間 '23:59:59'
datetime 日期時間 '2020-05-09 23:59:59'
timestamp 自動存儲記錄修改時間
數(shù)據(jù)類型 字節(jié)長度 范圍或用法
Bit 1 無符號[0,255],有符號[-128,127]
TinyInt 1 整數(shù)[0,255]
SmallInt 2 無符號[0,65535],有符號[-32768,32767]
MediumInt 3 無符號[0,224-1],有符號[-223,2^23-1]]
Int 4 無符號[0,232-1],有符號[-231,2^31-1]
BigInt 8 無符號[0,264-1],有符號[-263 ,2^63 -1]
Float(M,D) 4 單精度浮點數(shù)。D是精度,如果D<=24則為默認的FLOAT,如果D>24則會自動被轉換為DOUBLE型。
Double(M,D) 8 雙精度浮點。
Decimal(M,D) M+1或M+2 未打包的浮點數(shù),用法類似于FLOAT和DOUBLE,

9、索引

幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結構
目的:提高查詢效率
索引本身一般以索引文件的形式存儲在磁盤上

# 創(chuàng)建索引
CREATE INDEX indexName ON mytable(username(length)); 

# 修改表結構創(chuàng)建索引
ALTER table tableName ADD INDEX indexName(columnName)

# 唯一索引
CREATE UNIQUE INDEX indexName ON mytable(username(length)); 
## 有四種方式來添加數(shù)據(jù)表的索引:

ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句創(chuàng)建索引的值必須是唯一的(除了NULL外,NULL可能會出現(xiàn)多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出現(xiàn)多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引為 FULLTEXT ,用于全文索引。

# 刪除索引
DROP INDEX [indexName] ON mytable; 
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

10、索引結構

索引是在存儲引擎中實現(xiàn)的,InnoDB默認為B+Tree樹
主鍵索引:InnoDB的數(shù)據(jù)文件本身就是主鍵索引文件,被稱為“聚簇索引”,一個表只能有一個聚簇索引。

輔助索引:非主鍵索引接口的葉子節(jié)點存儲的是主鍵值

hash索引:底層是hash表,是一種key-value的存儲結構,無序,查詢時造成全表掃描;不支持最左匹配原則,大量鍵值重復時,造成hash碰撞,索引效率低

full-text全文索引:用于全文索引,替代效率較低的LIKE模糊匹配操作。

R-tree空間索引:用于地理空間數(shù)據(jù)類型

B樹與B+樹

B樹的每個節(jié)點都存儲數(shù)據(jù),而B+樹只有葉子節(jié)點才存儲數(shù)據(jù),所以查找相同數(shù)據(jù)量的情況下,B樹的高度更高,IO更頻繁。
同時,MySQL底層對B+樹進行進一步優(yōu)化:在葉子節(jié)點中是雙向鏈表,且在鏈表的頭結點和尾節(jié)點也是循環(huán)指向的。

回表操作:
在輔助索引上檢索name,到達其葉子節(jié)點獲取對應的主鍵;
使用主鍵在主索引上再進行對應的檢索操作
后續(xù)文章會有專文詳解B樹、B+Tree和B-Tree樹

11、索引使用條件

需要索引時:

  • 主鍵自動建立唯一索引
  • 頻繁作為查詢條件的字段
  • 查詢中與其他表關聯(lián)的字段,外鍵關系建立索引
  • 單鍵/組合索引的選擇問題,高并發(fā)下傾向創(chuàng)建組合索引
  • 查詢中排序的字段,排序字段通過索引訪問大幅提高排序速度
  • 查詢中統(tǒng)計或分組字段

不需要索引情況時:

  • 表記錄太少
  • 經(jīng)常增刪改的表
  • 數(shù)據(jù)重復且分布均勻的表字段,只應該為最經(jīng)常查詢和最經(jīng)常排序的數(shù)據(jù)列建立索引(如果某個數(shù)據(jù)類包含太多的重復數(shù)據(jù),建立索引沒有太大意義)
  • 頻繁更新的字段不適合創(chuàng)建索引(會加重IO負擔)
  • where條件里用不到的字段不創(chuàng)建索引
**高效索引--覆蓋索引
查詢列要被所建的索引覆蓋,不需要進行回表操作。   
** 索引的最左匹配原則成因:
最左優(yōu)先,以最左邊的為起點任何連續(xù)的索引都能匹配上。同時遇到范圍查詢(>、<、between、like)就會停止匹配。
**索引是建立的越多越好嗎?
數(shù)據(jù)量小的表不需要建立索引,增加索引會產(chǎn)生額外的開銷
數(shù)據(jù)變更需要維護索引,更多的索引需要占用更多的資源
更多索引需要更多的空間   
**為什么要使用索引?   
避免全表掃描,提升檢索效率
**什么樣的信息能成為索引?   
主鍵、唯一鍵和普通鍵   
**索引的數(shù)據(jù)結構?   
二叉查找樹建立二分查找
B-樹、B+樹、Hash結構
**密集索引和稀疏索引和區(qū)別?   
密集索引每個搜索碼都對應一個索引項
稀疏索引只為部分搜索碼建立索引項
rose
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容