《深入浅出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(全文索引)
存储过程
存储过程和函数的区别:函数必须有返回值,而存储过程没有