假设我有一个包含1000万行的MySQL stuff
表,在一个名为fruit
的列中,该行中的数据25%用单词“apple”填充,25%用单词“orange”填充,25%用单词“pear”填充,其余的是各种其他单词。fruit
列是索引的一部分。
从纯粹的性能Angular 来看(忽略它如何保存磁盘空间和其他资源,以及如何更具逻辑意义),将fruit
列更改为它自己的表,然后在fruit
和stuff
表之间执行JOIN
,是否会为任何查询提供任何主要的性能优势?
或者我应该只看索引?
如果这个表有多个类似的行(car
、toy
、color
),这些行也有很多重复的数据,并且也在索引上,这会对性能有什么影响?
1条答案
按热度按时间tag5nh1u1#
即使在一个非常大的表中实现索引仍然可以很好地工作。你应该避免的是在一个表中创建很多不同的索引,因为这会大大降低它的速度。
发现这篇伟大的文章在这里:https://towardsdatascience.com/indexing-very-large-tables-569811421ee0
在大型表上创建和维护索引的成本高于在较小表上创建和维护索引的成本。无论何时创建索引,都会在磁盘上创建索引列+主键的副本,并尽可能将索引保留在内存中。如果索引包含查询所需的所有数据,则它永远不会转到实际表。例如,如果您已经过滤了customer_id上的数据并按年份分组,索引为on(customer_id,year),并且您没有在SELECT语句中查询任何其他内容,那么查询将不会转到磁盘表来获取记录,因为索引满足查询的所有数据要求。
您应该努力为所有查询提供最佳索引,即覆盖大多数(如果不是全部)列的索引,这些列在过滤、分组、排序、选择等操作中应该使用索引。这些索引称为覆盖索引。它们覆盖了查询的要求。