por*_*ton 1 mysql index cardinality-estimates
假设一个长(例如 1000000 个条目)MySQL 表的t一列c包含少于 10 个不同的 TINYINT 值。
还假设这些值中的大多数(例如 99% 甚至 99.9%)都等于 0。
在此列上添加索引是否会加快如下查询的速度?
SELECT * FROM t WHERE c > 1
Run Code Online (Sandbox Code Playgroud)
答案是“这要看情况,您没有提供足够的信息”。
将自己置于优化器的立场上。您会看到此查询执行 SELECT *。C 很可能不是表中唯一的列,假设您还有 A 列和 B 列。这意味着 C 上的索引查找将需要对每一行进行查找操作,以从表中带回 A 和 B。现在归结为成本 - 如果您有 1M 行,并且如果优化器可以意识到您的查询将返回 1% = 10,000 行。这意味着使用索引的成本是执行索引查找、获取 10K 行,然后执行 10K 查找以返回 A 列和 B 列。
不幸的是,MySQL 不像其他一些引擎那样维护直方图,而只维护密度向量...因此它可能估计将返回约 10% 的行,并且根据该信息,估计成本会高得多。
另一种方法是扫描 1M 行并“即时”过滤,而不使用索引。哪个更便宜?我不知道 - 这取决于桌子的大小。如果A和B都是BOOLEAN列,占用的空间很小,它可能会认为扫描表会更便宜。如果 A 和 B 是巨大的 BLOBS,则很可能会增加估计成本。
顺便说一句..如果不使用 * (我假设您仅作为示例给出),而是仅列出您需要的最小列集,比如说 A 和 C,那么 (C,A) 上的复合索引将永远是最便宜的选择,因为您只是节省了自己的查找时间。
华泰
| 归档时间: |
|
| 查看次数: |
2775 次 |
| 最近记录: |