全文索引与虚拟列索引需要注意的事项

2024-09-06 14:20

本文主要是介绍全文索引与虚拟列索引需要注意的事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 MySQL 中,全文索引 (FULLTEXT)UNION ALL 可以一起使用,但有一些限制和注意事项。

限制与问题:

  1. 全文索引不能直接在 UNION ALL 中使用:MySQL 不允许在多个查询的 UNIONUNION ALL 操作中使用 MATCH ... AGAINST,因为每个 SELECT 语句都是独立处理的。如果你想在多个表上进行全文搜索,并且想使用 UNION ALL,全文搜索需要在各自的查询中独立进行。

  2. MATCH ... AGAINST 的限制:当你在 UNION ALL 中使用时,MySQL 不能在 UNION 操作后再应用 MATCH,这意味着你不能对组合后的结果进行全文搜索。

解决方案:

要解决这个问题,通常有两种做法:

方法 1: 在每个 SELECT 子查询中单独使用 MATCH ... AGAINST

你可以在每个表的查询中分别使用 MATCH ... AGAINST,而不是对整个 UNION ALL 的结果进行全文搜索。

示例:

sql

CREATE TEMPORARY TABLE temp_results AS
SELECT p1.*
FROM cdr_voice_202409_0 AS p1
WHERE LENGTH(p1.calling_number) < 11
UNION ALL
SELECT p1.*
FROM cdr_voice_202408_0 AS p1
WHERE LENGTH(p1.calling_number) < 11
UNION ALL
SELECT p1.*
FROM cdr_voice_202407_0 AS p1
WHERE LENGTH(p1.calling_number) < 11;

在此方法中,每个表的查询单独使用全文索引进行搜索,MATCH ... AGAINST 会分别作用于每个表的数据。

方法 2: 使用临时表

如果你需要对多个表的结果进行全文搜索,可以将结果存储在临时表中,然后对该临时表进行 MATCH ... AGAINST 操作。虽然这稍微复杂一些,但在某些场景下能提高查询的灵活性。

示例:
  1. 首先将查询结果插入到临时表中:

     sql 

    CREATE TEMPORARY TABLE temp_results AS S
    ELECT p1.* FROM 
    cdr_voice_202409_0 AS p1 
    WHERE LENGTH(p1.calling_number) < 11 
    UNION ALL 
    SELECT p1.* FROM 
    cdr_voice_202408_0 AS p1 
    WHERE LENGTH(p1.calling_number) < 11 
    UNION ALL 
    SELECT p1.* 
    FROM cdr_voice_202407_0 AS p1 
    WHERE LENGTH(p1.calling_number) < 11;

  2. 然后对临时表使用全文索引:

    SELECT * FROM temp_results WHERE MATCH(calling_number) AGAINST('10086') LIMIT 1000 OFFSET 0;

    在数据库中添加一个虚拟列(例如 MySQL 的 VIRTUAL 生成列)后,这个列通常不会自动出现在 Java 或其他编程语言中的实体类中,尤其是在使用 ORM(如 Hibernate 或 MyBatis)时。实体类中的字段是基于数据库表中物理存在的列定义的,而虚拟列可能只在数据库计算时存在,不会自动映射到实体类中。

总结:

  • 全文索引不能跨 UNION ALL 直接使用,你需要在每个 SELECT 中分别使用 MATCH ... AGAINST
  • 如果需要对合并后的结果进行全文搜索,可以通过临时表来实现。

这篇关于全文索引与虚拟列索引需要注意的事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142250

相关文章

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

MySQL索引失效问题及解决方案

《MySQL索引失效问题及解决方案》:本文主要介绍MySQL索引失效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql索引失效一、概要二、常见的导致MpythonySQL索引失效的原因三、如何诊断MySQL索引失效四、如何解决MySQL索引失

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Mysql中InnoDB与MyISAM索引差异详解(最新整理)

《Mysql中InnoDB与MyISAM索引差异详解(最新整理)》InnoDB和MyISAM在索引实现和特性上有差异,包括聚集索引、非聚集索引、事务支持、并发控制、覆盖索引、主键约束、外键支持和物理存... 目录1. 索引类型与数据存储方式InnoDBMyISAM2. 事务与并发控制InnoDBMyISAM