MySql学习笔记
MySQL数据库存储引擎
- MyISM:MyISAM存储引擎:不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有
要求或者以select,insert为主的应用基本上可以用这个引擎来创建表 - InnoDB:支持事务
- Memory:Memory存储引擎使用存在于内存中的内容来创建表。每个memory表只实际对应一个磁盘文件,格式是.frm。memory类型的表访问非常的快,因为它的数据是放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失掉。
- Merge:Merge存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同,merge表本身并没有数据,对merge类型的表可以进行查询,更新,删除操作,这些操作实际上是对内部的MyISAM表进行的。
MyISM和InnoDB的区别
- InnoDB支持事务,而MyISM不支持事务
- InnoDB支持行级锁,而MyISM支持表级锁
- InnoDB支持外键,而MyISM不支持
- InnoDB支持全文索引,而MyISM不支持
- InnoDB是索引组织表,MyISM是堆表 (堆表的数据是随机插入的,索引组织表的数据是有序的)
MySQL中char和varchar的区别
char(10):简单粗暴,浪费空间,存取速度快 root存成root000000
会保存固定的长度,不足会用空格补足
varchar:精准,节省空间,存取速度慢
是什么就存什么
int类型存储
int存储4字节,最小值-2147483648,最大值21477483647
主键特征
非空而且唯一
inner join、left join、right join、full join
inner join 保留符合条件的数据
left join 优先保留左表数据
right join 优先保留右表数据
full join 合并两张表的数据
concat, group_concat函数
concat 将多个字符串连接成一个字符串
group_concat 对group by后的数据用逗号拼接在一起
事务
事务指的是多个sql组成一个事务,有一个sql异常,整个事务回滚
索引
索引指的是用来保存数据查找算法的一种数据结果
优点:
1. 加快数据的查找速度,减少IO操作
2. 通过索引对数据进行排序,降低了数据排序的成本,降低了CPU的利用率;
缺点:
1. 索引实际上也是一张表,索引会占用一定的存储空间;
2. 更新数据表的数据时,需要同时维护索引表,因此,会降低insert、update、delete的速度
什么情况需要建索引
- 主键自动创建唯一非空索引;
- 频繁作为查询条件的字段应该创建索引;
- 频繁更新的字段不适合简历索引,因为每次更新不仅仅更新数据表同时还会更新索引表;
- 查询中经常排序的字段,可以考虑创建索引;
- 如果某个字段的重复数据较多,不适合创建普通索引;
ACID
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
存储过程
存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql
视图
视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用
SQL的执行计划
生成的方法很简单在相应的select前面加explain即可
MySql的数据类型
数字:
整型:tinyinit int bigint
小数:
float :在位数比较短的情况下不精准
double :在位数比较长的情况下不精准
0.000001230123123123
存成:0.000001230000
decimal:(如果用小数,则用推荐使用decimal)精准内部原理是以字符串形式去存
char(10):简单粗暴,浪费空间,存取速度快
varchar:精准,节省空间,存取速度慢
时间类型:
最常用:datetime
枚举类型与集合类型
hash索引和B+树索引
哈希索引基于哈希表实现,只有精确匹配索引的所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。也就是说,由于哈希查找比起B-Tree索引,其本身对于单行查询的时间复杂度更低,有了哈希索引后明显可加快单行查询速度。
但是哈希索引也有它自己的限制:
哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。不过,访问内存中的行的速度很快,所以大部分情况下这一点对性能的影响并不明显。
哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序。
哈希索引也不支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。例如,在数据列(A, B)上建立哈希索引,如果查询只有数据列A,则无法使用该索引。
哈希索引只支持等值比较查询,包括=、in()、<=>。不支持任何范围查询,例如where price > 100。
访问哈希索引的数据非常快,除非有很多哈希冲突。如果哈希冲突很多的话,一些索引维护操作的代价也很高。
B+树索引是B树索引的变体,本质上也是多路平衡查找树
数据备份类型
- 完全备份:这是大多数人常用的方式,它可以备份整个数据库,包含用户表、系统表、索引、视图和存储过程等所有数据库对象。但它需要花费更多的时间和空间,所以,一般推荐一周做一次完全备份。
- 事务日志备份 事务日志是一个单独的文件,它记录数据库的改变,备份的时候只需要复制自上次备份以来对数据库所做的改变,所以只需要很少的时间。为了使数据库具有鲁棒性,推荐每小时甚至更频繁的备份事务日志。
- 差异备份 也叫增量备份。它是只备份数据库一部分的另一种方法,它不使用事务日志,相反,它使用整个数据库的一种新映象。它比最初的完全备份小,因为它只包含自上次完全备份以来所改变的数据库。它的优点是存储和恢复速度快。推荐每天做一次差异备份。
- 文件备份 数据库可以由硬盘上的许多文件构成。如果这个数据库非常大,并且一个晚上也不能将它备份完,那么可以使用文件备份每晚备份数据库的一部分。由于一般情况下数据库不会大到必须使用多个文件存储,所以这种备份不是很常用