《深入淺出MySQL》
存儲引擎的選擇
MyISAM
- 特性:
- 不支持事務
- 不支持外鍵
- 優點:
- 訪問速度快,對事物完整性沒有要求或者以SELECT、INSERT爲主的可以使用
InnoDB
- 自動增長列
- 外鍵約束
- RESTRICT:字表存在記錄,限制父表更新
- NO ACTION:同上
- CASCADE:父表執行更新或者刪除操作時,字表執行同樣動作
- SET NULL:父表執行更新或者刪除操作時,字表把對應字段設爲null
- 存儲方式
- 使用共享空間存儲
- 使用多表空間存儲
MEMORY
- 數據存儲在內存中
- 訪問速度快默認使用HASH索引
- 服務關閉,數據就會丟失
選擇合適的數據類型
char與varchar
- char:固定長度字符類型
- varchar:可變長度字符類型
- 對於即將存儲的數據尾部存在空格的,char將刪除尾部空格,varchar將保留空格
浮點數與定點數
- 在數據庫存儲浮點數時存在精度損失,會四捨五入
- 定點數存儲準確,用於貨幣存儲
tinyInt(1)、smallint(2)等,代表什麼意思?
Storage (Bytes)表示所佔的字節數,1字節=8位;
tinyInt允許存儲的最大的有符號數字是:2=256;無符號爲256/2 = 128;其他類型以此類推
日期類型選擇
- 對於
datetime
和timestemp
,優先使用datetime
,timestemp
到2038年就不可以用了 - 若應用存在多時區,使用
timestemp
MySQL字符集設置
- MySQL的字符集和校對規則有4個級別的默認設置:
- 服務器級
- 數據庫級
- 表級
- 字段級
索引
索引(Index)是幫助MySQL高效獲取數據的數據結構
目的
- 目的在於提高查詢效率,類比於字典
功能
- 查找
- 排序
優勢與劣勢
優:
- 提高數據檢索的效率,降低數據庫的IO成本
- 降低數據排序的成本,降低了CPU的消耗
劣:
- 索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄,所以所以也需要佔用空間
- 在做數據修改時,不僅要保存數據,還要修改索引信息
索引的分類
- 單值索引:一個索引只包含單個列,一個表可以有多個單列索引
- 唯一索引:索引列的值是唯一的,但允許有空值
- 複合索引:一個索引包含多個列
索引的創建,查看和刪除
CREATE TABLE `example` (
`id` varchar(40) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`city` varchar(40) DEFAULT NULL,
`country` varchar(40) DEFAULT NULL,
`email` varchar(40) DEFAULT NULL,
`url` varchar(255) DEFAULT NULL,
`country_code` varchar(5) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `exampleName` (`name`(10))
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 創建
爲example表中的name字段創建10字節的前綴索引
CREATE INDEX exampleName ON example(name(10));
- 查看
SHOW INDEX FROM example;
- 刪除
DROP INDEX exampleName ON example;
索引的存儲分類
- B-Tree索引:最常見的索引類型,大部分引擎都支持
- B-Tree索引中的
B
不代表二叉樹,代表平衡樹
- HASH索引:只有Memory索引支‘’
- R-Tree
- Full-Text(全文索引)
存儲過程
存儲過程和函數的區別:函數必須有返回值,而存儲過程沒有