MySQL"SELECT DISTINCT"非常大的表的效率

Sma*_*elf 7 mysql performance

我有一个非常大的表(数百万条记录),包含大约8个字段作为主键.为了简单起见,让我们说这个表看起来像这样:

    key_1 | key_2 | key_3 | ... | key_8 | value
Run Code Online (Sandbox Code Playgroud)

给定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;
Run Code Online (Sandbox Code Playgroud)

我的问题是这个查询明显慢于我的性能需求,并且该表中的数据相当稳定并且很少更新(每隔几天一次).table_1也可能是一个缓慢的子查询.如果没有在数据库中创建额外的表并在每次更新数据库时手动更新它,是否有另一种解决方案可以为我提供快速结果.我需要它跨多个MySQL会话.

Kon*_*rak 15

无法用我们掌握的信息给出确切的答案,但让我们从这些开始:

你有关于key_1的索引吗?

没有它,每个查询本身就会很慢,只需要查找123.

你有(key_1,key_2)的索引吗?

因为select distinct key_2 where key_1 = 123它可以从索引中获得所有必要的数据,所以非常快.无需访问该表.

行/索引是固定大小的吗?

遍历固定大小的表/行可以更快,因为通过计算偏移总是知道第x个记录的位置.变量行大小的表格较慢.

您是否尝试添加自动增量代理主键?

当所有必须存储的索引是列和小主键时,索引的工作方式会更好.复合主键较慢.

你考虑过只读表吗?

您可以打包myisam表以便快速访问,但它们变为只读.这是一个有其用途的黑客.

更进一步,你考虑过一个数据仓库吗?

如果表格不经常更改,则最好复制信息以便快速访问.

你能发表一个show create table声明吗?查看列和索引会有所帮助.你能发表一个explain select声明吗?查看使用哪些索引会有所帮助.