Mysql常用的数据引擎有哪些
InnoDB:行及锁、主要有事务的支持,支持自增长列,支持外健约束,并发能力强。
MyISAM:全表锁、不支持事务、不支持外健,并发性能差,占用空间相对较少。
Memory:全表锁、速度快、存储内存中,重启数据会丢失。
Merge:MyISAM表的组合。
区别:
InnoDB不保存具体的行数,每次需要进行求和,也就是全表扫描、而MyISAM用一变量保存了整个表的行数,执行变量即可读出函数,速度很快。
InnoDB不支持全文索引、而MyISAM支持全文索引,查询效率更高。
数据库事务的特性
ACID:原子性、一致性、隔离性、持久性
原子性(Atomic):要么全部成功、要么全部失败。
一致性(Consistency):事务操作成功后,数据库状态和业务规则保持一致。
隔离性(Isolation):在并发操作时,不同的事务拥有各自的空间,彼此不互相干扰
持久性(Durabiliy):事务超过成功后,所有数据都需持久化到数据库中。
什么是索引
是Mysql高效获取数据的数据算法,通俗的讲:数据库的索引就好比一本书的目录,能够加快数据库表的查询速度。
索引往往是存在于磁盘中的,没有特别说明,默认是B+树结构。
SQL优化手段有哪些
查询不要用 select *
尽量减少子查询,采用联合关联查询
尽量减少not in 等查询效率比较低的查询条件,特别是整表扫描。
尽量避免where条件后面 使用 != <> 操作符,这样会导致全表扫描
简单说下 drop、delete、truncate的区别
drop 删除表、delete、truncate 删除表的数据。
什么是内连接、左连接、右连接
内连接(Inner Join):匹配两张表中相关联的记录
左连接(Left Join):除了匹配两张表相关联的记录外,还会匹配左表中剩余的记录,右表中位匹配到的字段用null表示
右连接(Right Join):除了匹配两张表相关联的记录外,还会匹配右表中剩余的记录
事务隔离级别
InnoDB采用的是可重复读,MVCC 不能解决幻读的问题,使用的是 Next-Key Lock 锁算法,可以规避幻读。
大数据量表该如何优化
限定数据查询范围:比如查询订单的时候,默认查询当天的
读写分离:主负责写、从负责读,根据场景,可以1住多从
垂直分区:根据数据表进行相关拆分,把一张表拆成多张表
水平拆分:保持数据结构不变,通过分片的方式存储到分布式数据库中。
数据库分片两种方式:客户端代理:封装在Jar包中、Sharding-JDBC
中间件代理:在应用和数据库中间加一个代理层,Mycat。
说说Mysql一条查询语句是如何执行的
获取连接:使用mysql连接器
查询缓存:mysql8.0已删除,不建议使用
分析器:分析词法和语法,一般语法错误就在这个地方
优化器:表里有多个索引的时候,决定采用什么索引,或者关联顺序
执行器:执行器判断执行条件,然后进行执行
什么时候不要使用索引
经常增删改的不要简历索引
有大量重复的列不要建立索引
表记录太少不要简历索引
什么是MVCC
多版本并发控制:是一种用来解决读写冲突无锁控制,为每一个修改保存一个版本,在读操作时不用阻塞写操作,在写操作时不用阻塞读操作,避免了脏读和不可重复读。
Mysql中的锁
共享锁:不阻塞,多个用户可以同一时刻读取相同的资源,相互之间没有影响。
排他锁:一个写操作阻塞其他读锁和写锁,这样只允许一个用户进行写入,防止其他用户读取正在写的内容。
表锁:MyISAM就是默认表锁
行锁:容易出现死锁,并发高,InnoDB支持行锁,但必须有索引,不然就是表锁。
什么时候锁会升级
Mysql行锁只能存在于索引上,因为InnoDB把主键和相关的行数据放在B+树的叶节点上面,如果索引不存在,自动升级为表锁
当非唯一索引操作一定数量时,也就是数据的一半时,这个时候索引的消耗会比表锁消耗更多,这个时候行锁自动升级为表锁
怎么避免数据库死锁:
设置锁等待操作时间,及时失败获取,也能退出程序,不至于一直等待导致死锁
保持事务简短,不要过长,减少开销
事务隔离级别顺序执行
使用Mysql索引的时候应该注意什么
查询的时候尽量少用 !=,比较、函数 等,导致索引失效全表扫描
复合索引遵循偏左原则
如果mysql索引扫描比较慢,会升级为全表扫描
列类型是字符串时,必须加引号,不然搜索也会失效
表字段可以为null的,索引是不生效的
like查询 %在前面的是不走索引的,走全表扫描