MySQL客户端与服务端的通信方式是“半双工”
全双工:双向通信,发送同时也可以接收
半双工:双向通信,同时只能发送或者接收,无法同时操作
单工:单向通信
通信状态查询 show processlist
查询缓存
工作原理:
缓存select操作的结果集合SQL语句
新的select语句,先去查询缓存,判断是否存在可用的记录集
存储引擎
1、Active存储引擎(压缩协议进行数据的存储);
特点:只支持insert和select两种操作;只允许自增id列建立索引;行级锁;不支持事务;数据占用磁盘少
2、MyISAM;3、Innodb;4、Memory存储引擎
一、MyIsam和innodb的对比
1、MyISAM不支持事务,Innodb是事务型存储引擎。
2、MyISAM只支持表级锁,Innodb默认支持行级锁
3、MyISAM不支持外键,Innodb支持外键
4、MyISAM支持全文索引,Innodb不支持
5、MyISAM引擎的查询、更新、插入的效率都比innodb高
总结:在读多少写的应用中还是Innodb插入性能更稳定,如果对比读取速度要求比较快的选MyISAM
附加:
1、MyISAM属于堆表,在磁盘上有三个文件 .frm,.MYI(存放索引),.MYD(存放数据),支持三种不同的存储方式:静态表、动态表、压缩表
2、Innodb属于索引组织表,支持两种存储方式:共享表空间存储和多表空间存储。
3、关于自动增长:MyISAM引擎的自动增长列必须是索引,如果是组合索引,自动增长列可以不是第一列;
Innodb引擎的自动增长列必须是索引,如果是组合索引,自动增长列必须是组合索引的第一列
4、关于主键:MyISAM可以没有主键和自动索引,MyISAM的索引都是保存行地址
Innodb引擎如果没有设置主键或者非空的唯一索引,就会自动生成一个6个字节的主键(用户不可见)
5、关于count函数,如果没有where条件,MyISAM保存表的总行数,直接取就行
Innodb需要遍历整个表,如果有where条件,处理方式一样
二、事务
1、事务的ACID属性
原子性、隔离性、持久性、最终一致性
2、并发事务带来的几个问题
更新丢失、脏读、不可重复读、幻读
3、事务的隔离级别
读未提交、读已提交、可重复读(默认)、序列化
三、锁
共享锁、排他锁、意向共享锁(表锁)、意向排他锁(表锁)、间隙锁、临键锁、记录锁、死锁
1、mysql死锁怎么避免?怎么解决?
避免死锁
1.1、类似的业务逻辑以固定的顺序访问表和行
1.2、大事务拆小
1.3、同一个事务中,尽可能一次锁定锁需要的所有资源
1.4、为表添加合理是索引,避免表锁
MySQL有两种死锁处理方式:
等待,直到超时(innodb_lock_wait_timeout=50s)。
发起死锁检测,主动回滚一条事务,让其他事务继续执行(innodb_deadlock_detect=on)。
由于性能原因,一般都是使用死锁检测来进行处理死锁。
2、innodb 如果没加索引,写操作会加表锁;如果加了所有,只加行锁和间隙锁
3、死锁的条件
3.1)互斥条件
3.2)不可抢占条件
3.3)循环等待条件
4、乐观锁和悲观锁
4.1)悲观锁:一锁二查三更新,需要数据库本身提供支持 select 。。。 for update来实现
4.2)乐观锁:一般是逻辑上实现,不需要数据库本身提供支持,一般的做法是在需要的数据上增加一个版本号或者时间戳。
四、索引
正确的创建合适的索引,是提升mysql数据查询性能的基础。
索引是为了加速对表中数据行的检索而创建的一种分散的数据结构。
1、种类:
主键索引:数据记录里面不能有null,数据内容不能重复,在一张表里面不能有多个主键索引。
唯一索引:字段数据是唯一的
组合索引:多个列建立索引
普通索引:使用字段关键字建立的索引,主要是提高查询速度
全文索引:只有MyISAM支持
2、结构:B+Tree索引、Hash索引、全文索引(只有MyISAM支持)、RTree
备注:hash索引:由于hash的唯一及类似键值对的形式很适合做索引,可以一次定位,但是对于范围查询、排序、组合索引,效率不高
3、索引的优缺点:
优点
3.1、索引能极大的减少存储引擎需要扫描的数据量
3.2、索引可以把随机IO变为顺序IO
3.3、索引可以帮助我们在分组,排序等操作时,避免使用临时表
缺点
3.1)提高了查询速度,但是降低了表的更新速度,因为更新表的时候,不仅要更新下数据,还有更新下索引文件
3.2)建立索引文件会占用磁盘空间,一般情况不严重。但是在一个大表上建立多种组合索引,索引文件会增长很快。
4、索引失效
4.1)如果条件中有or,即使其中有条件带索引也不会使用,除非全都都是索引
4.2)对于组合索引,如果不满足最左匹配原则,不使用索引
4.3)like查询以%开头,不使用索引,如果离散度低,也不走索引
4.4)如果列是字符串类型,那一定要在条件中将数据用引号引用起来,否者不使用索引
4.5)查询的数量是大表的大部分,应该是30%以上
4.6)对索引列进行运算
4.7)mysql使用不等于,无法使用索引
4.8)mysql中使用is not null 或 is null。
五、基础理论
1、三范式
1.1)建表时要保证列的原子性(不可分割)
1.2)数据库表中的每个实例或记录必须可以被唯一的区分
1.3)一个关系中不包含已在其他关系已包含的非关键字信息
2、drop、delete、truncate的区别和在什么场景下使用
2.1)drop
属于DDL;不可回滚;不可带where;删除表结构和内容;删除速度快
2.2)truncate
属于DDL,不可回滚;不可带where;删除表内容;删除速度快
2.3)delete
属于DML,可回滚;可带where,删除表内容,删除速度慢,需要逐行删除
3、为什么选择B+Tree作为索引结构
3.1)B+树扫库、表能力更强
3.2)B+书的磁盘读写能力更强
3.3)B+树的排序能力更强
3.4)B+树的查询效率更稳定
六、MVCC 多版本并发控制
避免写操作的阻塞,从而引发读操作的并发问题
1、mysql表中会默认加两列:数据行版本号、删除版本号;有个全局事务ID
2、查询的规则
2.1、查询数据行版本号早于当前事务版本的数据行
2.2、查询删除行版本号要么为null,要么大于当前事务版本号的记录
七、undo Log 和redo Log
1、undo log:是为了实现事务的原子性而出现的产物
快照读(普通的select就是快照读)、当前读(SQL读取的数据是最新版本,一般在修改数据的情况下)
2、redo log:是为了实现事务的持久性而产生的产物
网友评论