一、 存储引擎

    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.可串行化。

    解决脏读:事务未提交对其他事务不可见。

    解决不可重复度读:一个事务修改时对其他事务透明。

    解决幻读:间歇锁。