在 MySQL 中使用 LIKE 子句优化表以进行搜索

2024-07-01

我正在为我的网站的消息部分构建一个搜索功能,并且有一个略多于 9,000,000 行的消息数据库,以及索引sender, subject, and message字段。我希望在查询中使用 LIKE mysql 子句,例如 (ex)

SELECT sender, subject, message FROM Messages WHERE message像'%EXAMPLE_QUERY%';

检索结果。不幸的是,当存在前导通配符时,MySQL 不使用索引,并且这是必要的,因为搜索查询可能出现在消息中的任何位置(这就是通配符的工作原理,不是吗?)。查询是非常非常慢而且我也不能使用全文索引,因为烦人的 50% 规则(我无法排除那么多)。无论如何(或者甚至有任何替代方案)是否可以使用类似和两个通配符来优化查询?任何帮助表示赞赏。


您应该使用全文索引(您说过不能),自己设计全文搜索,或者从 MySQL 中卸载搜索并使用 Sphinx/Lucene。对于 Lucene,您可以使用 Zend Framework 中的 Zend_Search_Lucene 实现或使用 Solr。

MySQL中的普通索引是B+树,如果不知道字符串的开头,则不能使用它们(当开头有通配符时就是这种情况)

另一种选择是使用参考表自行实现搜索。将文本拆分为单词并创建包含单词、record_id 的表。然后,在搜索中,您将查询拆分为单词,并搜索参考表中的每个单词。通过这种方式,您不会将自己限制在整个文本的开头,而仅限于给定单词的开头(无论如何,您都会匹配其余单词)

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

在 MySQL 中使用 LIKE 子句优化表以进行搜索 的相关文章

  • swaplevel() 和 reorder_levels() 有什么区别?

    在使用 pandas 的分层索引级别时 有什么区别swaplevel https pandas pydata org pandas docs stable generated pandas DataFrame swaplevel html
  • php 字符串与通配符 * 匹配?

    我想提供将字符串与通配符匹配的可能性 Example mystring dir folder1 file pattern dir file stringMatchWithWildcard mystring pattern gt Return
  • 如何用PHP识别google/yahoo/msn的网络爬虫?

    AFAIK SERVER REMOTE HOST 应该以 google com 或 yahoo com 结尾 但这是最有保障的方法吗 还有其他出路吗 您通过以下方式识别搜索引擎用户代理和IP地址 http www jafsoft com s
  • 正确使用 GuzzleHttp/Psr7/Response

    不确定在 php 页面中显示 Psr7 Guzzle Response 的正确方法是什么 现在 我正在做 use GuzzleHttp Psr7 BufferStream use GuzzleHttp Psr7 Response class
  • SQL自连接返回特定行

    跳到底部以避免冗长的解释 Ok so 我正在公司内部网上工作 用于管理客户工作 作业由元素组成 示例元素可能是 构建六页网站 或 设计徽标 每个元素都由一系列角色时间组成 因此 构建一个六页网站 可能包括四个小时的 开发人员 时间和两个小时
  • 删除一行或多行后,在 auto_increment 列上使用下一个可能的主键

    我有一个带有主键 自动增量 ID 列的表 当我删除具有最高 ID 的行 例如 ID 100 时 我想仅使用 mysql 触发器将该 ID 100 用于新行 我怎么做 当我删除时 例如 ID 1 并且最高 ID 是 100 我不想再次使用 I
  • 如果仅登录facebook,则获取facebook用户 php sdk

    我想在 php sdk 中获取当前登录的 facebook 用户 这是我尝试过的 facebook new Facebook array appId gt XXXXXXXXXXX secret gt XXXXXXXXXXXXXXXXXXXX
  • Moodle 2.0 与 Nginx 后端

    您好 我正在寻找有关如何为 Moodle 2 0 配置服务器 以 nginx 作为服务器 以 PHP FPM 或 FastCGI 以 mySQL 作为后端 的教程 抱歉 如果我对服务器架构菜鸟的这些术语感到困惑 可能会在 Ubuntu De
  • 将.IBD文件导入MySQL服务器

    我正在尝试找到一种方法将 旧复制的 ibd 文件导入到新安装的 MYSQL Server 8 0 中 您需要了解exact表的结构 CREATE TABLE陈述 创建具有相同结构的表 Run ALTER TABLE table name D
  • php脚本在某个页面停留几秒钟并重定向

    有没有办法让页面在 php 中显示几秒钟并重定向到另一个页面 元重定向可能是您想要的 但是您CAN在 PHP 中也执行此操作 如下所示 其中 10 是等待的秒数
  • MacOS Sierra 上未找到 OpenSSL

    我正在尝试安装 PHP MongoDB 驱动程序 但安装失败 因为它找不到 OpenSSL Users username mongo php driver src libmongoc src mongoc mongoc crypto ope
  • XML 解析器错误:未定义实体

    我在 stackoverflow 上搜索了这个问题 并找到了一些主题 但我觉得在这个问题上没有真正可靠的答案 我有一个用户提交的表单 字段的值存储在 XML 文件中 XML 设置为使用 UTF 8 编码 用户时不时地会从某处复制 粘贴文本
  • laravel 5.1 在没有重新启动虚拟机的情况下看不到作业文件的更改

    我在 Laravel 5 1 应用程序中创建了一个新作业 在 Homestead VM 中运行 我已将其设置为排队并在句柄方法中有代码 handle 方法之前需要传递一个参数 但现在不再需要 我已从handle 方法中删除了该参数 但是 当
  • PHP Post 数组的数组

    我想从 HTML post 请求更改两个不同的表到运行 PHP 的服务器 以前 当我只想更改一张表时 所有列和值都放入 POST 数组中 所以我会 colname1 gt val1 colname2 val2等等 然后我将循环 POST 来
  • awk 单引号或双引号的用法

    为什么 awk 命令使用单引号和双引号不能产生相同的结果 root vm90 root who awk print 2 root vm90 root who awk print 2 我想在 PHP shell exec 函数中使用 awk
  • 替换 PHP 字符串中的特殊字符的问题

    我正在尝试将 PHP 字符串中的特殊字符替换为普通字符 例如将 替换为 o 将 替换为 a 我尝试使用 PHP Normalizer normalize 函数 如以下代码所示 if Normalizer isNormalized word
  • 使用 MySQL 数据库的 Jboss 7 上“WFLYJCA0041:无法加载驱动程序 [com.mysql] 模块”

    我正在为 JBoss EAP 7 创建一个 Web 应用程序并尝试连接到MySQL 8 0数据库 我收到的错误为 org jboss as controller management operation ServerService 线程池
  • Mysql插入速度慢

    我有以下 InnoDB 表 Field Type Null Key Default Extra id int 11 NO PRI NULL auto increment doc id char 32 NO
  • PHPStorm + PHPUnit 颜色输出

    因此 我在 PHPStorm 7 1 中运行 PHPUnit 但我不知道如何在测试中使 ANSI 颜色代码正常工作 我的 PHPunit xml 有colors true 在属性列表中 但每次我尝试类似的操作 echo 033 31mErr
  • Pandas:获取重复索引

    给定一个数据帧 我想获取重复的索引 这些索引在列中没有重复的值 并查看哪些值不同 具体来说 我有这个数据框 import pandas as pd wget https www dropbox com s vmimze2g4lt4ud3 a

随机推荐