2016-04-25 112 views
0

假设您有一个包含大约100万行的id,a,b,c,d,e,f,g的表格。然后可以用多种组合的方式进行多个WHERE ...AND...AND...etc条件的查询。 这就是例如a AND b AND ea AND f AND ge AND f AND g多个或单个复合索引

因此为了解释所有组合,您将不得不创建多个复合索引,但如果a,b,c,d,e,f,g的范围是[1,10],那么不会有零。

难道一个只是让每个起始变单一的化合物,从而a,b,c,d,e,f,gb,a,c,d,e,f,g等。而在查询时间做这样的事情

#b and e have not been chosen 
    SELECT * FROM WHERE a=3 AND b!=0 AND c=4 AND d=5 AND e!=0 AND f=1 AND g=9 
    #I think you get the logic 

难道这样的程序让MySQL的仍然使用复合索引还是我真的需要创建复合索引的所有可能的组合。

最终结果是索引的数目减少到7,而不是左组合候选条件的数目是方式高于7

+2

这种问题有时是缺乏规范化的症状 – Strawberry

+0

这是模拟mysql中的物化视图,因此列数很大。 – delmalki

+0

草莓确实有一个标准化点,只要你的a-g列都是相同的上下文。但是,如果你的数据是每个a-g列都有它自己的标准化值 - 比如我在一个政府合同表中工作。根表有超过20个单独的查找参考表的链接,每个参考表都标准化为ID。如果您可以扩展更多的通用a-g上下文,我们可以为您的情况提供更好的说明和输入。 – DRapp

回答

2

如果可以MySQL将使用复合索引为了。所以如果你的数据代表了一个单一的索引将会做的分类。比方说,客户可以键入无论是企业还是个人,以及生活在一个给定的邮政编码,并且状态溢价或定期,然后像

SELECT * FROM customer 
WHERE type = 'business' 
AND postal_code = '12345' 
AND status = 'premium'; 

查询将基于建立一个复合键可以使用索引type + postal_code + status。如果您不知道status,该指数仍然有用。但如果你只有知道postal_code但不是type,索引将不会被使用 - 顺序很重要。

但我同意来自Strawberry的评论 - 这通常不是标准关系模式中的问题。在表中放置几个​​外键并不罕见,但除非您正在构建数据立方体或其他特殊设计,否则这个问题不是您可能应该拥有的问题 - 当然不包含7个字段。

但是,如果这是一个真正的问题,请考虑每个潜在索引字段的值。如果大多数查询能够使用多个索引(复合或非复合)将百万行缩小到几千,则最终扫描可能是微不足道的。尝试使用EXPLAIN PLAN来查看它停止对大多数查询的重要性。

维护索引的成本可能是微不足道的。在高度调整的事务处理系统中,单次插入,更新或删除将导致N + 1次写入:一次是针对行,另一次是针对每个索引。如果你主要阅读,那么这可能是好的。如果不是,那么通过减少写入次数,复合键的某些组合可能会带来一些好处。

但我一直在使用关系数据库超过几十年。出现这种情况的案例几乎总是通过反思模式设计来解决;我不记得在典型的关系和规范化的模式中复合键比多个索引更有意义的情况。

相关问题