【发布时间】:2022-01-04 15:35:27
【问题描述】:
所以我有一个超过 1000 万行的 MySQL 表。每次进行新下载时都会创建一个新行,并在再次下载文件时更新该行(更新下载计数)。要检查该行是否已经存在,我执行以下 MySQL 查询:
SELECT `id`, `download_count`
FROM `product_files_downloads`
WHERE (`user_id` = ? AND `variant_id` = ? AND `product_files_id` = ? AND `order_id` = ?)
ORDER BY `id` DESC LIMIT 1;
我在user_id 上设置了一个简单的索引,如果用户(由user_id 定义)在此表中没有很多行,则查询非常快。但是,我有一些用户的 user_id 附加了超过 100k 行,在这种情况下,查询需要几秒钟才能执行。
我是否应该像这样在 user_id 和 product_files_id 上添加新索引:
ALTER TABLE `product_files_downloads` ADD INDEX `user_id_product_files_id_idx` (`user_id`, `product_files_id`);
...或者是否有更好的索引来加快查询速度?
【问题讨论】:
-
从建议的索引开始,看看会发生什么。 (我们不知道数据分布,所以只能猜测……)
标签: mysql sql database-design database-performance