从表中选择随机单词

2024-04-09

假设我有以下基本 MySQL 数据:

CREATE TABLE my_words (my_word VARCHAR(255));

INSERT INTO my_words VALUES ('dog');
INSERT INTO my_words VALUES ('cat');
INSERT INTO my_words VALUES ('tree');
INSERT INTO my_words VALUES ('ball');
INSERT INTO my_words VALUES ('life');
INSERT INTO my_words VALUES ('complex');
INSERT INTO my_words VALUES ('digeridoo');
INSERT INTO my_words VALUES ('hamster');
INSERT INTO my_words VALUES ('it');
INSERT INTO my_words VALUES ('house');
INSERT INTO my_words VALUES ('love');
INSERT INTO my_words VALUES ('zealous');
INSERT INTO my_words VALUES ('nevis');
INSERT INTO my_words VALUES ('mountain');
INSERT INTO my_words VALUES ('call');
INSERT INTO my_words VALUES ('nail');
INSERT INTO my_words VALUES ('rat');
INSERT INTO my_words VALUES ('hat');

SELECT CONCAT(w1.my_word, w2.my_word) joined
FROM my_words w1, my_words w2
WHERE LENGTH(CONCAT(w1.my_word, w2.my_word)) = 8
ORDER BY RAND() LIMIT 5;

我可以在最后编写 SQL 语句来生成由 2 个单词组成的 5 个随机连接字符串的列表,其中字符串的总长度为 8 个字符。

这对于像我在示例中得到的简单数据表来说效果很好。

然而,我正在使用的“真实”表包含大约 6,200 行。

如果我尝试相同类型的语句,则需要 10 秒才能生成 5 个字符串。

我猜想 SQL 效率非常低,因为它每次都会搜索表两次,并且这些表没有以任何方式连接。

我想知道是否有一种更简单的方法来从表中提取由 2 个单词组成的单词字符串,其中连接字符串的长度为 8 个字符长(尽管这可以改变 - 我只是使用 8 作为示例)。

Thanks


Update 1

解释计划:

EXPLAIN
SELECT CONCAT(w1.fld_un, w2.fld_un) joined
FROM j_un w1
JOIN j_un w2 ON w1.fld_len = 8 - w2.fld_len
WHERE w2.fld_len < 8
ORDER BY RAND()
LIMIT 5;

id  select_type table   type    possible_keys   key     key_len     ref rows    Extra
1   SIMPLE      w2      range   un_len          un_len  5   \N      2694        Using where; Using temporary; Using filesort
1   SIMPLE      w1      ref     un_len          un_len  5   func    527         Using where

Update 2

我不确定它是否相关,但“fld_un”表大约有 6,200 行。

“word”保存在“fld_un”列中。

表的结构是:

Field       Type            Null    Key     Default     Extra
fld_id      int(11)         NO      PRI     NULL        auto_increment
fld_un      varchar(255)    YES             NULL     
fld_cat_id  int(11)         YES     MUL     NULL     
fld_len     int(2)          NO      MUL     NULL    

表中存在这些索引:

Keyname     Type    Cardinality Field
PRIMARY     PRIMARY 6318        fld_id
cat         INDEX   15          fld_cat_id
bob         INDEX   11          fld_len 

表上已经有主索引有关系吗?我认为从技术上讲我不需要这个。

陈述:

SELECT CONCAT(word1, word2) joined
FROM (
    SELECT w1.fld_un word1, w2.fld_un word2
    FROM j_un2 w1
    JOIN j_un2 w2 ON w1.fld_len = 8 - w2.fld_len
    WHERE w2.fld_len < 8
    ORDER BY RAND()
    LIMIT 5) x;

查询花费了 23.6805 秒

解释计划:

id  select_type     table       type    possible_keys   key     key_len     ref     rows    Extra
1   PRIMARY         <derived2>  ALL     NULL            NULL    NULL        NULL    5    
2   DERIVED         w2          range   bob             bob     4           NULL    4627    Using where; Using temporary; Using filesort
2   DERIVED         w1          ref     bob             bob     4           func    527     Using where

当我按照 Thorsten Kettner 的建议修改“bob”索引以包含 2 列时:

Keyname     Type    Cardinality Field
bob         INDEX   11          fld_len, fld_un

并重新测试:

SELECT CONCAT(word1, word2) joined
FROM (
    SELECT w1.fld_un word1, w2.fld_un word2
    FROM j_un2 w1
    JOIN j_un2 w2 ON w1.fld_len = 8 - w2.fld_len
    WHERE w2.fld_len < 8
    ORDER BY RAND()
    LIMIT 5) x;

该查询花了 30.3394 秒返回 5 行。

解释计划:

id  select_type     table       type    possible_keys   key     key_len     ref     rows    Extra
1   PRIMARY         <derived2>  ALL     NULL            NULL    NULL        NULL    5    
2   DERIVED         w2          range   bob             bob     4           NULL    4211    Using where; Using temporary; Using filesort
2   DERIVED         w1          ref     bob             bob     4           func    527     Using where

Update 3

在没有“order by rand()”的情况下运行,它在 0.0011 秒内运行!


您可以添加一列,例如word_length包含单词的长度,并在上添加索引word_length柱子。通常,包含可从另一列派生的数据会是糟糕的设计,但在这种情况下,出于性能考虑,您需要破坏纯度。然后你的查询可以使用JOIN使用此列的条件:

SELECT CONCAT(w1.my_word, w2.my_word) joined
FROM my_words w1
JOIN my_words w2 ON w1.word_length = 8 - w2.word_length
WHERE w2.word_length < 8
ORDER BY RAND()
LIMIT 5

您可以使用INSERT and UPDATE触发填写word_length自动列。

在过滤到 5 行后进行串联也可能会有所帮助:

SELECT CONCAT(word1, word2) joined
FROM (
    SELECT w1.my_word word1, w2.my_word word2
    FROM my_words w1
    JOIN my_words w2 ON w1.word_length = 8 - w2.word_length
    WHERE w2.word_length < 8
    ORDER BY RAND()
    LIMIT 5) x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从表中选择随机单词 的相关文章

  • SQL。 SP 或函数应计算周五的下一个日期

    我需要编写一个存储过程来返回给定日期的下周五日期 例如 如果日期是 05 12 2011 那么它应该返回下周五日期 05 13 2011 如果您通过 05 16 2011 那么它应该返回日期是 5 20 2011 星期五 如果您将星期五作为
  • 合并并添加两个表中的值

    是否可以制作一个在两个表中添加值的查询 例如 假设您有两张表 id value a 1 c 2 d 3 f 4 g 5 and id value a 1 b 2 c 3 d 4 e 5 然后 当您 添加 两个表时 您将获得 id 匹配的结果
  • 访问数据库 LIMIT 关键字

    我试图让我的页面列表功能在 ASP 中与 Access 数据库一起工作 但我不知道 Microsoft SQL 中 LIMIT 的替代方案 我已经尝试过 TOP 但这似乎不起作用 这是 MySQL 中使用的语句 SELECT FROM cu
  • 作为 UDF 结果的列上的 Where 子句

    我有一个用户定义的函数 例如myUDF a b 返回一个整数 我试图确保该函数仅被调用一次 并且其结果可以用作WHERE clause SELECT col1 col2 col3 myUDF col1 col2 AS X From myTa
  • Entity Framework 6 多对多想要插入重复行

    不应该这么难 我准备放弃EF了 我的模型有周刊版本 每个版本可以有许多分类广告 每个分类可以出现在一个或多个版本中 我的模型 public class Classifieds Key DatabaseGenerated DatabaseGe
  • mod_rewrite, .htaccess 连接mysql数据库

    我希望 htaccess 文件中的 mod rewrite 链接到 mysql 数据库以向我提供映射信息 具体来说 我使用单个代码库来托管多个站点 因此 如果用户请求图像 例如 http www example com images car
  • 使用 try {} catch {} 与 if {} else {} 相比有何优势

    我正在从 php 中的普通 mysql 切换到 PDO 并且我注意到测试错误的常见方法是使用 try catch 组合而不是 if else 组合 该方法的优点是什么 我可以使用一个 try catch 块而不是多个嵌套的 if else
  • MySQL SELECT OpenCarts 数据库中的重复行

    只是玩一下 OpenCart DB 看看我是否能学到一些东西 如果我使用以下SELECT结果返回重复的行 SELECT DISTINCT p product id AS pid p model AS modelo SUBSTRING p m
  • 如何创建包含多列MD5的GENERATED列?

    我尝试在 PostgreSQL 14 3 中添加下表 CREATE TABLE client cache id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY request VARCHAR
  • SQL Server 中全文搜索的奇怪行为

    我的 MyTable 带有列消息 NVARCHAR MAX ID 为 1 的记录包含消息 0123456789333444 Test 当我运行以下查询时 DECLARE Keyword NVARCHAR 100 SET Keyword 01
  • 查询获取每条记录的最小日期[重复]

    这个问题在这里已经有答案了 我想获取表中每条记录的最小日期 该表具有多个带有一个主键的日期条目 看看我的桌子 CaseNo Entry date ABC 001 2 12 13 ABC 002 2 09 13 ABC 001 1 01 13
  • PDO获取最后插入的ID

    我有一个查询 我想获取插入的最后一个 ID 字段ID是主键并且自动递增 我知道我必须使用这个声明 LAST INSERT ID 该语句适用于如下查询 query INSERT INTO cell place ID VALUES LAST I
  • SQL Server 2008 中的全文搜索一步一步

    如何开始使用SQL Server 2008 中的全文搜索 阅读这些链接 SQL SERVER 2008 创建全文目录和全文搜索 http blog sqlauthority com 2008 09 05 sql server creatin
  • SQL Server 2008 GUID 列全为 0

    我希望这是我做的一个简单的傻事 我的数据库中有一个表 设置如下 column name widget guid data type uniqueidentifier allow nulls false default value newid
  • 如何在php/mysql中使用事务

    我正在使用 php mysql 我知道 mysql 中的事务 但不能在我的脚本中使用 下面是我的脚本 如何在我的代码中使用 php 事务 即 BEGIN ROLLBACK COMMIT foreach json a shop as json
  • 条件对列表的 In 子句

    有一个表 我需要通过在配对值列表中应用和条件来获取分页记录 下面是解释 假设我有一堂课Billoflading其中有各个领域 表中两个重要字段是 tenant billtype 我有一个包含值的对列表 tenant1 billtype1 t
  • 当我尝试计算 mysqli 结果时,为什么会收到警告?

    下面的代码会导致此警告 警告 count 参数必须是数组或实现 Countable 的对象 为什么要这样做 如何防止出现警告 if isset GET edit sonum GET edit update true result mysql
  • 如何使用Python3.4在tornado中进行异步mysql操作?

    我现在使用Python3 4 我想在Tornado中使用异步mysql客户端 我已经发现torndb https github com bdarnell torndb但在阅读其源代码后 我认为它无法进行异步mysql操作 因为它只是封装了M
  • 在 Python 中,如果我有 unix 时间戳,如何将其插入 MySQL 日期时间字段?

    我正在使用 Python MySQLDB 我想将其插入 Mysql 中的 DATETIME 字段 我该如何使用cursor execute 来做到这一点 要将 UNIX 时间戳转换为 Python 日期时间对象 请使用datetime fr
  • 如何插入包含“&”的字符串

    如何编写包含 字符的插入语句 例如 如果我想将 J J Construction 插入数据库的列中 我不确定这是否有什么不同 但我正在使用 Oracle 9i 我总是忘记这一点 然后又回到它 我认为最好的答案是迄今为止提供的答复的组合 首先

随机推荐

  • 在python中添加小时到unix时间戳

    我需要在某个 UNIX 时间戳上添加 5 小时 就像游戏的开始和停止时间一样 所以我知道比赛的开始时间和持续时间 我需要设置结束时间 这如何在 python 中完成 UNIX 时间戳以秒为单位 end timestamp start tim
  • Gradle 额外属性在子项目中定义的自定义任务中不可见

    我正在尝试在多个 Gradle 任务之间重用通用逻辑 类似于中建议的内容这个答案 https stackoverflow com a 13072481 但我遇到了额外项目属性不可见的问题 归根结底 问题就在这里 假设我有一个根 Gradle
  • 如何在haskell中反转整数?

    我需要有关如何逆转的帮助Integer在 Haskell 中具有以下类型签名 reverseInt Integer gt Integer reverseInt a undefined help here 我需要Integer输入要反转的数字
  • 具有多个条目的 Rails 嵌套形式

    我有一个Sezzion model attr accessible description has many session instructors dependent gt destroy has many instructors thr
  • Apache 和 PHP 的默认 Windows 用户

    查看 Windows XP 上运行的进程 发现 Apache httpd exe 在 SYSTEM 用户下运行 但我不知道什么 User 用于运行 PHP 脚本 这是使用 Xampp 的基本安装 我试图在目录上设置正确的权限 即 Modif
  • 附加 mdf 文件时 SQL Server 版本错误

    标题 Microsoft SQL Server Management Studio 服务器 DESKTOP MR6JCUA 附加数据库失败 微软 SqlServer Smo 附加信息 执行 Transact SQL 语句或批处理时发生异常
  • 如何在 Interface Builder 中创建许多溢出到 xib 之外的元素

    我有一个 UIView 其中有很多元素 如文本字段 日期选择器和选择器视图 可以将数据添加到我的应用程序 这不会出现在 Interface Builder 的屏幕中 在我看来 用户将向下滚动以插入它们 有办法实现这一点吗 Thanks 如何
  • 融合乘加和默认舍入模式

    使用 GCC 5 3 可以编译以下代码 O3 fma float mul add float a float b float c return a b c 产生以下程序集 vfmadd132ss xmm1 xmm2 xmm0 ret 我注意
  • 输出发送到浏览器后设置 cookie

    有没有办法可以在 html 输出后设置 cookie 根据 PHP 手册 setcookie 应该设置before输出 我的投票系统需要它 其中在成功的 Mysql 查询后将设置一个 cookie 我把它放在一个文件中 您可以使用输出缓冲区
  • Android Studio 无法识别 Samsung Galaxy 手机

    我的三星手机在 Windows 7 上无法被 Android Studio 识别 我通过在此处安装 Samung 驱动程序来修复它 http developer samsung com technical doc view do v T00
  • Firebase JWT:签名验证失败

    我尝试在 Firebase 中使用 JWT 身份验证 但总是收到此错误 致命错误 未捕获的 Firebase JWT SignatureInvalidException 签名验证失败 代码是这样的 key test tokenId base
  • spring-data-elasticsearch 在多个索引上搜索

    我的页面上有一个搜索字段 该搜索字段应该搜索多个索引 我可以毫无问题地搜索一个索引 如 spring data elasticsearch 文档中所述 但是 如果我搜索 例如 Foo 我希望得到以下列表作为按相关性排序的结果 title F
  • 滚动条通过 CSS 动画/过渡出现

    我正在用 Angular 来动画我的 ng view三次贝塞尔曲线过渡 Animations slide animation ng enter slide animation ng leave webkit transition all c
  • 双指针与引用指针传递[重复]

    这个问题在这里已经有答案了 在理解双指针概念以及应该在哪里使用它的同时 我有一个疑问 我试验了这段代码 发现我也可以使用按引用传递指针而不是双指针 include
  • MySQL:使用 PREPARE 命令命名参数?

    MySQL 中是否可以使用PREPARE命令与命名参数例如PDO in PHP 这是我的例子 SET s SELECT FROM MY TABLE WHERE my column 1 AND my column 2 PREPARE stmt
  • 如何删除 Google Play 排行榜高分

    我刚刚发布了我的游戏 我看到测试的高分仍然作为高分出现 如何删除它 重置排行榜 在游戏中加载排行榜或成就 在右上角单击设置 共享 断开连接 带有复选框 同时删除谷歌中的所有活动 它将删除您的所有分数
  • 如何通过 PHP 调用 CITRIX (LogMeIn) API 来注册新的 GotoWebinar 与会者?

    我使用以下代码将用户注册到网络研讨会 headers array HTTP 1 1 Accept application json Accept application vnd citrix g2wapi v1 1 json Content
  • 为什么这个onload函数没有运行?

    为什么onLoad没有被触发 function FULL IMAGE fimage document getElementById FULL SRC onLoad function offsetTop document getElement
  • 获取几何长度

    有谁知道获取 WPF 几何图形长度 以像素为单位 的有效方法 我知道 WPF 中的几何图形是基于矢量的 因此实际上没有像素长度 但必须能够根据可见的绘制图像获得长度 我的意思是 如果我在 1024x800 像素图像中绘制一些几何图形 则必须
  • 从表中选择随机单词

    假设我有以下基本 MySQL 数据 CREATE TABLE my words my word VARCHAR 255 INSERT INTO my words VALUES dog INSERT INTO my words VALUES