【发布时间】:2017-03-18 05:07:40
【问题描述】:
我在 Linux 下使用 MariDB 10.1.18。
我有一个简单的表 (t),结构如下:
| id | a | b | c |
-------------------
| 1 | 3 | 7 | 10 |
| 2 | 4 | 6 | 9 |
| 3 | 2 | 7 | 11 |
| 4 | 3 | 5 | 10 |
| 5 | 4 | 8 | 12 |
| 6 | 2 | 9 | 6 |
id is primary key
a - has BTREE index
b - has HASH index
c - has HASH index
我假设主键会自动被索引。 我的查询很简单:
SELECT * FROM t GROUP BY a
出于性能目的,使用的引擎是MEMORY。
在 500 万行上,上述查询需要 1 秒 完成,并且使用一个 CPU 的线程到 100%。现在 a 列有大约 150 个唯一值。
我认为如果我使用松散索引搜索可以解决这个问题。不幸的是,这似乎在 MariaDB 中不起作用,因为它从未使用过。松散扫描设置为开启。
我试过了
SELECT MAX(a) FROM t GROUP BY a
我的数据库需要 1.1 秒。
问题是,我怎样才能让这个选择变得快速?比如 0.05 秒。
谢谢!
【问题讨论】:
-
请发布解释结果
-
一个警告:使用标准开发技术可以实现的功能有限。您可能需要请 DBA 配置您的 MySQL 实例以获得更高的性能。
-
目的是过滤掉某些行,然后返回按a分组的c最高的行。例如:选择 * FROM t WHERE b IN (5,6,7) AND a IN (2,3) GROUP BY a SORT BY c DESC 。但是,这不会给出正确的结果,因此需要加入。但我不会进入那个。
-
选择所有列无效,但
GROUP BY只选择一列。重新考虑该查询。 -
@Shadow - 自世纪之交以来,CPU 速度没有太大变化;扫描 RAM 中的 5M 行需要时间。 0.05s 不重写查询是不可能的,避免触及所有 5M。
标签: mysql performance group-by mariadb