1 常見數(shù)據(jù)類型與字符集
1.1 數(shù)據(jù)類型
1.1.1 char與varchar
char與varchar類型類似,但保存和檢索的方式不同,最大長度與是否空格被保留也不同,在存儲過程中不進(jìn)行大小寫轉(zhuǎn)換
1.1.2 text與blob
一些注意事項:
1)執(zhí)行大量的刪除或更新操作,刪除數(shù)據(jù)后會產(chǎn)生很大的“空洞”,為提升性能,需定期使用OPTIMIZE TABLE進(jìn)行碎片整理
2)使用合成的索引,可根據(jù)其他列的內(nèi)容建立散列值,并單獨存放在數(shù)據(jù)列中,僅用于精確匹配的查詢,可用MD5函數(shù)生成散列值,或者SHA1或
CRC32,注意尾部帶有空格生成算法的不能存儲在CHAR或VARCAHR列中,會受到尾部去除的影響
3)避免檢索大量的blob和text值,減少在網(wǎng)絡(luò)上傳輸大量的數(shù)據(jù)
4)把blob與text分離到單表,可將原表的數(shù)據(jù)列轉(zhuǎn)換成定長的數(shù)據(jù)行格式,減少主表的碎片,獲得性能優(yōu)勢
1.1.3 浮點數(shù)與定點數(shù)
浮點數(shù):float、double
定點數(shù):decimal
注:
1、浮點數(shù)會存在誤差問題
2、貨幣等敏感數(shù)據(jù)應(yīng)使用定點數(shù)存儲
3、避免使用浮點數(shù)進(jìn)行比較
4、注意浮點數(shù)一些特殊值的處理
1.2 字符集
1.2.1 支持的字符集
MySQL支持多種字符集,可在同一臺服務(wù)器、同一個數(shù)據(jù)庫,甚至同一個表的不同字段指定不同的字符集,有較強(qiáng)的靈活性
MySQL字符集包括了字符集(CHARACTER)和校對規(guī)則(COLLATION)兩個概念,字符集定義存儲字符串的方式,校對規(guī)則定義比較字符串的方式,字符集和校對規(guī)則是一對多的關(guān)系
1.2.2 Unicode規(guī)范
Unicode是一種編碼規(guī)范,類似ASCII碼,由國際組織設(shè)計,可容納全世界所有語言文字的編碼方案,Unicode有兩套標(biāo)準(zhǔn),UCS-2和USC-4,前者2個字節(jié)表示一個字符,后者4個字節(jié)表示一個字符
1.2.3 字符集設(shè)置
可以在 my.cnf 中設(shè)置:
[mysqld]
default-character-set=utf8
或者在啟動選項中指定:
mysqld --default-character-set=utf8
或者在編譯的時候指定:
./configure --with-charset=utf8
不設(shè)置默認(rèn)會使用latin1作為服務(wù)器字符集,不指定校對規(guī)則會使用默認(rèn)的校對規(guī)則
字符集的校對規(guī)則以字符集名稱開頭,以_ci
(不區(qū)分大小寫)_cs
(區(qū)分大小寫)或_bin
(二進(jìn)制文件)結(jié)尾
2 數(shù)據(jù)庫DDL操作
DDL(Data Definition Language):數(shù)據(jù)定義語言DDL用來創(chuàng)建數(shù)據(jù)庫中的各種對象——-表、視圖、索引、同義詞、聚簇等。關(guān)鍵字主要包括CREATE、DROP、ALTER(/VIEW/INDEX/SYN/CLUSTER)等。
DDL操作是隱性提交的,不能rollback
2.1 庫相關(guān)
2.1.1 建庫
mysql> CREATE DATABASE IF NOT EXISTS TEST DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
2.1.2 刪除庫
mysql> DROP DATABASE IF EXISTS TEST;
2.2 表相關(guān)
2.2.1 表創(chuàng)建
mysql> CREATE TABLE IF NOT EXISTS `tb`(
? ?`runoob_id` INT UNSIGNED AUTO_INCREMENT,
? ?`runoob_title` VARCHAR(100) NOT NULL,
? ?`runoob_author` VARCHAR(40) NOT NULL,
? ?`submission_date` DATE,
? ?PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.2.2 表修改
- 修改表名
-
mysql> ALTER TABLE tb RENAME tb_new;
?
3 表碎片整理
3.1 簡介
InnoDB表數(shù)據(jù)存儲在頁中,每個頁存放多條記錄,這些記錄以樹形結(jié)構(gòu)組織,稱為B+樹
聚集索引的葉子節(jié)點包含行中所有字段的值,輔助索引的葉子節(jié)點包含索引列和主鍵列
在InnoDB中,刪除行行為只是被標(biāo)記成已刪除,MySQL會通過Purge線程異步清理未用的索引鍵與行,但不會把釋放出來的空間繼續(xù)交由操作系統(tǒng)分配,導(dǎo)致頁面存在很多空洞
刪除數(shù)據(jù)會導(dǎo)致頁page出現(xiàn)空白空間,大量隨機(jī)的Delete操作必然在數(shù)據(jù)文件中造成不連續(xù)的空白空間,插入數(shù)據(jù)時,空白空間會被利用起來,造成了數(shù)據(jù)物理存儲順序與邏輯順序不同,稱之?dāng)?shù)據(jù)碎片