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查询 %在前面的是不走索引的,走全表扫描