mysql 点总结

1、mysql默认引擎

  mysql-5.1版本之前默认引擎是MyISAM,之后是innoDB

 

2、mysql 配置文件
  二进制日志 log-bin 主从复制
  错误日志 log-error 默认关闭、记录警告和错误、启动和关闭详情
  查询日志 log :默认关闭,记录查询的sql,开启会降低整体性能
  数据文件 /var/lib/mysql frm:存放表结构
  myd:存放表数据  
  myi:存放表索引
  相关配置:windows-my.ini Linux-/etc/my.cnf

3、存储引擎
  myisam : 表锁、只缓存索引
  innodb : 支持主外键,支持事务,行锁,缓存索引和真实数据    

      

 

        <1> MyISAM在执行查询语句(select)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。

               MySQL的表级锁有两种模式:

                             表共享读锁

                             表独占写锁

                             读锁会阻塞写,写锁会阻塞读和写

  <2> 行锁

              偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发送锁冲突的概率最低,并发度也最高

              当选中某一行时,如果是通过主键或者索引选中的,这个时候是行级锁;如果是通过其它条件选中的,这个时候行级锁会升级成表锁,其它事务无法对当前表进行更新或插入操作

 




4、索引

  MyISAM是非集聚引擎,支持全文索引;不支持事务;它是表级锁;会保存表的具体行数.

  InnoDB是集聚引擎,5.6以后才有全文索引;支持事务;它是行级锁;不会保存表的具体行数.


  <1>排好序的快速查找的一种数据结构
  

  <2>什么情况下,需要创建索引
  (1)主键自动建立唯一索引
  (2)频繁作为查询体哦阿健的自读那要创建索引
  (3)查询中与其他表关联的字段
  (4)查询中排序的字段
  (5)查询中统计或者分组的字段

  <3>什么情况不创建索引
    频繁更新的字段不适合创建索引
    where条件里用不到的字段不创建索引
    表记录很少的
    数据重复且平均分布的字段

  <4>单值索引和组合索引的选择问题?
    高并发建议组合索引(过滤性做好的字段排在前面

  <5>避免索引失效
    (1)最佳左前缀法则 : https://www.cnblogs.com/cyhbyw/p/8820369.html
    (2)不在索引上做任何操作
    (3)存储引擎不能使用索引范围条件右边的列
    (4)尽量使用覆盖索引(只查询索引列)!=<>无法使用索引慧导致全表扫描
    (5) is null, is not null 也无法使用索引
    (6) like '%abc...' 索引失效会导致全表扫描
    (7) 字符串 不加单引号 索引失效
    (8) 少用 or , 索引失效

  <6>查询优化
    (1) 小表驱动大表
    (2) order by 子句尽量避免fileSore, order by 子句使用索引最左前列,
      或者 where 子句与 order by 子句条件组合满足索引最左前列
    (3) group by 先排序后分组,遵照最佳左前缀,
      where 高于having, 尽量在where中限定条件

    -------- 在这里面试官肯定会问,有没有做过sql调优
    - 1、使用explain, 查看执行计划;
    1.1、能干吗呢
      (1)表的读取顺序;
      (2)数据读取操作的操作类型;
      (3)哪些索引可以使用;
      (4)哪些索引实际使用;
      (5)表之间的引用;
      (6)每张表有多少行被优化器查看

5、分区、分库、分表
  查看表分区 SHOW VARIABLES LIKE '%partition%'
  range 分区,list 分区
  mysql 单表容量不超过500W, 否则要水平拆分

6、行表锁
  <1> 查询锁: mysql>show open tables;
  <2> 读锁:共享锁 lock table 表名 read;
  <3> 写锁:独占锁 lock table 表名 write;
  <4> 表锁偏读(myisam)、行锁偏写(innodb)
  <5> 表锁分析:
  (1)读锁示例: session1 加表1 的读锁
          session2 可读, 不能改(排队等待)
          session1 不可改,不可改其他表

  (2)写锁示例: session1 加表1的写锁
          session1 可读写操作
          session2 不能读(排队等待)

  (3)如何分析表锁定
      sql:show status like 'table%';
      table_locks_immediate: 产生表级锁定的次数
      table_locks_waited: 出现表级别锁定争用而发生等待的次数

  总结:读锁会阻塞写,单不会阻塞读;
      写锁会把读写都阻塞

    <6> 行锁分析
      show status like 'innodb_row_lock%'

7、主从复制
   slave 会从maaster读取binglong进行数据同步,slave将master的binlog
   拷贝到它的中继日志,mysql 的复制是异步且串行化的;

 

8、数据库隔离级别和实现原理

      https://www.jianshu.com/p/05aa6aef105e



https://www.bilibili.com/video/BV1DK4y1C7o7?from=search&seid=2252694201214978095


 

posted @ 2020-06-30 19:51  抽象Java  阅读(161)  评论(0编辑  收藏  举报