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 查询的索引?的主要内容,如果未能解决你的问题,请参考以下文章