提问人:root66 提问时间:11/16/2023 最后编辑:Bill Karwinroot66 更新时间:11/16/2023 访问量:55
ORDER BY [PrimaryKey] 使用临时和文件排序
ORDER BY [PrimaryKey] uses temporary and filesort
问:
由于排序,以下查询速度很慢(0.5 秒;使用 MySQL 5.6.21 和 MariaDB 10.4.28 进行测试),因为使用了临时表和文件排序。这是什么原因,我该如何预防?
SELECT t1.* FROM `data` AS t1
LEFT JOIN `data_sources` AS t2 ON(t1.source_id = t2.id)
WHERE t2.period_id = 1
ORDER BY t1.id ASC;
解释:
1 SIMPLE t2 ref PRIMARY,data_sources_period_id data_sources_period_id 8 const 1 Using where; Using index; Using temporary; Using filesort
1 SIMPLE t1 ref data_source_id_index data_source_id_index 8 t2.id 40889 NULL
更新:将 SELECT t1.* 更改为 SELECT * 会导致 MySQL 和 MariaDB 上出现巨大的临时文件 (20 GB+) 和请求超时。我已经干净地安装了MariaDB,并将数据库作为SQL转储传输。
CREATE TABLE `data` (
`id` bigint(20) UNSIGNED NOT NULL,
`source_id` bigint(20) UNSIGNED NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `data`
ADD PRIMARY KEY (`id`),
ADD KEY `data_source_id_index` (`source_id`);
CREATE TABLE `data_sources` (
`id` bigint(20) UNSIGNED NOT NULL,
`period_id` bigint(20) UNSIGNED NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `data_sources`
ADD PRIMARY KEY (`id`),
ADD KEY `data_sources_period_id` (`period_id`) USING BTREE;
ALTER TABLE `data_sources`
MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
答: 暂无答案
评论
STRIGHT_JOIN
t1
data_sources_period_id