mysql 总结
1. 索引类型:
(1)hash索引:hash索引主要是用来判断等值查询效率比较高,缺点:不支持范围查询,不支持排序,数据量变大hash碰撞增加, 导致查询效率降低,
(2)b+tree 索引 : 聚簇索引(主键索引) 与非聚簇索引(非主键索引),两者区别主要:1,聚簇索引的叶子节点存放的是整条数据,非聚簇索引存储的是主键id,需要回表查询;
b+tree 的优点:由于mysql获取数据是通过每页page(16kb)获取的, b+tree 的数据枝节点存放的都是索引;
(3)fulltext(全文索引):主要解决模糊查询效率慢的问题, 目前只能在char 、 varchar、text类型的字段添加全文索引;
(4)rtree:一般很少使用, 相比b+tree 索引,范围查询效率更高
2. 为什么选用b+tree 作为存储数据?
1.只用叶子节点存储数据 , 非叶子节点存储索引
2.相同数据量,相比其他数据结构,比如:二叉树,平衡二叉树、红黑树高度更低,读取数据io操作少
3. 什么是聚簇索引、非聚簇索引?
(1)顺序结构与存储的物理结构一致的索引,并且一个表中聚簇索引只能由唯一的一条
(2)非聚簇索引 与存储的物理结构没有关系,一个表中可以创建多个, 根据不同列的约束可以建立不同的要求的非聚簇索引
4. 索引的种类?
(1)普通索引:仅加速查询
(2)唯一索引:加速查询+列值唯一(可以为null)
(3)主键索引: 加速查询+列值唯一 不能为null +表中只能有一个
(4)组合索引:多个列组成一个索引,专门用于组合搜索,其效率大于索引合并(基于做前缀原则, 一般把经常用于 查询的列放在最左边)
(5)全文索引: 对于文本内容进行分词,进行搜索(比模糊查询效率高)
(6)覆盖索引:所查询的列可以在索引中找到, 不需要读取数据行
5.sql一般怎么优化?
(1)选择合适的列添加索引
(2)使用expalin看是在排序与查询的时候使用到自己定义的索引
(3)编写sql 注意优化:
1.使用limit对查询结果进行限定
2. select * 替换成具体业务需要的查询列
3.等号左边列上不做运算
4.OR改成IN,OR的效率是n,IN的效率是log(n),注意in括号里面有长度限制
5.使用同类型进行比较
6.避免在where 后面使用!=或者<>操作符号
7.对于联系数值,使用between 不用in
8.组合索引基于做前缀原则
6.MYSQL 的事务?
(1) 事务遵守acid原则,原子性(要么都成功,要么都失败)、一致性(事物前后的数据完整性要保证一致)、隔离性(事务之间互不影响)、持久性(事物一旦提交则不可逆,被持久化到数据库中)
(2)事务的隔离级别:
1.读未提交 (隔离级别最低,有可能产生脏读,脏读指一个事务读取了另外一个事务未提交的数据)
2.读已提交(事务提交的数据才能读到,可以避免脏读,但会导致不可重复读,不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。)
3.可重复读 (事务提交的数据读不到,可以重复读取数据,会导致幻读,幻读是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。)
4.串行化(可以避免幻读,但是吞吐量太低,用户体验太差)
7.mysql mvcc知道吗? 它是怎么流程?
https://baijiahao.baidu.com/s?id=1690462040725127226&wfr=spider&for=pc