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

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

相关文章

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

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

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

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

StarRocks索引详解(最新整理)

《StarRocks索引详解(最新整理)》StarRocks支持多种索引类型,包括主键索引、前缀索引、Bitmap索引和Bloomfilter索引,这些索引类型适用于不同场景,如唯一性约束、减少索引空... 目录1. 主键索引(Primary Key Index)2. 前缀索引(Prefix Index /

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

Pandas中多重索引技巧的实现

《Pandas中多重索引技巧的实现》Pandas中的多重索引功能强大,适用于处理多维数据,本文就来介绍一下多重索引技巧,具有一定的参考价值,感兴趣的可以了解一下... 目录1.多重索引概述2.多重索引的基本操作2.1 选择和切片多重索引2.2 交换层级与重设索引3.多重索引的高级操作3.1 多重索引的分组聚

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora