• 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 包含的多条语句
  • 相关阅读:
    Vector成员为指针时要注意的问题
    (转)C++中的static关键字的总结
    (转)内联(inline)函数与虚函数(virtual)的讨论
    基类类型和派生类型之间的转换以及虚函数
    (转) vector的reserve和resize
    关于函数返回值的一些见解
    (转)感受异或的神奇
    一个mysql不解的问题
    获取本机TCP连接状态信息
    (转)socket的SYN_RECV和ESTABLISHED状态
  • 原文地址:https://www.cnblogs.com/joey-413/p/14122249.html
Copyright © 2020-2023  润新知