美文网首页
mysql基础知识

mysql基础知识

作者: 摆渡人_607f | 来源:发表于2020-01-06 14:38 被阅读0次

    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:是为了实现事务的持久性而产生的产物

    相关文章

      网友评论

          本文标题:mysql基础知识

          本文链接:https://www.haomeiwen.com/subject/wulkactx.html