我有一张桌子叫
tablename
具有以下结构:
CREATE TABLE `tablename` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) unsigned NOT NULL,
`type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`data` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `tablename_user_id_foreign` (`user_id`),
CONSTRAINT `tablename_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=11271577 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
此表的当前大小为
4.1Gb
目前,我预计它会变得更大。
我正在运行一个相当简单的SQL
SELECT
查询如下:
SELECT `type`, `data`, `created_at`
FROM `tablename`
WHERE `type` = 'PURCHASE'
ORDER BY `created_at` DESC
LIMIT 1
基本上,我们只想回来
一
此数据库中最近的行(类型为
PURCHASE
). 此表中的大多数数据不是类型
购买
.
在具有4gb RAM的生产数据库上,可以看到此查询需要长达1分1秒(这似乎太长了)。
SELECT `type`, `data`, `created_at`
FROM `tablename`
WHERE `type` = 'PURCHASE'
ORDER BY `created_at` DESC
LIMIT 1;
/* Affected rows: 0 Found rows: 1 Warnings: 0 Duration for 1 query: 00:01:01.8 */
在其他运行中(同一个盒子,同一台服务器),我看到它介于两者之间
27 seconds
和
36.48
秒。
如果可能的话,我想把它缩短到最多几秒钟。
MariaDB的版本是10.3.27(运行在*nix虚拟云实例上,具有4Gb RAM和“
通用(SSD)卷
“)。这正常吗?可以做些什么来加快此查询?瓶颈主要与RAM或磁盘速度或其他因素有关吗?
值得注意的是,许多新记录同时被写入/插入到同一个表中
选择
语句可能正在执行,因此这可能会减慢速度(等待
INSERT
也许要结束发言)。