假设我们在我的表中有A、B、C、D、E、F、G、H列,如果我在列ABCDE上建立复合索引,因为这些列将进入where子句,然后我希望在ABCEF上建立复合索引,然后我在同一个表中但在不同的查询中在ABCEF上创建新的复合索引,我们希望在列ABCGH上建立索引,因为我在同一个表中建立另一个复合索引,
所以我的问题是,我们是否可以根据需要创建太多的复合索引,因为有时候where子句中的列会发生变化,我们必须提高其性能,所以请告诉我,是否有其他方法可以优化查询,或者我们可以根据需要创建多个复合索引。
我尝试了多重复合指数,它没有给予我任何问题,直到现在,但我仍然想知道从你们所有人,它会给我任何问题,在未来或它是确定只使用复合指数,而不是单一指数。
你的回答将帮助我等待你的答复很多。提前感谢。
4条答案
按热度按时间6g8kf2rb1#
您可以拥有任意多个索引。但是,每个额外的索引在更新、插入或删除时都要付出代价。
1.找到共同的部分并为它们建立索引。
1.或者在查询太慢时根据需要创建它们。
例如,如果您“需要”ABCDE、ABDEF和ABGIH的索引,则仅在AB上创建索引
mnemlml82#
InnoDB支持每个表最多64个索引(参见https://dev.mysql.com/doc/refman/8.0/en/innodb-limits.html)。
如果你尝试为N列的每一个排列创建一个复合索引,你将需要N-阶乘索引。所以对于8列,你将需要40,320个索引。显然这超过了InnoDB所支持的。
你可能不需要那么多的索引。实际上,我很少看到一个给定的表中有6个以上的索引。所有需要的查询都被其中一个优化了。
我知道您说过,有时您会更改查询的WHERE子句中的项,因此可能需要具有不同列的复合索引。
你可以依赖于那些拥有所有列的子集的索引,这将是最优的,虽然不是100%的优化,但总比没有索引好。
在编写给定查询之前,您无法预测该查询的最佳索引集。
pexxcrt23#
=
测试的列排在前面。(这些列在INDEX
中的顺序无关紧要。)=
测试),如果您添加了更多列,那么一个INDEX
仍然可以用于这两种情况。pengsaosao4#
每个索引都需要磁盘上的存储空间,并且在每次更新(/insert/delete)索引列值时都需要更新时间。
因此,只要您没有耗尽存储空间或写操作太慢(因为您必须更新太多索引),就不会限制您创建所需数量的特定索引。
这取决于您的用例,并且应该使用类似生产的数据进行衡量。
一个常见的解决方案是为您最重要的查询创建一个特定的索引,例如在您的情况下ABCDE。
其他查询仍然可以从左到右使用相同数量的列,直到出现第一个差异。例如,搜索ABCEF的查询仍然可以在前面提到的索引上使用ABC。
要使用列E,您可以在查询中添加一个where条件到D,您知道它匹配所有值,例如,如果您知道只有值1-99,则D〈100。