美文网首页
MySQL面试

MySQL面试

作者: 橙一万 | 来源:发表于2021-04-16 20:31 被阅读0次

事务

脏读 事务A读取到了事务B 未提交的内容
幻读 事务A读取到了事务B 提交的新增数据

幻读和脏读有点类似:
脏读 是事务B里面修改了数据
幻读 是事务B里面新增了数据

事务的隔离级别

数据库隔离级别.png

存储引擎

MySQL存储引擎对比图.png

SQL执行加载顺序

MySQL执行顺序

FROM <left_table>
ON <join_condition>
<join_type> JOIN <right_table>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number>
SQL解析流程.png

MYSQL七中join方式

索引是什么

索引优缺点

explain关键字

explain.png

索引优化

  • 要遵循最左匹配原则

带头大哥不能死,中间兄弟不能断

  • 不在索引列上做任何操作(计算、函数、(自动or手动类型转换)),会导致索引失效,而转向全表扫描

比如:字符串不加单引号 索引会失效

  • 存储引擎不能使用索引中 范围条件 右边 的列
  • 避免在查询语句中使用select *
  • mysql在使用不等于(!= or <>)的时候无法使用索引,会导致全表扫描
  • is null,is not null 也无法使用索引
  • like 以通配符开头('%abc...'),mysql索引会失效,变成全表扫描

如果非要使用以通配符开头,则最好使用覆盖索引,才能避免回表查询

  • 少用 or 关键字,用它连接时会导致索引失效

join语句的优化

  • 尽可能减少join语句中的NestedLoop的循环总次数;"永远用小结果集驱动大结果集"
  • 优先优化NestedLoop的内层循环(也就是子查询中优先优化嵌套最深的语句)
  • 多表关联查询时,索引建在子表(因为主表一定会进行全表扫描)

查询优化

行锁优化建议

  • 尽可能让所有数据检索都通过索引来完成,避免无索引 行锁升级为表锁
  • 合理设计索引,减小锁的范围(比如缩小间隙锁的范围)
  • 尽可能较少检索条件,避免间隙锁
  • 尽量控制事务大小,减少锁定资源量和时间长度
  • 尽可能降低 事务的隔离级别

相关文章

网友评论

      本文标题:MySQL面试

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