Loading

Mysql高级

逻辑架构

  • 连接层
  • 服务层
  • 引擎层
  • 存储层

存储引擎

image

join查询

  • inner join
  • left join
  • right join

索引

索引的目的在于提高查询效率

是排好序的快速查找数据结构

索引没有特别指明,都是指B树(多路搜索树,不一定是二叉的),唯一索引默认都是B+树。还有hash索引等。
索引的优势

  • 提高数据检索的效率
  • 降低数据排序的成本
    劣势:
  • 索引占用空间
  • 降低更新表的速度
  • 要花时间建立更优秀的索引

索引分类

  1. 单值索引
  2. 唯一索引
  3. 复合索引
  4. 基本语法{
    创建:CREATE [UNIQUE] INDEX indexname ON mytable(columnname(length));
    ALTER mytable ADD [UNIQUE] INDEX indexname ON columnname(length);
    删除:DROP INDEX[indexname] ON mytable;
    查看:SHOW INDEX FROM table_name\G
    }

explain

能干嘛:
image

  • id
  • select_type
  • table
  • type{
    ALL index range ref eq_ref const sytem NULL
    访问类型排列
    显示查询使用了何种类型
    从最好到最差依次是:
    system>const>eq_ref>ref>range>inde>ALL
    }
  • possible_keys
  • key
  • key_len
  • ref
  • rows
  • Extra

索引优化

索引失效的原因
image

查询截取分析

查询优化

  • 小表驱动大表
    A表大于B表A in B;
    A表小于B表A exists B

  • ORDER BY优化

    • 使用index,不用filesort(需要符合最佳左前缀原则)
    • 避免单路排序失效
      1. 增大sort_buffer_size参数的设置
      2. 增大max_length_for_sort_data参数的设置
  • GROUP BY优化

    • 同ORDER BY
    • 能用where不用having

慢查询日志
show profile
全局查询日志

Mysql锁机制

  • 表锁(偏读):读锁会阻塞写,但是不会阻塞读,写锁会把读和写都阻塞。
  • 行锁(偏写):无索引行锁升级为表锁
    InnoDB与MyISAM的最大不同有两点:一是支持事务;二是采用了行级锁。
    事务及其ACID属性:
    image
    并发事务处理带来的问题:
    1. 更新丢失
    2. 脏读:事务A读取到了事务B已修改但尚未提交的数据
    3. 不可重复读:事务A读取到了事务B已提交的修改数据,不符合隔离性
    4. 幻读:事务B里新增了数据
      image
      Mysql事务隔离级别默认为可重复读
      间隙锁:查询过程通过范围查找的话,他会锁定整个范围内的所有的索引键值,即使这个键值并不存在。

面试题:如何锁定一行?加for update
image

  • 页锁

主从复制

image

posted @ 2022-07-06 21:35  改冩自己ζ  阅读(27)  评论(0)    收藏  举报