一、 存储引擎
MySql的存储引擎是MySql底层对于文件的一种存取机制。存储引擎的建立是基于表的。
1.MyISAM
一、存储引擎
MyISAM 是 MySQL 的默认存储引擎。MyISAM 不支持事务、也不支持外键,支持全文索引。数据文件和索引文件放置在不同的目录(非聚集索引),平均分布 I/O,获得更快的速度。MyISAM支持表锁,表生成三个文件:
.frm 存放表定义的基本信息
.myi 存放索引
.myd 存放数据
2.InnoDB
InnoDB 支持外键和事务,不支持全文索引,B+树索引结构,将索引当作数据的一部分(聚集索引),支持行锁。
3.MEMORY
MEMORY 存储引擎在内存中创建表。每个 MEMORY 表只实际对应一个磁盘文件,格式是.frm。MEMORY 类型的表访问非常得快,因为它的数据是放在内存中的。适用于临时文件的存储,不支持TEXT字段(大文本字段)和BLOB字段(图片类型),若有,则交给MyISAM处理。
4.ARCHIVE
ARCHIVE是归档存储引擎,以1:10的比例先进行压缩再进行处理,适用于数据量大、查询较少的文件,比如日志文件。ARCHIVE存储引擎仅支持插入和查找,删除和修改代价太大。
全文索引和普通索引的区别:
两种索引的功能和结构都是不同的。
普通索引的结构主要以B+树和哈希索引为主,用于实现对字段中数据的精确查找,比如查找某个字段值等于给定值的记录,A=10这种查询,因此适合数值型字段和短文本字段。
全文索引是用于检索字段中是否包含或不包含指定的关键字,有点像搜索引擎的功能,其内部的索引结构采用的是与搜索引擎相同的倒排索引结构,其原理是对字段中的文本进行分词,然后为每一个出现的单词记录一个索引项,这个索引项中保存了所有出现过该单词的记录的信息,也就是说在索引中找到这个单词后,就知道哪些记录的字段中包含这个单词了。因此适合用大文本字段的查找。
大字段之所以不适合做普通索引,最主要的原因是普通索引对检索条件只能进行精确匹配,而大字段中的文本内容很多,通常也不会在这种字段上执行精确的文本匹配查询,而更多的是基于关键字的全文检索查询,例如你查一篇文章信息,你会只输入一些关键字,而不是把整篇文章输入查询(如果有整篇文章也就不用查询了)。而全文索引正是适合这种查询需求。
二、索引
不同存储引擎中的索引
1.MyISAM
MyISAM底层使用的是B+树索引,它是一种多路树、排序树。B+树支持两种查询方式,一种是通过分支查找,另一种是叶子结点顺序遍历。MyISAM中的索引是一种非聚集索引结构,它的数据和索引是分离开来的,它的叶子结点存放数据地址(唯一标识),分支结点存放区间。
主索引:索引值不能重复(一般为主键)
辅助索引:索引值可以重复
2.InnoDB
InnoDB的底层也使用的是B+树索引,不过InnoDB中的索引是一种聚集索引。它将索引当作数据的一部分,并且它的叶子节点中存放的是真实的数据。
系统建立索引规则:(1)主键;(2)唯一键;(3)添加隐藏字段,6个字节长,只能系统操作。autoincreament,可自增长类型,系统自动添加。
主索引:存放数据(键不可重复)
辅助索引:不存放数据,存放主索引,通过辅助索引查找到主索引,通过主索引查找数据。
索引的建立是基于字段的。
索引的分类基于字段属性。
1.普通索引,建立方法:
(1)create index
(2)alter add index
(3)create table(index)
2.主键索引
3.唯一索引
4.全文索引
5.组合索引:多个字段共同构成索引值,最左前缀原则。
三、事务
事务是一组特定SQL语句的集合。事务有四大特性:1.A 原子性,要么全部执行,要么不执行;2.C 一致性,完整性约束;3. I 隔离性,消除事务间影响;4.D 持久性,永久存储。
没有隔离性的事务会出现的几种情况:1.脏读,事务读取其他事务未提交的结果;2.不可重复读,事务读取其他事务不同阶段的结果,一般由update引起;3.幻读,事务读取其他事务不同阶段的结果,一般由insert/delete引起。
事务的隔离级别:1.未提交读,会出现脏读、不可重复读、幻读;2.已提交读,会出现不可重复读、幻读;3.可重复读,会出现幻读;4.可串行化。
解决脏读:事务未提交对其他事务不可见。
解决不可重复度读:一个事务修改时对其他事务透明。
解决幻读:间歇锁。