我正在对我的notifications
表运行一个简单的更新查询:
UPDATE `notifications`
SET is_unread = 0
WHERE MATCH(`grouping_string`) AGAINST("f89dc707afa38520224d887f897478a9")
该grouping_string
列有一个 FULLTEXT 索引,notifications
表有 2M+ 行。
现在,上面的 UPDATE 需要 70 多秒才能执行。但是,如果我使用相同的 WHERE 运行 SELECT,结果是立竿见影的。
什么可能导致这种情况以及如何优化 UPDATE?
环境: Amazon Aurora 引擎上的 MySQL 5.6 (InnoDB)
更新:在查询上使用EXPLAIN
表明全文索引是可能使用的索引之一,但在执行期间未使用。相反,仅使用 PRIMARY (id)。受影响的行数等于表中的行数 (2M+)。
更新2:结果SHOW VARIABLES LIKE 'query%'
:
+------------------------------+-----------+
| Variable_name | Value |
+------------------------------+-----------+
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 444890112 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
+------------------------------+-----------+