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