MySQL常见面试题

1、MyISAM 与 InnoDB 的区别?

  InnoDB:

    事务型的存储引擎,有行级锁定和外键约束

    可靠性高,要求事务、更新频繁

  MyIASM:

    默认存储引擎,不支持事务、外键,但是存储行数、索引和数据分开存储,读取效率高

    更新很少、读取频繁、发亮需求统计行数的sql

对比项 MyISAM InnoDB
外键 不支持 支持
事务 不支持 支持
行表锁

表锁,操作一条数据也会锁住整个表

不适合高并发的操作

行锁,操作时只锁住某一行,对其他行没有影响

适合高并发

缓存 只缓存索引,不缓存真实数据 缓存索引和真实数据,对内存要求较高

2. 事务的隔离级别:

  

事务隔离级别 脏读 不可重复读 幻读
读未提交
不可重复读
可重复读
串行化

3. Mysql 性能优化

  1. 当只要一行数据的时候使用 limit 分页查询 :

    查询到如果已知会得到一条数据,这种情况下加上limit 1,此时数据库引擎找到一条结果停止搜索,不需要继续查询

  2. 根据需求选择数据库引擎:

    MyISAM 适用于一些大量的查询的应用,不适合大量写功能的应用。

    InnoDB适用于哪些需要事务支持的应用。

  3. 用not exists 代替 not in :

    not exists 用到了连接能够发挥已经建立好的索引的作用

    not in 不能使用索引,所以要每条遍历比较,数据量大的情况下不建议使用 not in

  4. 对操作符的优化,尽量不采用不利于索引的操作符:如 

in
not in
is null
is not null
< > 

  5. 为常用的字段建立索引

  6. 避免 select * 

  7. 读写分离,建立mysql集群,主从复制。读写分开

  8. 索引优化,使用自增的字段作为主键

  

4. MySQL的触发器:

CREATE TRIGGER mytrigger  -- 触发器名称,用户自定义
trigger_time   --标识触发时机  BEFORE  或   AFTER
trigger_event ON tbl_name  -- 标识触发事件  INSERT  UPDATE  DELETE  tbl_name: 标识触发器建立的表名 
FOR EACH ROW  
trigger_stmt  -- 触发体程序体,可以是一句SQL,或者 BEGIN 和 END 包含的多条语句
原文地址:https://www.cnblogs.com/joey-413/p/14122249.html