可有可无的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 的相关文章

  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 无法在 Mac 上启动 MySQL

    使用 Brew 安装后 我无法运行 MySQL 我使用的是 OS X El Capitan 版本 10 11 3 和 MySQL Server 版本 5 7 11 当我启动服务器时 我收到 启动 MySQL 错误 服务器退出而不更新 PID
  • 用 pandas DataFrame 替换 mysql 数据库表中的行

    Python 版本 2 7 6 熊猫版本 0 17 1 MySQLdb 版本 1 2 5 在我的数据库中 PRODUCT 我有一张桌子 XML FEED 表 XML FEED 很大 数百万条记录 我有一个 pandas DataFrame
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • SQL Server 连接其他表中不存在的位置

    Service Asset AssetService Id Name Id Name AssetId ServiceId
  • MySQL/PDO::quote() 尽管使用 PDO::PARAM_INT 参数,但仍在整数周围加上引号

    无论我传递给什么值 数据类型对 它都会出现 pdo gt quote value type 它总是将其引用为字符串 echo pdo gt quote foo PDO PARAM STR foo as expected echo pdo g
  • 提高第一个查询的性能

    如果执行以下数据库 postgres 查询 则第二次调用要快得多 我猜第一个查询很慢 因为操作系统 linux 需要从磁盘获取数据 第二个查询受益于文件系统级别和 postgres 中的缓存 有没有一种方法可以优化数据库以快速获得结果fir
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • 解析带下划线的 SQL Server 数字文字

    我想知道它为什么有效以及为什么它不返回错误 SELECT 2015 11 Result 11 2015 第二种情况 SELECT 2 1 a a 2 1 检查元数据 SELECT name system type name FROM sys
  • 数字表与递归 CTE 生成一系列数字

    为什么使用数字表比使用递归 CTE 动态生成它们要快得多 在我的机器上 给定一张桌子numbers单列n 主键 包含从1到100000的数字 查询如下 select n from numbers 大约需要 400 毫秒才能完成 使用递归 C
  • 从 Getdate() 获取时间

    我想采取Getdate 结果 例如 2011 10 05 11 26 55 000 into 11 26 55 AM 我看过其他地方并发现 Select RIGHT CONVERT VARCHAR GETDATE 100 7 这给了我 11
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • PHP 与 MySQL 查询性能( if 、 函数 )

    我只看到这个artice http www onextrapixel com 2010 06 23 mysql has functions part 5 php vs mysql performance 我需要知道在这种情况下什么是最好的表
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • mysql排序和排名语句

    我需要一些 mysql 语句的帮助 我的表 1 有 7 列 表 2 有 8 列 额外的列名为排名 我的语句应该是这样的 从表 1 中选择全部 然后按 用户数 排序 将其插入表 2 中并排名开始 1 2 3 等 table 1 usernam
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 使用加权行概率从 PostgreSQL 表中选择随机行

    输入示例 SELECT FROM test id percent 1 50 2 35 3 15 3 rows 你会如何编写这样的查询 平均 50 的时间我可以获得 id 1 的行 35 的时间 id 2 的行 15 的时间 id 3 的行
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装

随机推荐