可有可无的Mysql工作技巧 2

2023-11-09

你有一个订单表:

CREATE TABLE `sales_engineering_order_tmp` (
  `id` VARCHAR(32) NOT NULL COMMENT '主键ID',
  `order_no` VARCHAR(50) NOT NULL COMMENT '订单编号',
  `sync_dt` DATETIME DEFAULT NULL COMMENT '传单时间',
  `org_id` VARCHAR(32) NOT NULL COMMENT '商场id',
  `deleted` TINYINT(1) DEFAULT '0' COMMENT '是否删除',
  `creator` VARCHAR(50) NOT NULL COMMENT '创建人',
  `creator_id` VARCHAR(32) NOT NULL COMMENT '创建人id',
  `create_dt` DATETIME NOT NULL COMMENT '创建时间',
  `last_updator` VARCHAR(50) NOT NULL COMMENT '最后修改人',
  `last_updator_id` VARCHAR(32) NOT NULL COMMENT '最后修改人id',
  `last_update_dt` DATETIME NOT NULL COMMENT '最后修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_order_no` (`order_no`),
  KEY `idx_order_org_id` (`org_id`),
  KEY `idx_order_creator_id` (`creator_id`),
  KEY `idx_order_sync_dt` (`sync_dt`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='工程单临时表';

背景:该表的数据量 1KW行,大小的话几十G
需求:找到各个800商场 (org_id)的最近传单(sync_dt)的一条单。800个商场,查出来最多800单

简单总结一下:慢查询的步骤

前步骤:慢查询日志
前步骤:通过 show processlist定位慢查询(正在运行中)
第一步,explain 看执行计划;
第二步,如果开启了 show profile,去看看该query id 的 每个状态 及其耗时时间;
第三步,用 trace 追踪 优化器是如何选择执行计划的。主要又 准备阶段 优化阶段 和 执行阶段。

不论是宽表还是窄表,它们一定各自都会有相应的优缺点

窄表较多,数据列会更加分散,编写关联查询的难度就会很大
数据项会有不同的安全级别,宽表中涉及的列过多,数据权限的管理会带来很大的挑战
窄表数据量通常较少,但是等量的数据项会创建更多的表,管理难度大
宽表数据量通常较大,单表占据的存储空间过大,会降低排序、分组等查询的性能

合理的索引是提升性能的关键

我们对索引的概念一定不会陌生,它能够加速表数据的查询,但是相应的,它也会占据一定的存储空间,也就是典型的以空间换时间的优化策略。另外,索引的存在,也会使插入、删除、更新的性能降低,因为这些操作都会伴随着索引的修改。所以,这一条设计规范所要追求的是空间与时间的平衡,达到既不占用过多的存储空间,也有较高的查询性能。

索引要建的合理,就必须要知晓并理解 MySQL 中索引创建和使用的特性:
一定要为作为搜索条件的字段创建索引,不是搜索条件的字段建索引反而会降低使用性能
选择区分度高的字段作为索引字段,重复性高的字段不要加索引,联合索引存在 “ 最左前缀 ” 的特性,不要建多余的索引。最后,如果一张表中已经存在了大量的数据,再去创建索引的过程会相当漫长,且可能会影响线上服务。此时,应该评估是否是在原表上增加索引还是创建新表并迁移数据。

索引

10 为什么添加索引能提高查询速度
11 哪些情况需要添加索引?
12 普通索引和唯一索引有哪些区别?
13 联合索引有哪些讲究
14 为什么MySQL会选错索引?

15 全局锁和表锁什么场景会用到
16 行锁:InnoDB替代MyISAM的重要原因
17 间隙锁的意义
18 为什么会出现死锁?
19 数据库忽然断电会丢数据吗?

事务

20 MVCC怎么实现的
21 不同事务隔离级别有哪些区别
22 养成好的事务习惯
23 细聊分布式事务
24 如何预防SQL注入

工作常见技能

25 主键是否需要设置为自增
26 MySQL是否需要开启查询缓存-
27 使用读写分离需要注意哪些?
28 哪些情况需要考虑分库分表?
29 如何安全高效地删除大量无用数据?
30 使用MySQL时,应用层可以这么优化

在这里插入图片描述

1架构 :如何设计一个关系性数据库呢?尽可能减少I/O

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2索引 --问题与思考

在这里插入图片描述
在这里插入图片描述

3锁模块 --问题与思考

在这里插入图片描述

1 MyISAM 与InnoDB关于锁方面的区别是什么?

在这里插入图片描述

注意MyISAM存储引擎分析如下:表级锁

MyISAM对 select 查询的时候会加上表级别的读锁,update,delete,insert的时候会加上表级别的写锁,两个select就是两个读锁,上了两个共享锁

上锁

lock tables 你的表名  read/write

释放锁

unlock tables ;

MyISAM 先写后读,先写后写 会block 写锁也叫排他锁

在这里插入图片描述

MyISAM Select 也有排他锁

在这里插入图片描述

InnoDB使用二段锁:加锁和解锁分为两个步骤,autocommit设置有关

在这里插入图片描述

上读锁
在这里插入图片描述

InnoDB对select 进行了改进

结论1:Innodb在没有用到索引的时候,用的是表级锁 IS IX

结论2:Innodb在用到索引的时候,用的是行级锁/Gap锁

表级别锁直接在表的头部加上锁,所以锁的开销会比较小,行级锁需要扫描到表的该行去上锁。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4关键语法 – 复杂SQL常出的Group by 和 Having

5理论范式:SQL相关的经典书籍

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可有可无的Mysql工作技巧 2 的相关文章

随机推荐