代码之家  ›  专栏  ›  技术社区  ›  James Spittal

使用~4Gb表(MariaDB)的简单SELECT查询速度较慢

  •  1
  • James Spittal  · 技术社区  · 3 年前

    我有一张桌子叫 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 也许要结束发言)。

    1 回复  |  直到 3 年前
        1
  •  2
  •   Gordon Linoff    3 年前

    对于此查询:

    SELECT `type`, `data`, `created_at`
    FROM `tablename`
    WHERE `type` = 'PURCHASE'
    ORDER BY `created_at` DESC
    LIMIT 1;
    

    你想要一个索引 tablename(type, created_at desc) .