MySQL错误1032“无法在表中找到记录”

问题描述 投票:1回答:1

我昨天在dba.stackexchange.com上问了这个问题并没有得到任何回复,所以我在这里尝试。

对于我的数据库中的某些查询,我收到MySQL 1032“找不到'人'中的记录”错误,我无法解决它们。

这是表格:

CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `last_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `first_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `dob` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `person_full_idx` (`last_name`,`first_name`,`title`)
) ENGINE=InnoDB AUTO_INCREMENT=4448 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

失败的查询是

SELECT * FROM person p0_
WHERE MATCH (p0_.last_name , p0_.first_name , p0_.title) AGAINST ('anne' IN BOOLEAN MODE) > 0.5
ORDER BY p0_.last_name ASC, p0_.first_name ASC, p0_.dob ASC;

如果我取出任何一个order by子句,查询运行就好了。如果我将anne更改为anna,那么查询就可以通过所有三个order by子句运行。表中有一些Annes,和Annas一样多。

每次查询失败时,MySQL错误日志都会出现一堆错误消息:

2019-03-27T17:31:27.891405Z 9 [Warning] [MY-012853] [InnoDB] Using a
partial-field key prefix in search, index `FTS_DOC_ID_INDEX` of table 
`database`.`person`. Last data field length 8 bytes, key ptr now 
exceeds key end by 4 bytes. Key value in the MySQL format:
len 4; hex 05110000; asc     ;

我没有使用复制,并且对于anne记录,插入,更新和删除都是成功的。我删除并重新创建了全文索引而没有任何改进。我删除并重新加载数据库并得到相同的错误。

生产中的查询失败(mysql Ver 15.1 Distrib 10.1.37-MariaDB)具有相同的数据。据我所知,它只是在我的开发机器上失败了(在x86_64(Homebrew)上的osx10.14的mysql Ver 8.0.15)。

我接下来应该尝试什么?

mysql full-text-search
1个回答
1
投票

如上面的评论中所述,这是MySQL 8.0中的一个已知错误:https://bugs.mysql.com/bug.php?id=93241

一个临时的解决方法是增加sort_buffer_size的大小。默认的sort_buffer size in MySQL 8.0是256KB,您可以配置的最大值是2 ^ 32-1或2 ^ 64-1。

如果您运行与大量行匹配的查询,则该错误可能会再次发生,足以使其对于增加的sort_buffer_size而言太大。

我要小心不要增加sort_buffer_size非常大,因为运行此查询的每个线程都会分配自己的排序缓冲区。

假设您将sort_buffer_size增加到1GB,然后100个并发客户端同时运行全文搜索!您可能会意外地使MySQL超过您的总系统内存,并且当它发生时您将没有任何警告。

© www.soinside.com 2019 - 2024. All rights reserved.