mysql - MySQL 添加 longtext 列使查询非常慢 - 任何性能提示?
问题描述
我有这张表stories
,目前有 1200 万条生产记录。
CREATE TABLE `stories` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`headline` varchar(255) DEFAULT NULL,
`author_id` int(11) DEFAULT NULL,
`body` longtext NOT NULL,
`published_at` datetime DEFAULT NULL,
`type_id` int(11) NOT NULL DEFAULT '0',
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`aasm_state` varchar(255) NOT NULL,
`deleted` tinyint(1) DEFAULT '0',
`word_count` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `index_stories_on_cms_story_id` (`cms_story_id`),
KEY `typeid` (`type_id`),
KEY `index_stories_on_published_at` (`published_at`),
KEY `index_stories_on_updated_at` (`updated_at`),
KEY `index_stories_on_aasm_state_and_published_at_and_deleted` (`aasm_state`,`published_at`,`deleted`),
KEY `idx_author_id` (`author_id`)
) ENGINE=InnoDB AUTO_INCREMENT=511625276 DEFAULT CHARSET=utf8;
我正在执行以下查询:(只是获取 id 运行良好)
SELECT `stories`.id
FROM `stories`
WHERE `stories`.`aasm_state` = 'scheduled'
AND `stories`.`deleted` = 0
AND (`stories`.`published_at` <= '2020-01-14 06:16:04')
AND (`stories`.`id` > 519492608)
ORDER
BY `stories`.`id` ASC
LIMIT 1000;
...
1000 rows in set (0.59 sec)
但是,当我向其中添加 longtext 列时,我得到:
mysql> SELECT `stories`.id
, `stories`.body
FROM `stories`
WHERE `stories`.`aasm_state` = 'scheduled'
AND `stories`.`deleted` = 0
AND (`stories`.`published_at` <= '2020-01-14 06:16:04')
AND (`stories`.`id` > 519492608)
ORDER BY `stories`.`id` ASC LIMIT 1000;
...
1000 rows in set (6 min 34.11 sec)
有关如何处理此表的任何性能提示?
解决方案
通常,关系 DBMS 将ORDER BY
在检索初始结果集后应用 - 因此它需要加载所有这些故事然后对它们进行排序。我无权访问您的记录集,但猜测,在检索批量内容之前应用排序可能会提高性能:
SELECT *
FROM (
SELECT `stories`.id
FROM `stories`
WHERE `stories`.`aasm_state` = 'scheduled'
AND `stories`.`deleted` = 0
AND (`stories`.`published_at` <= '2020-01-14 06:16:04')
AND (`stories`.`id` > 519492608)
ORDER BY `stories`.`id` ASC
LIMIT 1000
) ids
INNER JOIN stories bulk
ON ids.id=bulk.id
(顺便说一句,您可能会考虑更多地研究索引 - 您放在这里的内容看起来很可疑)。
推荐阅读
- python - 根据精确组件对 numpy.array 的行进行排序
- ffmpeg - 使用 FFmpeg 堆叠 gif 而不会降低质量
- java - 在新活动中如何停止倒数计时器
- ruby-on-rails - 我该如何解决这一数据拉动问题?
- c# - 计算文本中字符串数组中元素的总出现次数
- c++ - 在 initializer_list 上使用数据
- python - 通过屏幕的caputura寻找图像,即使它不在那个时刻
- javascript - 在 url 中使用减号更改空格
- laravel - 子域之间的 Laravel Auth 仅适用于记住我
- python - ImportError:无法导入名称'text_summary'