mysql 进阶_mysql进阶知识
一.存儲引擎
引擎 指的是一個系統(tǒng)的核心部分
引擎有不同分類是為了適應(yīng)不同的使用場景
查看mysql支持所有引擎
show engines;
MRG_MYISAM 是一堆MYISAM表的集合
用于做水平分表,如果一個表中數(shù)據(jù)量太大 將導(dǎo)致效率降低
水平分表就是把整個大表拆成不同的小表,每一次查詢 會判斷數(shù)據(jù)在哪一個表中 然后對應(yīng)去查找 以此來提高效率
name age sex
jerry 40 woman
name age sex
bgon 30 man
垂直分表
name age sex phone addr gf bf idcard number
jerry 40 woman 110 上海 xx xx 身份證 學(xué)號
當(dāng)一個表中 字段太多 然而常用的信息就那么一兩個 那就可以把不常用字段 切到另一個表中 然后建立關(guān)聯(lián)關(guān)系
innodb 是最最常用的引擎 因為支持 事務(wù) 行鎖 外鍵一系列功能....
MyISAM 沒有上述一堆功能 但是 存儲效率比innodb要高 并且支持分表
MEMORY 速度快 不能永久存儲 沒有特別的功能
二.詳細建表語句
[]表示可選
create table 名稱(字段 類型[(寬度) 約束條件],字段 類型,......)
三.mysql數(shù)據(jù)類型
為什么要給數(shù)據(jù)分類?
1.不同的數(shù)據(jù)類型 描述信息可以更加方便準(zhǔn)確
2.在計算機中對數(shù)據(jù)分類可以減少內(nèi)存開銷
1.數(shù)字
整型 默認(rèn)都是有符號的
tinyint 1個字節(jié) 8個二進制 0-255 -128 - 127
smallint 2個字
mediumint 3個字節(jié)
int 4個字節(jié)
bigint 8個字節(jié)
設(shè)置為無符號 需要在類型后添加unsigned
create table t8(a tinyint unsigned);
寬度在整型數(shù)據(jù)中 不是用來設(shè)置可存儲的數(shù)據(jù)范圍的
用于控制最先小顯示長度(字符數(shù)) 如果長度不足 就幫你補0 但是需要指定zerofill
create table t12(a tinyint(5) zerofill);
結(jié)論是: 使用整型數(shù)據(jù) 寬度這個屬性一般不用管它
浮點
float 4個字節(jié)
float(a,b)
double 8個字節(jié)
double(a,b)
decimal 不固定
decimal(a,b)
a代表總位數(shù) b表示小數(shù)位數(shù)
5,3 最大值99.999
共同點: 小數(shù)位最大為30
float與double總長最大為255
都是不精確的 double比float精確點
不同點:
decimal總長最大為65 并且是精確的
2.字符串
char固定長度 和 varchar 可變長度
char(L) varchar(L)
L 都是表示最大可存儲的長度 不是字節(jié)
a char(4) b varchar(4)
a:S 最終還是占4個字符長度
b:S 最終占1個字符長度 + 標(biāo)識信息的長度(1-2字節(jié))
S S S
如果有三個數(shù)據(jù)要存 每個數(shù)據(jù)都是一個s字符 最終3 * 4 12個字符長度
占用空間較多 存取速度較快
1S1S1S varchar 存儲時必須保存一個長度標(biāo)識信息 所以所占空間為實際內(nèi)容長度+標(biāo)識信息長度
相比較char 空間節(jié)省了 但是效率降低了
char采取的空間換時間 提高效率
字符串類型的BUG 由于char類型是定長 mysql會在末尾填充空格來達到定長的效果
所以char類型 不能存儲末尾帶有空格的數(shù)據(jù) 會直接把空格給去了
固定長度的字符串類型 不常用
tinytext 1字符
text 2字符
mediumtext 3字符
longtext 4字符
3.二進制數(shù)據(jù)類型 單位都是字節(jié)
binary varbinary
binary是固定長度的二進制
varbinary 可變長度的二進制
長度固定無法修改的二進制
tinyblob
blob
mediumblob
longblob
強調(diào):
二進制數(shù)據(jù)類型 一般不用 如果要存儲多媒體 如 音頻 視頻
需要將其放到FTP文件服務(wù)器上 然后數(shù)據(jù)庫中只存儲連接即可
4.時間類型
year 4為年份
date 日期 yyyy-MM-DD
time 時間 HH:mm:SS
datetime yyyy-MM-DD HH:mm:SS
timestamp 時間戳 一個浮點類型 從unix元年到現(xiàn)在的秒數(shù)
year 可以是數(shù)字 也可以是字符串
可以用四位字符串 也可以2位字符 或數(shù)字
00-69 == 2001-2069
70-99 == 1970 - 1999
甭管什么時間類型 照著標(biāo)準(zhǔn)格式字符串寫 就行
timestamp 會自動更新時間 當(dāng)你插入時 或修改時
current_time 和 now() 所有的時間 日期類型 都可以使用這兩個方法來輸入當(dāng)前時間
所有的日期時間 數(shù)據(jù)庫返回的都是字符串類型
嚴(yán)格模式
5.7以下的版本 默認(rèn)是非嚴(yán)格模式的 例如你的類型為tinyint 存儲的是128 最終存儲的是127
set global sql_mode = "strict_trans_tables" 可以將其設(shè)置為嚴(yán)格模式
最好寫到配置文件中 永久有效
enum 提前規(guī)定該字段能選的值的范圍 多選1
set 提前規(guī)定該字段能選的值的范圍 區(qū)別是 set字段 可以有多個值 用逗號隔開 多選多
數(shù)據(jù)庫范式
就是指導(dǎo)你該如何設(shè)計數(shù)據(jù)庫
數(shù)據(jù)類型 整型 int 浮點 float-double decimal 字符串 char varchar 時間-日期 枚舉-集合 二進制
在保證數(shù)據(jù)足夠保存情況下 選用占用空間最小的類型
四.約束
完整的建表語句
create table 名稱(字段 類型[(寬度) 約束條件],字段 類型,......)
約束 是指 給數(shù)據(jù)的值加上一些限制
類型就是一種限制 寬度對于整型數(shù)據(jù) 沒有存儲限制 其他類型的寬度是有限制作用的
約束就是除了 數(shù)據(jù)類型以及寬度之外的其他限制
unsigned就是約束中第一種 表示你的整數(shù) 不能包含符號 僅針對數(shù)字類型
約束 是為了保證數(shù)據(jù)的完整性
完整性約束
not null 非空
限制該字段 必須有值
例如賬號密碼
default 默認(rèn)值
例如 多數(shù)用戶都是男的 游戲賬號的金幣可以默認(rèn)
1.建表直接指定
create table t(name char(10) not null default 默認(rèn)值);
2.后期增加約束
alter table t modify name char(10) not null default 已有的字段
alter table t add sex char(10) not null default 新增字段
unique 唯一性約束 并且是一個索引
要求該字段的值 不能重復(fù)
單字段:
create table olbPerson(name char(20) unique,school char(10));
多字段聯(lián)合唯一約束
create table olbPerson(name char(20),school char(10), unique(name,school));
例如:姓名和校區(qū)兩個字段 如果兩個校區(qū)有相同的姓名 這時候就可以把這兩個字段作為聯(lián)合唯一索引
這些字段都相同才算是重復(fù)
primary key 主鍵約束
從約束角度來看 和 非空 + 唯一 是相同的效果
不能為空且不能重復(fù)
需要強調(diào)的是:
主鍵除了有約束的效果 還是一個索引 并且是非常重要的索引
在該innodb 主鍵是必不可少的
innodb 組織數(shù)據(jù)結(jié)構(gòu)是按照樹形結(jié)構(gòu)來組織的,該結(jié)構(gòu)中 必須有一個數(shù)據(jù) 不能為空且唯一的
如果沒有這樣的數(shù)據(jù) 樹形結(jié)構(gòu)也就不存在.
mysql在創(chuàng)建表的時候 會檢測 是否存在主鍵
如果沒有 它就找一個具有非空且唯一約束的字段提升為主鍵
如果也沒有這樣的字段 mysql就創(chuàng)建一個隱藏字段作為主鍵
索引 可以提高查詢速度
結(jié)論是: 只要你是用innodb引擎 你就應(yīng)該建表時設(shè)置一個主鍵 通常主鍵字段叫做id
id 有唯一標(biāo)識的意思
索引 就像是 字典里目錄 用于快速定位數(shù)據(jù)所在位置
自動增長
主鍵在使用中 需要我們自己來維護 其正確性 你需要知道上一次寫的是什么 然后找一個之前沒用過的主鍵
mysql 提高了自動增長約束 可以幫你自動管理主鍵的值
要求必須是整型,每次插入數(shù)據(jù)都會自動+1 程序中就不要再自己管理主鍵了
語法:
create table table_name(id int primary key auto_increment,name char(10));
# 插入帶有自動增長的字段時 可以直接忽略該字段 也可以插入一個null
insert into table_name values(null,"jack");
insert into table_name(name) values("jack");
只要你創(chuàng)建一個表 就應(yīng)該有主鍵 并且自動增長.
foreign key 外鍵約束
總結(jié)
以上是生活随笔為你收集整理的mysql 进阶_mysql进阶知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net授权获取openid_Asp.N
- 下一篇: mysql buffer_mysql r