MySQL“;选择DISTINCT";非常大的表的效率

MySQL“;选择DISTINCT";非常大的表的效率,mysql,performance,Mysql,Performance,我有一个非常大的表(数百万条记录),其中包含大约8个字段作为主键。为了简单起见,让我们假设该表如下所示: key_1 | key_2 | key_3 | ... | key_8 | value 给定key_1的值,我需要获取key_2、key_3、…、key_8的所有可能值 大致如下: SELECT DISTINCT key_2 FROM table1 WHERE key_1 = 123; SELECT DISTINCT key_3 FROM table1 WHERE

我有一个非常大的表(数百万条记录),其中包含大约8个字段作为主键。为了简单起见,让我们假设该表如下所示:

    key_1 | key_2 | key_3 | ... | key_8 | value
给定key_1的值,我需要获取key_2、key_3、…、key_8的所有可能值 大致如下:

    SELECT DISTINCT key_2 FROM table1 WHERE key_1 = 123;
    SELECT DISTINCT key_3 FROM table1 WHERE key_1 = 123;
    ...
    SELECT DISTINCT key_8 FROM table1 WHERE key_1 = 123;

我的问题是,这个查询比我的性能需要慢得多,而且这个表中的数据相当稳定,很少更新(每隔几天更新一次)。表1也可能是一个缓慢的子查询。除了在数据库中创建一个额外的表并在每次更新数据库时手动更新它之外,还有其他解决方案可以给我快速的结果吗。我需要它在多个MySQL会话中工作。

根据我们掌握的信息无法给出明确的答案,但让我们从以下几点开始:

你在键1上有索引吗? 如果没有它,每个查询本身就已经很慢了,只需要查找123

你有索引吗(键1,键2)? 因为
选择distinct key_2,其中key_1=123
非常快,如果它能够单独从索引中获得所有必要的数据。不需要访问该表

行/索引的大小是否固定? 遍历固定大小的表/行可以更快,因为只需计算偏移量就可以知道第x条记录在哪里。可变行大小的表速度较慢

您是否尝试添加自动增量代理主键? 当索引只需要存储列和一个小的主键时,它的工作方式会更好。复合主键速度较慢

你考虑过只读表吗? 您可以打包myisam表以便快速访问,但它们将变成只读。这是一种有其用途的黑客

更进一步,您是否考虑过数据仓库? 如果表不经常更改,最好复制信息以便快速访问

你能发布一个
showcreatetable
语句吗?查看列和索引会有所帮助。 你能发布一个
解释选择
语句吗?看看使用了哪些索引会有所帮助

SELECT DISTINCT key_2 FROM table1 WHERE key_1 = 123;
这可以使用主键索引(键1、键2等)。它将执行索引扫描,比表扫描或临时表扫描快

SELECT DISTINCT key_3 FROM table1 WHERE key_1 = 123;
无法使用主键,因为键_1和键_3的组合不构成主键的前缀。您需要按照该顺序在键_1和键_3上创建一个复合索引。然后,它还可以使用该索引执行索引扫描

SELECT DISTINCT key_8 FROM table1 WHERE key_1 = 123;

需要按顺序索引键1和键8。同上。

我认为最好创建附加表,并在每次数据更改时更新它。在键中使用的列上创建不同的索引。不幸的是,由于我的公司政策,我无法发布create table语句。也就是说,除了所有字段的主键之外,表中没有索引。没有索引吗?你的解释选择可能会受到伤害。我想您不能复制表并重命名列,只是为了让我们使用?