首页 > 数据库 >Mysql-二刷一些重要知识点记录

Mysql-二刷一些重要知识点记录

时间:2023-06-24 12:57:40浏览次数:56  
标签:知识点 二刷 DDL DML 查询 索引 内存 Mysql 排序

  1. 执行DDL的时候,即使此DDL被其他DML阻塞了,但是后续DML都会被此DDL阻塞

    (个人理解:DDL、DML按照申请顺序排队执行)[DML加MDL读锁,DDL加MDL写锁,读写之间互斥]

    使用online ddl也就不害怕线上DDL了

  2. change buffer存储inser 和 update的数据。如果不马上查询,起到加速DML的作用

  3. [尽量使用普通索引代替唯一索引]唯一索引因为要校验唯一性,因此不会使用change buffer

  4. [索引长度尽量控制短一些]索引一页的大小16B,因此长度过长单页上存储的数据就少,查询效率就低一些,因此对于一些字符串索引使用 select count(distinct left(room_id, 4)) from live_playback 来找到包含95%的长度即可

  5. [Mysql策略:内存中有一定是正确的,内存中没有磁盘一定是正确的]

    因此从内存淘汰脏页会flush到磁盘的

  6. [监控redo log和脏页使用率]

    因为redo log满了则mysql的update等只能阻塞等flush到磁盘后操作了,业务无法接受的性能。

    因为脏页过多,如果一次查询需要淘汰的脏页多的话,需要等flush到磁盘后再执行,业务无法接受的性能。

  7. [删除记录不会让空间缩小]

    数据页单个记录删除,删除的记录被标记为可复用(复用的位置,新增的记录必须满足原记录的范围关系,比如删除的记录左右两边范围是(600,800),那只有这个区间的插入才能复用到)

    数据页整个页删除,删除的页被标记为可复用(这个页可以被直接应用)

    随机插入,如果某个数据页满了,会也分裂,导致原页尾部空间的浪费

  8. 重建表alter table t engine=InnoDB每个数据页会预留1/16的空间,因此其也不是最紧凑的。这个命令在mysql5.6后是online ddl了

  9. [count(*)效率最高,因为Mysql针对其进行了优化]

    首先,其会在逻辑正确下,找最小的索引数进行统计
    然后,它也不会取出字段值,直接让server层累加

    count(字段)<count(主键id)<count(1)≈count(*)

  10. [order by无法借助索引,则会使用设定的内存排序,大小不足借助磁盘使用归并排序]

    select a,b,c from table where b='xx' order a limit 1000

    • 全字段排序
      • 所有需要返回字段长度<设定的max_length_for_sort_data,排序使用(a,b,c)全字段
    • rowid排序
      • 排序使用(a,id)字段排序,排序后根据limit 1000 按照id回表聚簇索引,将a,b,c返回
    • 联合索引(b,a),即可通过索引避免排序
  11. [using temporary使用memory内存引擎,因此再其基础上的排序,优先使用rowid]

    因为内存排序,字段越少,sort buffer空间有限时,能排序的越多

    当然,小于tmp_table_size使用memroy内存临时表(默认16M),大于的话只能使用磁盘临时表了

  12. [索引失效:加函数、类型隐式转换、字符集不一致]

    说到底都是因为查询的字段加了函数,导致索引失效

    • mysql默认将字符串转为数值,因此 varchar(32) b = 100,实际是cast(b int) = 100,索引失效
    • 表的字符编码不一致,mysql默认转为父类的编码进行处理
  13. [字符串查询大坑]

    https://www.cnblogs.com/ningxinjie/p/17336895.html

    [最下面上期问题时间]内详细说明

    根据字符串字段设定长度阶段 + 查询 + server判断

    比如字段b是varchar(4),数据库中b的值为1234有10万行,我们要查询b='12345',mysql会先截断前4位1234,然后查询,因为select *,因此一个个回表,然后server判断1234!=12345,最后返回为空。

    因此这条查询语句执行是非常慢的

    那业务该如何避免呢?

    1. b区分区太低了,比如1234有10万行,这种如果是随机产生的,直接存到es中,使用倒排索引形式供用户或者业务查询
    2. 如果是业务含义,长度固定为4的话,则查询前校验合法性,比如长度不是4那不合法,直接报错返回,就不要查db了
  14. [RR引入间隙锁的目的是为了解决binlog记录内容回放与实际执行不一致]

    在读已提交下,不引入间隙锁,使用binlog的row格式即可解决

  15. [加锁分析精髓都在这了:https://www.cnblogs.com/ningxinjie/p/17336904.html]

    • 2个原则
      • 加锁单位是next-kye-lock,即前开后闭
      • 访问到的才会加锁
    • 2个优化(都是针对索引的等值查询
      • [等值查询时]唯一索引存在,则next-kye-lock退化为行锁
      • [等值查询时]向右遍历最后一个值不满足,则next-kye-lock退还为间隙锁,即前开后开
    • 1个bug
      • 唯一索引的范围查询也会访问到不满足第一个值为止(即不论你是普通索引还是唯一索引,找到当前值,也会继续找下一个,即使唯一索引下一个值一定不满足,也会找,访问到的就会加锁)

标签:知识点,二刷,DDL,DML,查询,索引,内存,Mysql,排序
From: https://www.cnblogs.com/ningxinjie/p/17500931.html

相关文章

  • 一天吃透MySQL面试八股文
    内容摘自我的学习网站:topjavaer.cn什么是MySQLMySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据,列代表该行中的每个值。列上的值是有数据类型的,比如:整数、字符串、日期等等。数据库的三......
  • MySQL的wait_timeout 参数 set global 设置不生效
    MySQL服务连接数突然暴增,登录服务查看大都是sleep进程,并且1分钟会启用一个新的连接,紧急处理方案是需要手动去释放连接数。登录服务器查看当前超时时间mysql>showvariableslike'%timeout%';+-----------------------------+----------+|Variable_name|Valu......
  • MySQL 中常见的高可用架构部署方案
    MySQL中常见的高可用架构部署方案IT奋斗的青年 2023-06-0608:36 发表于山东收录于合集#mysql17个MySQL中的集群部署方案前言这里来聊聊,MySQL中常用的部署方案。MySQLReplicationMySQLReplication 是官方提供的主从同步方案,用于将一个MySQL的实例同步到另......
  • mysql的读写分离
    读写分离的作用和实现的方式实验环境:上文的主从复制,以及新增了一台客户端进入主mysql数据库创建读写分离账号查看建立的读写分离账号挂载云计算光盘移动解压jdk一直回车后看到此询问输入yes将Java环境从1.8.0_131更改为1.6.0_14修改环境变量添加此三行数据移动jdk安装位置更新环境......
  • 通过Maxwell同步mysql数据至kafka
    实验环境本地虚拟机maraidb10.8.8kafka2.12-3.3.1maxwell由容器部署1mariadb1.1配置log_bin配置文件中加入如下内容server-id=111log_bin=mysql-binbinlog_format=ROWexpire_logs_days=1重启服务systemctlrestartmariadb查询命令SHOWVARIABLESLI......
  • debezium同步mysql数据至kafka(未完待续)
    实验环境全部部署于本地虚拟机1mysql参考官方文档和根据官方示例镜像(debezium/example-mysql,mysql版本为8.0.32)1.1创建用户官方镜像里一共有三个账号debezium:connect用户mysqluser:普通用户replicator:用于主从?设置命令createuser'debezium'@'%'identifiedby"db......
  • mysql基础
    一存储引擎1mysql存储引擎的种类:MYISAM InnoDB(默认)2.MYISAM和InnoDB的区别在于InnoDB支持事物处理和外键约束3.MYISAM和InnoDB的应用场景的区别:MYISAM不需要事物,空间小,已查询访问为主;InnoDB多删除,更新操作,安全性高,事物处理即并发控制查询存储文件showvariableslike'&sto......
  • mysql索引优点缺点及命令
    索引是什么:索引是对数据库表中一列或者多列的值进行排序的一种结构,使用索引可提高数据库中特定数据的查询速度。(索引本质上是数据库结构,拥有排序跟查找两种功能,可以理解为排好顺序,快速查询数据库)。索引优点:加快查询速度。创建唯一索引保证了数据的唯一性。3.实现数据的完整性,加速表......
  • springboot整合mysql和clickhouse多数据源
    1、添加依赖<!--MyBatis-PlusStarter--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency>......
  • NLP面试高频知识点整理分享(附详细中文答案)
       本项目是作者们根据个人面试和经验总结出的自然语言处理(NLP)面试准备的学习笔记与资料,该资料目前包含自然语言处理各领域的面试题积累。    资源整理自网络,源地址:https://github.com/km1994/NLP-Interview-Notes    内容涉及多次跳转,点击文末“阅读原文“”查看......