当前位置: 首页 > news >正文

《MySQL学习》 表中随机取记录的方式

一.初始化测试表

创建表 words

CREATE TABLE `words` ( `id` int(11) NOT NULL AUTO_INCREMENT, `word` varchar(64) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;

image-20230226220527540

插入测试数据

create procedure idata()begin declare i int;
set i = 0;
while i<10000 do insert into words(word) values(concat(char(97+(i div 1000)), char(97+(i % 1000 div 100)), char(97+(i % 100 div 10)), char(97+(i % 10))));
set i = i + 1;
end while;
end;;
call idata();

image-20230226221101102

二.rand()函数随机取出三行数据

常见的写法为,SQL虽然简单,但执行过程很复杂 rand() 取 0~1之间的值

select word from words order by rand() limit 3;

分析结果

explain select * from words w order by rand() limit 3

在这里插入图片描述

  1. Using temporary; 使用临时表
  2. Using filesort 使用内存排序

用到临时表的原因是 rand() 函数取得的随机值需要一个 表去存储,而 filesort 是用来排序的,不能直接放到排序内存中。 tmp_table_size 值规定了内存临时表的大小,超过该值将使用磁盘临时表。磁盘临时表使用的引擎默认是 InnoDB引擎,内存临时表使用的是memory 引擎 。 是由参数 internal_tmp_disk_storage_engine 控制的。

我们已知InnoDB排序有单路排序和双路排序,当排序的字段过长时,将使用双路排序导致要多回一次表,增加IO成本。但此时由于使用的是内存临时表,InnoDB将择优选择使用 双路排序,减少排序的字段。

这条语句的执行流程是这样的:

  1. 创建一个临时表。这个临时表使用的是 memory 引擎,表里有两个字段,第一个字段是 double 类型,为了后面描述方便,记为字段 R,第二个字段是 varchar(64) 类型,记为字段 W。并且,这个表没有建索引。

  2. 从 words 表中,按主键顺序取出所有的 word 值。对于每一个 word 值,调用 rand() 函数生成一个大于 0 小于 1 的随机小数,并把这个随机小数和 word 分别存入临时表的 R 和 W 字段中,到此,扫描行数是 10000。

  3. 现在临时表有 10000 行数据了,接下来你要在这个没有索引的内存临时表上,按照字段 R 排序。

  4. 初始化 sort_buffer。sort_buffer 中有两个字段,一个是 double 类型,另一个是整型。

  5. 从内存临时表中一行一行地取出 R 值和位置信息,分别存入 sort_buffer 中的两个字段里。这个过程要对内存临时表做全表扫描,此时扫描行数增加 10000,变成了 20000。

  6. 在 sort_buffer 中根据 R 的值进行排序。注意,这个过程没有涉及到表操作,所以不会增加扫描行数。

  7. 排序完成后,取出前三个结果的位置信息,依次到内存临时表中取出 word 值,返回给客户端。这个过程中,访问了表的三行数据,总扫描行数变成了 20003。

​ 首先从磁盘扫描10000条数据读入内存临时表中,然后从内存临时表中将10000条数据一条条读入排序内存中,期间使用优先队列排序获取最大的三个值,最后再回到临时表中根据位置信息读取三条记录的值返回。此处没有使用堆排序是由于只需要获取前三的值,没有必要将所有的数据都排序序。对于这 10000 个准备排序的 rowid(或主键索引),先取前三行,构造成一个堆;取下一个行 (R’,rowid’),跟当前堆里面最大的 R 比较,如果 R’小于 R,把这个 (R,rowid) 从堆中去掉,换成 (R’,rowid’);重复第 2 步,直到第 10000 个 (R’,rowid’) 完成比较。

​ 如果此处是limit 1000 ,那么维护一个排好序且大小是1000的堆还不如使用归并排序。

​ 但是使用rand()函数取随机值的方式使用不到索引的,效率很低

三.临时索引取随机值

select count(*) into @C from t;
set @Y1 = floor(@C * rand()); //取整
set @Y2 = floor(@C * rand());
set @Y3 = floor(@C * rand());
select * from t limit @Y1,1; 在应用代码里面取Y1、Y2、Y3值,拼出SQL后执行
select * from t limit @Y2,1;
select * from t limit @Y3,1;

用此种方式取随机数,扫描行数为 c(表总记录数) + Y1 +1 + Y2 +1 +Y3 +1 ,虽然扫描行数很多,但能利用索引,索引天然有序,效率非常高

相关文章:

《MySQL学习》 表中随机取记录的方式

一.初始化测试表 创建表 words CREATE TABLE words ( id int(11) NOT NULL AUTO_INCREMENT, word varchar(64) DEFAULT NULL, PRIMARY KEY (id)) ENGINEInnoDB;插入测试数据 create procedure idata()begin declare i int; set i 0; while i<10000 do insert into words…...

功率信号源有什么作用和功能呢

功率信号源是指集信号发生器与功率放大器为一体的电子测量仪器&#xff0c;它具有高电压、大功率的特点&#xff0c;在电子实验室中能够帮助用来驱动压电陶瓷、换能器以及电磁线圈等&#xff0c;可以有效的帮助电子工程师解决驱动负载和放大功率的问题。功率信号源和功率放大器…...

一些cmake error fixed

建完虚拟环境后 运行 pip install . 出现报错&#xff0c;显示svox2安装出错&#xff0c;然后开始进入到svox2中进行手动编译和安装。 1. cmake svox2/csrc pybind11找不到 conda install pybind11用 pip install 在虚拟环境中安装不行&#xff0c;据说会安装到全局下… 2. c…...

CentOS 7安装Docker并使用tomcat测试

文章目录环境准备Docker安装安装tomcat环境准备 CentOS 7以上版本linux内核版本需要在3.10以上&#xff0c;可通过uname -r 查看系统内核。 Docker安装 检查docker安装源 yum list docker yum安装docker &#xff1a; yum install docker.x86_64 启动 docker &#xff1a; s…...

隐私计算头条周刊(2.20-2.26)

开放隐私计算收录于合集#企业动态45个#周刊合辑45个#政策聚焦38个#隐私计算92个#行业研究37个开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播…...

安装kibana 报错/访问不了

安装kibana 报错1&#xff0c;elasticsearch.yaml 和kibana.yaml 配置问题2&#xff0c;elasticsearch 和kibana版本不一致3&#xff0c;索引问题1&#xff0c;elasticsearch.yaml 和kibana.yaml 配置问题 我的RPM安装的&#xff0c;配置文件都在/etc/ vim /etc/elasticsearc…...

【华为OD机试模拟题】用 C++ 实现 - 身高排序(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明身高排序题目输入输出示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:ht…...

MK60DX256VLQ10(256KB)MK60DN256VLQ10 Kinetis K60 MCU FLASH

MK60DX256VLQ10(256KB)MK60DN256VLQ10 Kinetis K60 MCU 32BIT 256KB FLASH 144LQFP【说明】Kinetis K6x MCU系列是一个可扩展的组合&#xff0c;具有不同级别的集成&#xff0c;提供丰富的模拟、通信、定时和控制外设套件&#xff0c;以适应广泛的需求。应用楼宇自动化控制器人…...

Prometheus 告警模块配置深度解析

本文您将了解到Prometheus 告警模块Alertmanager 配置的深度解析 Alertmanager 配置解析 Alertmanager 配置可以用命令行配置&#xff0c;也可以通过配置文件配置。命令行用来配置不可变的系统参数&#xff0c;配置文件用来定义限制规则用于通知路由和通知接收者。 Alertmana…...

《分布式技术原理与算法解析》学习笔记Day23

分布式数据复制 我们在进行分布式数据存储设计时&#xff0c;通常会考虑对数据进行备份&#xff0c;以提高数据的可用性和可靠性&#xff0c;“数据复制技术”就是实现数据备份的关键技术。 什么是数据复制技术&#xff1f; 在分布式数据库系统中&#xff0c;通常会设置主备…...

毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计

基于51单片机的手机蓝牙控制8位LED灯亮灭设计1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STC89C52单片机核心系统电路设计2.2 LED电路设计2.3 蓝牙模块电路设计3、部分代码展示3.1 定时器初始化以及中断处理3.2 串口初始化3.3 串口中断处理1、项目简介 选题指导&…...

一起Talk Android吧(第五百零八回:多层布局功能)

文章目录功能介绍使用方法示例代码各位看官们大家好&#xff0c;上一回中咱们说的例子是"图片滤镜ImageFilterView",这一回中咱们说的例子是" 多层布局功能"。闲话休提&#xff0c;言归正转&#xff0c; 让我们一起Talk Android吧&#xff01;功能介绍 我…...

丁小喜の兵器谱(学生管理系统)

我的第一个独立看需求完成项目&#xff0c;虽然很简单&#xff08;笑&#xff09;建立一个可以增加&#xff0c;修改&#xff0c;删除&#xff0c;展示学生信息的系统首先是一个界面&#xff0c;让你决定进行哪个操作1.2.3.4.5分别对应不同的操作&#xff0c;switch与这一操作完…...

linux:字符串拷贝的五种方法:使用指针下标,指针变量加偏移量,指针变量自加等

字符串数组名做函数形参&#xff0c;会退化正指针变量&#xff0c;需要使用指针变量操作字符串 代码&#xff1a; #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <s…...

cesium常用方法汇集(工具篇)

1.Scene.prototype.pickPositionWorldCoordinates 根据屏幕坐标获取世界坐标 2&#xff0c;Scene.prototype.pickPosition 根据屏幕坐标获取世界坐标 3&#xff0c;Scene.prototype.drillPick 通过屏幕坐标拾取多个对象 4&#xff0c;Scene.prototype.pickFromRay 通过射线拾…...

分布式一致性与共识算法(一)

这里写目录标题是什么ACIDCAP组合一致性概念共识为什么需要共识算法会如何发展列举Paxos算法ZAB&#xff08;Zookeeper Atomic Broadcast&#xff09;协议Raft 算法参考引用是什么 从实现效果上来说&#xff0c;很多人或多或少都了解或者设计过具有强一致性的系统。但是&#…...

C++---最长上升子序列模型---怪盗基德的滑翔翼(每日一道算法2023.2.27)

注意事项&#xff1a; 本题为"线性dp—最长上升子序列的长度"的扩展题&#xff0c;所以dp思路这里就不再赘述。 题目&#xff1a; 怪盗基德是一个充满传奇色彩的怪盗&#xff0c;专门以珠宝为目标的超级盗窃犯。 而他最为突出的地方&#xff0c;就是他每次都能逃脱中…...

Python 之 Pandas 文件操作和读取 CSV 参数详解

文章目录一、Pandas 读取文件二、CSV 文件读取1. 基本参数2. 通用解析参数3. 空值处理相关参数4. 时间处理相关参数5. 分块读入相关参数一、Pandas 读取文件 当使用 Pandas 做数据分析的时&#xff0c;需要读取事先准备好的数据集&#xff0c;这是做数据分析的第一步。Panda 提…...

微服务的异步通信技术RabbitMQ

文章目录前言1.WorkQueue&#xff08;工作队列&#xff09;消息预取机制2.Publish&Subscribe&#xff08;发布-订阅&#xff09;1.Fanout&#xff08;广播&#xff09;2.DirectExchange&#xff08;路由&#xff09;3.TopicExchange&#xff08;话题&#xff09;MQ的优点前…...

Word处理控件Aspose.Words功能演示:使用 C++ 在 Word (DOC/DOCX) 中添加或删除水印

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…...

从0到1构建DeepSeek抗注入能力:97.3%拦截率验证的5层LLM网关架构设计

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;从0到1构建DeepSeek抗注入能力&#xff1a;97.3%拦截率验证的5层LLM网关架构设计 为应对Prompt注入、越狱指令与上下文污染等高阶对抗攻击&#xff0c;我们设计并落地了一套轻量级、可插拔的5层LLM网关…...

WarcraftHelper技术方案:游戏兼容性修复工具的现代化适配实践

WarcraftHelper技术方案&#xff1a;游戏兼容性修复工具的现代化适配实践 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 随着Windows操作系统和硬件架…...

MyScaleDB:基于SQL的向量数据库实战,实现混合查询与AI应用开发

1. 项目概述&#xff1a;当向量数据库遇见SQL如果你最近在折腾大模型应用&#xff0c;尤其是想给AI应用加上“长期记忆”或者实现精准的文档问答&#xff0c;那你大概率已经听过“向量数据库”这个词。从早期的Milvus、Pinecone&#xff0c;到后来各大云厂商纷纷入局&#xff0…...

嵌入式与硬件设计前沿:IIoT、FIDO、TSN与GaN无线充电实战解析

1. 项目概述&#xff1a;一场面向硬件工程师的在线技术盛宴如果你是一名嵌入式系统开发者、汽车电子工程师&#xff0c;或者正在为你的智能硬件产品寻找无线充电方案&#xff0c;那么最近一段时间密集出现的线上技术研讨会&#xff0c;绝对值得你花时间关注。这不是泛泛而谈的理…...

终极指南:3分钟学会用Video-subtitle-extractor高效提取视频硬字幕

终极指南&#xff1a;3分钟学会用Video-subtitle-extractor高效提取视频硬字幕 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区域检…...

终极Element Plus Admin指南:快速构建企业级后台管理系统的完整解决方案

终极Element Plus Admin指南&#xff1a;快速构建企业级后台管理系统的完整解决方案 【免费下载链接】element-plus-admin 基于vitetselementPlus 项目地址: https://gitcode.com/gh_mirrors/el/element-plus-admin 你是否正在寻找一个能够快速搭建企业级后台管理系统的…...

基于MCP协议的金融数据服务器:为AI量化分析提供标准化数据接口

1. 项目概述&#xff1a;一个为金融量化分析而生的MCP服务器如果你和我一样&#xff0c;在金融数据分析和量化策略开发的路上摸爬滚打过几年&#xff0c;那你一定对“数据获取”这个老大难问题深有体会。无论是想回测一个简单的双均线策略&#xff0c;还是构建一个复杂的多因子…...

半导体产业模式之争:IDM与代工在先进制程下的博弈与融合

1. 从代工模式回归IDM&#xff1f;一场半导体产业路线的深度思辨最近在翻看一些老资料&#xff0c;2012年EE Times上的一篇旧文又把我拉回了那个充满争论的十字路口。文章标题直指核心&#xff1a;“代工模式正在向IDM模式逆转吗&#xff1f;” 当时&#xff0c;英特尔的技术大…...

交互式CLI工具开发指南:从原理到实战构建Node.js命令行应用

1. 项目概述&#xff1a;一个能“对话”的命令行工具如果你经常和命令行打交道&#xff0c;尤其是需要处理一些重复性、多步骤的配置或部署任务&#xff0c;你肯定有过这样的体验&#xff1a;打开一个脚本&#xff0c;面对一堆需要手动输入的参数&#xff0c;或者在不同的命令之…...

【YOLO26实战全攻略】21——YOLO26工业质检实战:PCB缺陷检测+划痕分割全流程落地指南

摘要:工业质检中,PCB板微小缺陷漏检、缺陷无法量化、小样本过拟合等问题长期困扰产线效率。本文基于YOLO26的STAL小目标感知机制与实例分割能力,打造从缺陷检测到量化分析的全流程解决方案。涵盖PCB六类缺陷数据集构建、YOLO26模型训练优化、实例分割掩码提取、缺陷尺寸精准…...