【问题标题】:MySQL: Index for fast DISTINCT queries?MySQL:快速 DISTINCT 查询的索引?
【发布时间】:2013-01-02 14:16:58
【问题描述】:

对于某个列的 DISTINCT 查询,我需要设置哪些索引才能尽快获得结果?

示例表列:

id        INTEGER
name      VARCHAR(32)
groupname VARCHAR(16)

我经常需要获取所有组的列表,

SELECT DISTINCT groupname FROM data ORDER BY groupname

该表可以有 > 200k 个条目,但只有大约十几个组。我不想为组名使用单独的表,因为数据通常是从 CSV 文件中导入的。

【问题讨论】:

  • 嘿。你不能为组制作一个单独的表格,然后向提到的表格添加一个关系。这样您就可以从规范化中受益并解决您的问题!即使数据来自 CSV,您也可以使用像 talend 这样的优秀 ETL!
  • @mamdouh - 这将是理想的,但他提到他会尽可能避免这样做。
  • @EricPetroelje - 好的。这只是一个建议。无论如何,我认为添加一个可更新的视图将解决他的问题,不是吗!
  • @mamdouh - 因为他使用的是DISTINCT,所以这里不可能有可更新的视图。物化视图将是一个不错的选择,但 MySQL 不支持这些..
  • @EricPetroelje - 我对可更新视图的意思是,只要组名更改不频繁。每当添加一个新组时,他就可以删除前一个组并添加一个新组。这样他就会保持更新。他第一次可以手动制作。只是一个想法。喜欢被讨论:)

标签: mysql query-optimization


【解决方案1】:

在这种情况下,groupname 上的索引应该可以为您带来最佳结果。

如果这还不够好,可以考虑更多选项 - 首先,您可以缓存该查询的结果,以便仅在绝对必要时运行它。其次,您可以创建一个单独的表来存储 groupname 值并通过插入触发器填充它(这将避免更改您的 CSV 导入过程)

【讨论】:

  • 你指的是什么类型的索引?
【解决方案2】:

对 groupname 进行索引将解决您的问题。如果您在插入/更新时非常担心查询的性能,那么请尝试“column prefix Indexing”,而不是索引整个列。

仅在 varchar 上添加索引可能会减慢您的插入/更新速度,因为它需要为每次写入更新索引查找。更多信息请阅读 BTree 索引算法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 2018-11-30
    • 2017-01-11
    • 2022-01-25
    相关资源
    最近更新 更多