mysql 数据类型
整数类型
tinyint ,smallint ,mediumint,int,bigint
属性:unsigned
长度:可以为整数类型指定宽度,例如int(11),对大多数应用是没有意义的,他不会限制值得合法范围,只会影响显示字符的个数.宽度不够,用0填充.
实数类型
float double decimal
decimal 可存储比bigint 还大的整数;可以用于存储精确的小数float和double类型, 支持使用标准的浮点数进行类似计算.
字符串类型
varchar char text blob
varchar:
- varchar 类型用于存储可变长字符串,他比定长类型更节省空间.
- varchar使用1或2个额外字节记录字符串的长度.列长度小于255字节,使用1个字表示,否则使用2个.
- varchar 长度,存储内容超出指定长度,就会截断.
char:
1.char是定长的,根据定义的字符串长度分配足够的存储空间
2.char会根据需要采用空格进行填充以方便比较
3.char适合存储很短的字符串,或者所有的值都接近同一长度
对于经常变更的数据,char比varchar更好,varchar更容易产生碎片
枚举
有时可以使用枚举代替常用的字符串类型,把不重复的集合存储成一个预定义的集合
日期和时间类型
尽量使用timestamp,比datetime空间效率高,用整数保存时间戳的格式通常不方便处理
如果存储微秒,可以使用bigint存储
对于非常短的列,char比varchar在存储空间上更有效率.
列属性
auto_increment , default , not null, zerofill
mysql 存储引擎
InnoDb表引擎
- 默认事务型引擎
- 数据存储在共享表空间,可以通过配置分开
- 对主键查询的性能高于其他类型的存储引擎
- 从磁盘读取数据时自动在内存中构建hash索引
- 插入数据时自动构建插入缓存区
- 支持热备份,支持崩溃后的安全恢复
- 支持行级锁,支持外键
Myisam表引擎
- 支持全文索引,压缩,空间函数
- 不支持事务和行级锁,不支持崩溃后数据恢复
- 表存储在2个文件,MYD和MYI
其他表引擎
Archive Blankhole CSV Memory
MySQL锁机制
概念
当多个查询同一时刻进行数据修改时,就会产生并发控制的问题
共享锁(S)和排他锁(X),其实就是读锁和写锁
读锁
共享的,不堵塞,多个用户可以同时读一个资源,互不干扰.
写锁
排他的,一个写锁会阻塞其他的写锁和读锁,这样可以只允许一个人进行写入,防止其他用户读取正在写入的资源.
锁粒度
表锁,系统性能开销最小,会锁定整张表.
Mysql事务处理
存储过程
mysql索引
索引的类型
- 普通索引: 最基本的索引,没有任何约束限制
- 唯一索引: 与普通索引类似,但是具有唯一性约束
- 主键索引: 特殊的唯一索引,不允许有空值
一个表只能有一个主键索引,可以有多个唯一索引
主键索引一定是唯一索引,唯一索引不是主键索引
主键可以与外键构成参照完整性约束,防止数据不一致
- 外键索引: 只有innodb类型的表才可以使用外键索引,保证数据的完整性,一致性,和实现级联操作.
- 全文索引: myisam 只能对英文
- 组合(联合)索引: 将多个列组合在一起创建索引,可以覆盖多个列.
索引的创建原则
- 最适合索引的列是出现在where子句中的列,或连接子句中的列而不是select关键字后的列
2.索引列的基数越大,索引效果越好
3.对字符串进行索引,应该制定一个前缀长度,节省大量索引空间
4.根据情况创建复合索引,复合索引可以提高查询效率 - 避免创建过多索引,索引会额外占用磁盘空间
- 主键尽可能选择较短的数据类型
注意
复合索引遵循前缀原则
key(a,b,c)
where a = 1 and b=2 and c=3
where a = 1 and b=2
where a =1
where b=2 and c =3 (索引不生效)
where a=1 and c =3 (索引不生效)
like查询,%不能在前,可以使用全文索引
where name like “%sui%”(不生效,”sui%”生效)
column is null 可以使用索引
其他
- 如果or前的条件中列有索引,后面没有,索引都不会生效
- 列类型是字符串,查询时一定要给值加引号,否错不生效