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