我有下表,显示为SHOW CREATE TABLE:

CREATE TABLE `lname` (
  `lnameid` binary(16) NOT NULL,
  `lid` binary(16) NOT NULL,
  `name` varchar(200) NOT NULL,
  `namerank` int(11) DEFAULT NULL,
  `score` float DEFAULT NULL,
  PRIMARY KEY (`lnameid`),
  KEY `lid` (`lid`),
  FULLTEXT KEY `name` (`name`),
  CONSTRAINT `lname_ibfk_1` FOREIGN KEY (`lid`) REFERENCES `sl` (`slid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci

该表大约有230,000行.所有行的名称列都具有非空值.

我有以下疑问:

EXPLAIN SELECT MATCH(lname.name) AGAINST ('maillot' IN BOOLEAN MODE) AS nms FROM lname;
+------+-------------+-----------------+------+---------------+------+---------+------+--------+-------+
| id   | select_type | table           | type | possible_keys | key  | key_len | ref  | rows   | Extra |
+------+-------------+-----------------+------+---------------+------+---------+------+--------+-------+
|    1 | SIMPLE      | lname           | ALL  | NULL          | NULL | NULL    | NULL | 228370 |       |
+------+-------------+-----------------+------+---------------+------+---------+------+--------+-------+

我的问题是:我看到possible_keysNULL(Extra是空的),这是否意味着我的FULLTEXT索引不知何故没有被使用?

查询执行起来似乎很慢.

我在Linux上使用的是MariaDB 10.5.19.

推荐答案

您所做的是计算all行的匹配系数,因此不需要索引,但当您将其更改为

CREATE TABLE `lname` (
  `lnameid` binary(16) NOT NULL,
  `lid` binary(16) NOT NULL,
  `name` TEXT NOT NULL,
  `namerank` int(11) DEFAULT NULL,
  `score` float DEFAULT NULL,
  PRIMARY KEY (`lnameid`),
  KEY `lid` (`lid`),
  FULLTEXT KEY `name` (`name`)#,
  #CONSTRAINT `lname_ibfk_1` FOREIGN KEY (`lid`) REFERENCES `sl` (`slid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci

INSERT INTO  lname vALUES (1,1,'a',1,1)
EXPLAIN SELECT MATCH(name) AGAINST ('maillot' IN BOOLEAN MODE) AS nms FROM lname
  WHERE MATCH(name) AGAINST ('maillot' IN BOOLEAN MODE) > 1;

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE lname fulltext name name 0 1 Using where

fiddle

在这种情况下,数据库必须查找合适的匹配项,因此需要使用索引更快地找到对应的行

Sql相关问答推荐

如何在一个范围内进行分组.""范围值在范围表中定义

GROUP BY与多个嵌套查询T—SQL

从以前的非空值行中获取值

SQL Oracle条件分组依据

在Oracle中,如何删除具有特定值的行,仅当它是重复的行?

SQL计数条目大于日期,包括交叉表中的零

Redshift PL/pgSQL循环中的参数化列名

将一个数组反嵌套到另外两个数组SQL中(Athena/presto)

按两列分组,并根据SQL中的条件返回第三个列值

用VB.NET在Dapper中实现MS Access数据库顺序透视

在VB.NET中如何在MS Access数据库中创建SQL项目历史库存卡

从单个表达式中的分隔字符串中取平均值

使用与JOIN一起使用的查询后进行分页和排序

获取分布在同一行的列中的出现次数

Select 一个非零值减少重复

SQL Server - 复杂场景 - 比较状态并填充值到后续行

如何获取每个组中最近的n条记录并将它们聚合成数组

存储过程 - 动态 SQL 中不同列值的计数

并非所有变量都绑定在 PL SQL 函数中

从多个连接返回 1 行到同一个表 - SQL Server