软件测试学习笔记丨数据库进阶及redis数据库

在这里插入图片描述

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32358

一、数据库进阶

1.1 MySQL中SQL执行原理

1. SQL语句执行过程

2. Server组件

  • 连接器:连接管理,权限验证
  • 查询缓存:命中直接返回结果
  • 分析器:语法分析
  • 优化器:生成执行计划,选择索引
  • 执行器:操作引擎,返回结果

1.2 索引

1. 定义

  • 索引是存储的表中,一个特定列的值数据结构;
  • 索引包含一个表中列的值,并且这些值存储在一个数据结构中。

2. 分类

  • 单列索引
    • 普通索引
    • 唯一索引:允许NULL值
    • 主键索引:不允许NULL值
  • 组合索引
  • 全文索引
    3. 优劣势
  • 优势:
    • 提高数据检索的效率,降低数据库的IO成本;
    • 通过索引对数据进行排序,降低数据排序的成本,降低CPU的消耗。
  • 劣势:
    • 占用空间;
    • 降低更新表的速度;
    • 需要花时间研究建立最优秀的索引,或者优化。

4. 适用场景

  • 主键自动建立唯一索引;
  • 频繁作为查询条件的字段,应该创建索引;
  • 查询中与其他表关联的字段,外键关系建立索引;
  • 查询中排序的字段。

1.3 explain

1. 执行计划

  • 模拟优化器执行SQL查询语句;
  • 分析查询语句或是表结构的性能瓶颈。

2. 使用

  • explain的基本用法:
    • explain命令用于展示SQL查询的执行计划。它可以帮助我们理解查询是如何被优化器处理的,包括使用的索引、表扫描方式等。
  • MySQL中的explain:
    • 在MySQL中,可以已使用explain关键字来查询计划。
    • 比如,有一个orders的表,并且想查询 SELECT * FROM orders WHERE order_date > '2023-01-01' 的执行计划,可以写:

EXPLAIN SELECT * FROM orders WHERE order_date > '2023-01-01'

  • 这会返回一系列的信息,每一行对应查询计划的一部分:
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | orders| range | order_date    | order_date| 5       | NULL  | 1000| Using where |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
  • id :查询的顺序;
  • select_type:选择类型;
  • table:被查询的表名;
  • type:访问类型(如 ALL, index, range 等);
  • possible_keys :列出了可能使用的索引;
  • key :显示了实际使用的索引;
  • ref :显示了使用的引用列;
  • rows :预计的行数;
  • Extra :列提供了额外的信息。

3. 作用

  • 表的读取顺序;
  • 数据读取操作的操作类型;
  • 哪些索引可以使用;
  • 哪些索引被实际使用;
  • 表之间的引用;
  • 每张表有多少行被优化器查询。

4. 实例

假设有如下三个表:

  • employees 表,包含员工信息,如 employee_id, name, department_id
  • departments 表,包含部门信息,如 department_id, department_name
  • salaries 表,包含员工薪资信息,如 employee_id, salary, effective_date

现在要找出所有在 sales 部门工作的员工的姓名和薪资。可以这样写 SQL 查询:

SELECT e.name, s.salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN salaries s ON e.employee_id = s.employee_id
WHERE d.department_name = 'sales';

使用 EXPLAIN,查看这个查询的执行计划:

EXPLAIN SELECT e.name, s.salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN salaries s ON e.employee_id = s.employee_id
WHERE d.department_name = 'sales';

1.4 事务

1. 概念

  • 数据库事务(transaction)是一组SQL语句的集合,用来完成一个特定的业务逻辑。这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。
  • 数据库事务是数据库操作的基本单位。

2. 特点 ACID

  • 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败,不能只执行一部分操作。
  • 一致性(Consistency):事务开始前和结束后,数据库都必须处于一致性的状态。
  • 隔离性(Isolation):并发执行的事务之间不能互相干扰,每个事务看起来就像是在独立的系统中运行一样。

3. 事务操作

  • begin:事务开始
  • rollback:事务回滚
  • commit:事务提交

4. 实例

  • 假设有一个简单的转账场景,从账户A向账户B转账100元。这个操作涉及到两个步骤:
  1. 从账户A扣除100元;
  2. 向账户B增加100元。
-- 开始事务
BEGIN TRANSACTION;-- 执行转账操作
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';
UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';-- 提交事务
COMMIT;-- 如果在转账过程中出现了任何问题(例如,账户A余额不足),则可以通过回滚事务来撤销所有的更改:ROLLBACK;

在这个例子中,如果第一步成功执行了,但第二步出错,那么整个事务都会被回滚,不会让账户A的余额减少而账户B的余额不变,从而保证了一致性和完整性。

1.5 日志

  • 查看数据库的日志对于监控和优化系统的性能至关重要。

1. 统计日志

  • show log:慢查询日志,超出预设的 long_query_time 阈值的SQL记录;
  • general log:全局查询日志,所有SQL查询的记录。

2. 查看慢查询日志

  • 查看日志开关:show variables like '%query%'
  • 打开日志开关:set global slow_query_log='ON'
  • 设置阈值:set long_query_time=0.01
  • 执行SQL语句;
  • 查看日志内容。

3. 在表中查看日志

  • 修改日志存放方式:set global log_output = 'table'
  • 查看表中内容:select * from mysql.slow_log

4. 查看全局查询日志

  • 查看变量信息:show variables like '%general'
  • 打开日志开关:set global general_log = 'ON'
  • 执行SQL语句;
  • 查看表中日志内容:select * from mysql.general_log

二、Redis内存数据库

2.1 简介

  • 是一款完全开源免费的高性能的 Key-value 键值存储数据库,广泛用于缓存、消息队列以及实时数据分析等多种应用场景。
  • 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载并使用;
  • 不仅支持简单的 Key-value 类型的数据,还提供list、set、zset、hash等数据结构的存储;
  • 支持数据的备份,即 master-slave 模式的数据备份;
  • 性能极高,Redis能读的速度是110000次/s,写的速度是81000次/s;
  • Redis的所有操作都是原子性的,要么全部执行成功,要么失败完全不执行。单个操作时原子性的,多个操作也支持事务,通过 MULTI 和EXEC 指令包起来;
  • 支持 publish/subscribe 、通知、key过期等特性。

2.2 基本概念

  • 键值存储:Redis存储数据的方式是键值对的形式,其中键Key通常是字符串,值value可以是多种数据类型。
  • 内存存储:Redis将数据存储在内存中,这使得它的读写速度非常快。
  • 持久化:尽管Redis主要在内存中工作,但它也支持将数据持久化到磁盘上,以防数据丢失。
  • 网络服务:Redis作为一个网络服务运行,客户端可以通过TCP或Unix socket与其通信。

2.3 特性

  1. 高性能:由于数据存储在内存中,Redis 能够实现非常高的读写速度。
  2. 丰富的数据结构:除了简单的键值对之外,Redis 还支持多种复杂的数据结构。
  3. 主从复制:Redis 支持主从复制,可以实现数据的备份和读写分离。
  4. 事务支持:Redis 支持事务,可以保证一组操作的原子性。
  5. Lua 脚本支持:允许用户编写 Lua 脚本来执行复杂的操作。
  6. 发布/订阅模式:Redis 支持发布/订阅模式,可以实现消息传递功能。
  7. 持久化:支持两种持久化策略,RDB 快照和 AOF 日志。

2.4 数据类型

  1. String(字符串):最简单的一种数据类型,可以存储任意类型的数据。是二进制安全的 , 意思是 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象;最大能存储 512MB 。
  2. Hash(哈希):类似于 Map,存储键值对的集合。一个 string 类型的 key 和 value 的映射表, hash 特别适合用于存储对象;存储 232 -1 键值对( 40 多亿)。
  3. List(列表):链表结构,适合用于消息队列。按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)。可存储 232 - 1 元素 ( 每个列表可存储 40 多亿 )。
  4. Set(集合):存储没有重复元素的字符串集合。无序集合,通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1) 。
  5. Sorted Set(有序集合):有序集合每个元素都会关联一个 double 类型的分数, redis 正是通过
    分数来为集合中的成员进行从小到大的排序; zset 的成员是唯一的 , 但分数 (score)
    却可以重复。

2.5 常用命令

String

  • SET key value:设置键 key 的值为 value
  • GET key:获取键 key 的值。

Hash

  • HSET key field value:设置哈希表 key 中的字段 field 的值为 value
  • HGET key field:获取哈希表 key 中字段 field 的值。

List

  • LPUSH key value:将一个值 value 通过表头插入到列表 key 中。
  • LPOP key:移除并返回列表 key 的头部元素。

Set

  • SADD key member:将成员 member 添加到集合 key 中。
  • SMEMBERS key:返回集合 key 中的所有成员。

Sorted Set

  • ZADD key score member:将成员 member 添加到有序集合 key 中,并指定其分数 score
  • ZRANGE key start stop:返回有序集合 key 中指定范围内的成员。

2.6 下载安装

1、将下载好的文件解压,将文件夹重命名为Redis,此文件只需解压无需安装;

2、打开一个cmd窗口,使用cd命令切换到步骤1里存放的路径

3、运行redis-server.exe redis.windows.conf

  • 如果运行报错,可以使用解决方案:win+R 然后输入 services.msc ,调出 Windows 服务,然后
    找到 Redis ,右键手动停止。

4、另起一个cmd窗口,原来的窗口不要关闭,都则无法访问服务器。再切换到redis目录下运行:redis-cli.exe -h 127.0.0.1 -p 6379


在这里插入图片描述

2.7 使用

  • 假设需要存储一个用户的购物车信息,其中包含商品 ID 和数量。可以使用 Hash 数据结构来存储这些信息:
HSET cart:123 item:1001 2  # 用户 123 的购物车中商品 1001 的数量为 2
HSET cart:123 item:1002 1  # 用户 123 的购物车中商品 1002 的数量为 1
  • 然后可以使用 HGETALL 命令来获取购物车中所有的商品和数量:
HGETALL cart:123
  • 这将返回这样的结果:
1) "item:1001"
2) "2"
3) "item:1002"
4) "1"

在这里插入图片描述

推荐学习

【霍格沃兹测试开发】7天软件测试快速入门带你从零基础/转行/小白/就业/测试用例设计实战

【霍格沃兹测试开发】最新版!Web 自动化测试从入门到精通/ 电子商务产品实战/Selenium (上集)

【霍格沃兹测试开发】最新版!Web 自动化测试从入门到精通/ 电子商务产品实战/Selenium (下集)

【霍格沃兹测试开发】明星讲师精心打造最新Python 教程软件测试开发从业者必学(上集)

【霍格沃兹测试开发】明星讲师精心打造最新Python 教程软件测试开发从业者必学(下集)

【霍格沃兹测试开发】精品课合集/ 自动化测试/ 性能测试/ 精准测试/ 测试左移/ 测试右移/ 人工智能测试

【霍格沃兹测试开发】腾讯/ 百度/ 阿里/ 字节测试专家技术沙龙分享合集/ 精准化测试/ 流量回放/Diff

【霍格沃兹测试开发】Pytest 用例结构/ 编写规范 / 免费分享

【霍格沃兹测试开发】JMeter 实时性能监控平台/ 数据分析展示系统Grafana/Docker 安装

【霍格沃兹测试开发】接口自动化测试的场景有哪些?为什么要做接口自动化测试?如何一键生成测试报告?

【霍格沃兹测试开发】面试技巧指导/ 测试开发能力评级/1V1 模拟面试实战/ 冲刺年薪百万!

【霍格沃兹测试开发】腾讯软件测试能力评级标准/ 要评级表格的联系我

【霍格沃兹测试开发】Pytest 与Allure2 一键生成测试报告/ 测试用例断言/ 数据驱动/ 参数化

【霍格沃兹测试开发】App 功能测试实战快速入门/adb 常用命令/adb 压力测试

【霍格沃兹测试开发】阿里/ 百度/ 腾讯/ 滴滴/ 字节/ 一线大厂面试真题讲解,卷完拿高薪Offer !

【霍格沃兹测试开发】App自动化测试零基础快速入门/Appium/自动化用例录制/参数配置

【霍格沃兹测试开发】如何用Postman 做接口测试,从入门到实战/ 接口抓包(最新最全教程)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1560202.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

秋天来临,猫咪又到换毛季,掉毛严重怎么办?宠物空气净化器有用吗?

秋天到了,新一轮的宠物换毛季又来了。谁能想到这只胖猫和之前刚接回来时的皮包骨小猫是同一只!除了养了一年长了些肉外,更多的都是换毛季掉毛”膨胀“的。每天下班回家都要搞卫生,家里衣服上、地板上,目光所及之处都有…

acwing:1576. 再次树遍历

打卡一道有意义的题。 题签: 通过使用栈可以以非递归方式实现二叉树的中序遍历。 例如,假设遍历一个如下图所示的 66 节点的二叉树(节点编号从 11 到 66)。 则堆栈操作为:push(1); push(2); push(3); pop(); pop(); pu…

智能配音软件哪款好?分享5个搞怪软件

想要让视频或社交媒体内容更加生动有趣?搞笑配音软件是个不错的选择。 无论是嘻哈风格的视频,还是搞怪的段子,合适的配音都能让内容增色不少。 今天,就让我们来探索六个文字配音软件,它们不仅能帮你实现搞笑配音&…

H5如何做性能测试?

说起H5性能测试,可能许多同学有所耳闻,但是不知道该如何去做性能测试,或者不知道H5应该关注哪些性能指标。今天我们就来看下。希望阅读本文后,能够有所了解。 常用指标 1、H5性能相关参数介绍 白屏时间:用户首次看到…

L16171819 【哈工大_操作系统】进程同步与信号量信号量临界区保护信号量的代码实现死锁处理

L2.9 进程同步与信号量 让进程走走停停,实现进程同步。 1.、信号量的定义 生产者Producer需要判断是否还有空闲缓冲区生产资源,所以定义一个标志empty,初始值为最大可用资源数,在开头维护;同时,在消费者…

3-GPIO八大输出模式 推挽输出 与 开漏输出

推挽输出 与 开漏输出 GPIO有八大输出模式 下图为每个GPIO口的基本结构: 通过这张图来学习 最右侧是I/O引脚,是从STM32引脚到GPIO口的导线,与其他芯片进行连接的线。 芯片内部电路所能承受的电压有限,当未知的静电进入GPIO口&a…

selenium:Select类操作复选框和下拉框(7)

复选框/下拉框操作的Select类 主要使用selinium中的类Select来模拟选择网页上的下拉框或者复选框中的内容,使用前先导入 from selenium.webdriver.support.ui import Select 主要方法如下: 函数 功能 select_by_value 根据复选框/下拉框的值选择 se…

视觉检测系统实时识别工地安全帽佩戴情况

在建筑工地上,工人佩戴安全帽是确保施工安全的基本措施。然而,工人有时因疏忽或其他原因未能及时佩戴安全帽,这可能导致严重的安全隐患。传统的人工监督往往无法实现对工地的全覆盖或全天候监控,效率低下,容易出现漏检…

【GESP】C++一级练习BCQM3034,还是浮点数计算,国庆七天乐

一道又回到简单浮点数计算水平的题,巩固基本语法练习。 题解详见:https://www.coderli.com/gesp-1-bcqm3034/ 【GESP】C一级练习BCQM3034,还是浮点数计算,国庆七天乐 | OneCoder一道又回到简单浮点数计算水平的题,巩固…

SpringBoot+XXL-JOB:高效定时任务管理

前言 在现代应用程序中,定时任务是不可或缺的一部分。Spring Boot 和 XXL-Job 为你提供了一个强大的工具组合,以简化任务调度和管理。 本文将带领你探索如何将这两者集成在一起,实现高效的定时任务管理。无论你是初学者还是有经验的开发者&…

IDM6.42下载器!下载速度就像坐上了火箭,嗖嗖的快到飞起!

亲爱的朋友们,今天我要给大家安利一款下载神器——Internet Download Manager 6.42(简称IDM)!这款软件简直就是下载界的“速度与激情”,用了它之后,你会发现下载速度就像坐上了火箭,嗖嗖的快到飞…

货车一键启动正确方法,新手司机可以看看,汽车,驾驶技巧

货车无钥匙进入一键启动手机联控等配置高到满足您对货车的所有期待 ,由于霸气的外观和较高的配置,深受国内货车用户关注。 ‌货车一键启动手机控车是一种通过智能手机应用程序(APP)控制汽车启动和多种车辆功能的智能化系统。‌ 这…

手机怎么玩七龙珠电光炸裂0?GameViewer远程助你手机畅玩七龙珠

《七龙珠 电光炸裂!ZERO》将于2024年10月11日上线!你不仅可以在电脑上玩七龙珠电光炸裂0,而且手机也能免费玩这个电脑游戏,使用网易GameViewer远程就能让你随时随地玩七龙珠电光炸裂0。你还能享受4K蓝光144帧的高画质,…

攻防世界(CTF)~Reverse-easyRE1

题目介绍 下载附件后一个32位一个64位 64位的放到ExeinfoPE查看一下有无壳子(无壳) 放IDA看一下伪代码,习惯性看一下main函数,直接发现了flag flag{db2f62a36a018bce28e46d976e3f9864}

手动降级wsl中的numpy

下载完pytorch之后想验证一下cuda好不好使&#xff0c;在测试的时候发现一个warning python中报错如下 我下载的pytorch版本比较低&#xff0c;numpy太高&#xff0c;所以需要手动给numpy降级 pip install numpy\<2 降级后再进到python验证cuda就没有warning和报错了&…

一文读懂Spring Security的工作原理和应用(面试经)

导览 前言Spring Security必学必看1. 简介2. 架构2.1 认证2.2 授权 3. 对策 结语精彩回顾 前言 博主精心准备的一文读懂Spring系列文章&#xff0c;旨在通过简洁精炼的语言&#xff0c;展现Spring内部精妙的设计思想。我们知道Spring是一个web容器&#xff0c;不知道的同学&am…

无人机之穿越机飞行注意事项

一、选择合适的场地 1、寻找空旷、无障碍物的区域&#xff0c;如大型公园的空旷草坪、专门的无人飞行场地等。这样可以减少碰撞的风险&#xff0c;确保飞行安全。 2、避免在人群密集的地方飞行&#xff0c;防止对他人造成伤害。例如&#xff0c;不要在商场、学校、体育场等人…

【Linux第一弹】- 基本指令

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

在双十一必买的好物有哪些?盘点五大必买好物清单!

随着2024年双十一购物狂欢节的临近&#xff0c;消费者们正热切期待着这一年度盛事的到来。作为一年中最具影响力的购物节日之一&#xff0c;双十一不仅为消费者带来了前所未有的优惠力度&#xff0c;更是各大品牌展示新品、推广好物的绝佳时机&#xff0c;在众多商品中&#xf…

在spring生命周期中对bean方法进行增强

概述 开发中有时候需要对某个bean进行整体的加强&#xff0c;但是当前代码中有很多地方使用这个bean的不同方法&#xff1b;又不想同时修改这些地方留下修改记录 所以我的想法是在spring初始化bean过程中用自己的增强bean进行增强&#xff0c;不侵入业务代码&#xff1b; 整体…