Mysql
存储引擎:mylsam/Innob/memoery….
Show engines
Myisam:全表锁,拥有较高的执行速度,不支持事务,不支持外键,并发性能差,占用空间相对较小,对事务完整性没有要求,已select、insert为主的应用基本上可以用这个引擎。
Myisam与innodb区别
Innodb支持事务,myisam不支持事务
Innodb支持外键,myisam不支持
Innodb不保存表的具体行数,执行select count(*) from table时需要全表扫描。而myisam用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
Innodb不支持全文索引,而myisam支持全文索引,查询效率更高。
Innodb:行级锁(是一种排他锁,防止其他事务修改此行),提供了具有提交、回滚和崩溃回复能力的事务安全,支持自动增长列支持外键约束,并发能力强,占用空间是myisam的2.5倍,处理效率相对会差一点。
Innodb底层
底层是b+树数据机构,b树的每一个节点对应innndb的一个page,page大小是固定的,一般设为16k其中非叶子节点只有键值,叶子节点包含完成数据
使用场景:
经常更新的表,适合处理多重并发的更新请求。
支持事务。
可以从灾难中恢复。
外键约束,只有他支持外键。
支持自动增加列属性。
Mysql索引
什么是索引:
索引index是帮助mysql高效获取数据的数据结构。
从功能逻辑上说,索引主要有 4 种,分别是
普通索引index(在创建普通索引的时候,不附加任何限制条件,只是用于查询提高查询效率)、
唯一索引unique(在普通索引基础上索引必须唯一的,但可以有空值)、
主键索引primary(特殊的唯一索引,不为空的约束)、
全文索引fulltext(全文索引(也称全文检索)是目前所有引擎使用的一种关键技术,它能够利用分词技术等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的短发规则智能地筛选出我们想要是搜索结果,前文索引非常适合大型数据集,对于小的数据集,他的用处比较小。)
按照物理实现方式,索引可以分为 2 种:
聚簇索引和非聚簇索引。
提高效率 innodb—》b+tree
索引的分类:
主键索引
索引常用底层数据结构
终极大佬:B+树
它是B数的升级版,B+树相比B树,新增叶子节点与非叶子节点关系。
叶子节点中包含了key和value,key存储的是1-10这些数字,value存储的是数据存储地址,非叶子节点中只是包含了key,不包含value。
所有相邻的叶子节点包含非叶子节点,使用链表进行结合,有一定顺序排序,从而范围查询效率非常高。
比如我们要查找大于5的数据:
● 首先我们定位到5的位置
● 然后直接将5后面的数据全部拿出来即可,因为这是有序链表,已经排好序了
我们在order by排序的时候为什么要使用索引进行排序,原因就在这。
哪些情况需要建索引
● 主键自动建立唯一索引
● 频繁作为查询的条件的字段应该创建索引
● 查询中与其他表关联的字段,外键关系建立索引
● 频繁更新的字段不适合创建索引:因为每次更新不单单是更新了记录还会更新索引,加重IO负担
● Where条件里用不到的字段不创建索引
● 单间/组合索引的选择问题(在高并发下倾向创建组合索引)
● 查询中排序的字段,若通过索引去访问将大大提高排序的速度
● 查询中统计或者分组字段
哪些不适合建索引
● 表记录太少
● 经常增删改的表
● 数据重复且分布平均的表字段,因此应该只为经常查询和经常排序的数据列建立索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
索引失效的情况
1、模糊查询
模:指的是模糊查询,模糊查询使用like关键字,以%开头的话会索引失效。
like ‘%dd’ %在前
/2、数据类型强转
型:指的是数据类型强转,数据类型错误也会使索引失效。
强转虽然查询成功 where id = ‘11111’
/3、运算
数:运:指的是运算,对索引列使用加减乘除运算,会导致索引失效.
4、函数
指的是函数,对索引列使用内部函数会索引失效,
Sum count avg ….
5、使用is not null
is not null
6/条件中有or
Select id from t where num = 10 or num =20
优化:
Select id from t where num = 10
union all
select id from t where num = 20
7/ where的判断条件如果对字段进行了null值判断,将导致数据库放弃索引而进行全表查
Select id from t where num is null
可以num上设置默认值0,确保num列没有null值,这样查询
Select id from t where num = 0
8/ where 子句中使用!=或<>操作符
where —> < !=
9 in和not In慎用,否则会导致全表扫描
Select id from t where num in(1,2,3)
优化
Select id from t where num between 1 and 3
根据上面的知识;可知id相同,由上至下依次执行,分析结果可知:
先查询t表就是teacher表中name字段为a的记录,由于name字段没有索引,所以全表扫描(type:ALL),一共有3条记录,扫描了3行(rows:3),1条符合条件(filtered:33.33 1/3);
再查询tc即teacher_card表使用主键和之前的t.tc_id关联;由于是关联查询,并且是通过唯一索引(主键)进行查询,仅能返回1或0条记录,所以type为eq_ref。
system 该表只有一行, const 类型的特例。
const 最多匹配一行,在查询开始时读取,因为只有一行,所以被认为恒定不变的(constants),因为只读一次,所以非常快。
出现在基于主键或唯一键的等值查询
eq_ref 表关联时如果表关联字段是主键或唯一索引字段,会是该情况。这是最好的表联接类型。
ref 用于 = 匹配,但是关联字段不是主键或唯一键
fulltext 使用FULLTEXT 索引执行联接。
ref_or_null 这种连接类型类似于 ref,但是MySQL还会额外搜索包含NULL值的行。此联接类型优化最常用于解析子查询
如:SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;
index_merge 使用索引合并优化。参考:8.2.1.3, “Index Merge Optimization”.
unique_subquery 在in子查询中类似 eq_ref。如:value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery 类似于 unique_subquery。但子查询非唯一
range 指定范围查询。ref 列是 NULL。操作符 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE, or IN()
index 类似 ALL,但只有索引树被扫描。两种情况:1.索引覆盖,这时 Extra列显示 Using index。 2.以索引排序全表扫描
ALL 全表扫描
Mysql锁
1、全局锁,对整个数据库实例加锁
2、表级锁
3、行锁
死锁:在并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源,就会导致这几个线程都进入无限等待状态,称为死锁。
Mysql事务
四大特性:
原子性:一个事务要么全部成功要么全部失败
一致性:一个事务可以让数据从一致状态切换到另一种一致性状态
隔离性:一个事务不受其他事务影响,多个事务彼此隔离
持久性:一个事务一旦被提交,在数据的改变是永久的
Mysql事务的并发问题
脏读:事务在修改前后另一个事务分别查询造成前后数据不一致性。
不可重复读:同样是两个事务,事务a查询一条数据,事务b修改了这条数据,特别注意,这里事务b执行了提交,但是事务a还没有提交或回滚,这种事务并发问题称为不可重复读。
不可重复读: 一个事务读取到其他事务已提交的数据导致前后两次读取数据不一样的情况
幻读: 一个事务前后两次读取的数据不一致,是因为其他事务插入数据导致的事务并发情况
MySQL 的默认隔离级别是可重复读,不是读已提交
隔离性从低到高分别是:读未提交、读已提交、可重复读、可串行化
并发性跟隔离性恰好相反,从低到高是:可串行化、可重复读、读已提交、读未提交
这也非常好理解,隔离性越高,说明锁的粒度越细,并发性自然就会降低
Mysql执行计划
Expain执行计划
返回结果行数占百分比,估算出找到所需记录
显示该表的索引字段关联哪张表的哪个字段
索引的长度
实际使用到的索引
查询可能使用的索引
Type
系统表 system
唯一性索引 eq_ref
非唯一性 ref
全文索引 fulltext
可以出现null的情况 ref_or_null
索引合并 index_merge
主键进行等值匹配 unique_subquery
访问子查询表使用普通索引 index_subquery
只检索给定范围的行,使用一个索引来选择行 range
Index类型只遍历索引树
遍历所有匹配行 all