我在一次采访中遇到过这种情况。有一个有数百万条记录的表,这个表只有两个列,id是主键,time_stamp是date_time类型。我想根据时间戳过滤数据。注意:我不应该索引time_stamp列。在这种情况下,我如何以更快的方式检索数据?
这是我给面试官的回答。
- 我们可以对该表进行分区,以在检索时获得性能。
- 我们可以对该表进行分片,以在检索时获得性能。
他说你不应该把这两个概念用在这个问题上!他这样问我,还有别的办法吗?我对这个问题很好奇,我在寻找答案。
我的查询:
*是否可以从time_stamp列中检索数据,而无需索引,分区和分片?
*对time_stamp列做索引是个坏主意吗?
2条答案
按热度按时间v1l68za41#
在MySQL中,使用索引来减少检查的行是一种合法的方法,而且是最有效的。在datetime数据类型上使用索引没有问题。我自己也经常这么做。
我认为面试官只是想评估你的知识,想出一个解决方案,而不是默认的,最常见的方法。换句话说,测试你的知识广度。
可能存在无法向表添加索引的情况。例如,没有足够的存储空间,或者没有时间构建索引。
分区和分片是合理的答案。
另一个答案可能是缓存。也就是说,在高速RAM中存储所需数据的副本。当然,这会引入其他问题,比如如何知道缓存中的数据副本与表中的数据同步,但这是提高平均性能的一种流行方法。
也有可能面试官有一个非常具体和聪明的答案,他正在寻找,一些罕见的解决方案,几乎没有人会知道。这通常是一个低质量的面试问题,因为它告诉面试官关于候选人的很少。它只告诉他们一个事实:面试者是否知道这些细节。不幸的是,这是一种很常见的面试风格。
听起来你躲过了一劫。
cetgtptt2#
(我同意比尔的观点,但这是我的两分钱。)
分区和分片每个都可能比索引需要更长的时间来实现。这两种情况都不会导致
SELECT ... WHERE ts ...
与INDEX
一样高效。只有一个PK和ts,InnoDB将构建
INDEX
作为一个有效的“表”,按ts排序,并包含表的所有列。这是非常有效的。如果问题指出行是按时间顺序插入的,那么您可以使用
id
进行游戏,因为它的工作方式非常类似于ts
。但是,如何使用WHERE ts ...
启动查询呢?在
DATETIME
或TIMESTAMP
上索引是可以的。但它可能不安全,使它UNIQUE
。当有更多列时,使用INDEX(order_id, ts)
也是相当合理的。或甚至这将一个“顺序”的行“聚集”在一起,使得这样的查找稍微更有效。它按时间顺序排列,如果这是可取的。仍然有
id AUTO_INCREMENT
来唯一地标识每行,但这可能不是必需的。id
在PK中以使其唯一(如果ts
不可信任)。分区很少有用。分片是复杂的,希望超出你的工作所需要的任何东西。
分区实际上可能比索引消耗更多的磁盘空间。
底线是--面试问题不是一个好问题。