MySQL:快速 DISTINCT 查询的索引?

Posted

技术标签:

【中文标题】MySQL:快速 DISTINCT 查询的索引?【英文标题】:MySQL: Index for fast DISTINCT queries? 【发布时间】: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 - 我对可更新视图的意思是,只要组名更改不频繁。每当添加一个新组时,他就可以删除前一个组并添加一个新组。这样他就会保持更新。他第一次可以手动制作。只是一个想法。喜欢被讨论:) 【参考方案1】:

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

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

【讨论】:

你指的是什么类型的索引?【参考方案2】:

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

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

【讨论】:

以上是关于MySQL:快速 DISTINCT 查询的索引?的主要内容,如果未能解决你的问题,请参考以下文章

mysql创建索引的原则

需要帮助优化 mysql 查询以使其按索引快速排序

mysql建立索引的几大原则

MySql 技术内幕 (查询处理和子查询)

MySql 技术内幕 (查询处理和子查询)

mysql GROUP BY、DISTINCT、ORDER BY语句优化