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

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

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文详解MySQL索引(六张图彻底搞懂)

《一文详解MySQL索引(六张图彻底搞懂)》MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度,:本文主要介绍MySQL索引的相关资料,文中通过代码介绍的... 目录一、什么是索引?为什么需要索引?二、索引该用哪种数据结构?1. 哈希表2. 跳表3. 二叉排序树4.

SpringBoot实现虚拟线程的方案

《SpringBoot实现虚拟线程的方案》Java19引入虚拟线程,本文就来介绍一下SpringBoot实现虚拟线程的方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录什么是虚拟线程虚拟线程和普通线程的区别SpringBoot使用虚拟线程配置@Async性能对比H

MySQL 索引简介及常见的索引类型有哪些

《MySQL索引简介及常见的索引类型有哪些》MySQL索引是加速数据检索的特殊结构,用于存储列值与位置信息,常见的索引类型包括:主键索引、唯一索引、普通索引、复合索引、全文索引和空间索引等,本文介绍... 目录什么是 mysql 的索引?常见的索引类型有哪些?总结性回答详细解释1. MySQL 索引的概念2

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二