假设我有一个包含 100 万行和很多列的表。 X 和 Y 是两个 varchar 列。对于 0.1% 的行,X 和 Y 都有一个值。对于其他 99.9% 的行,X 和 Y 均为空。假设我在 (X,Y) 上创建一个复合 BTree 索引。
MySQL 会索引所有这些空值吗?
当我单独查询X或者X和Y一起查询时,我会得到很好的性能。但是,每次插入或更新 X 和 Y 都为空的新记录时,我会付出一点点惩罚吗?
如果您在
table(col1, col2)
上创建索引,并且执行 WHERE col1 = 'something' AND col2 = 'something'
,您将利用该索引;这将是非常有选择性的。与WHERE col1 = 'something'
相同。
但是
WHERE col1 IS NOT NULL
你必须进行测试。 WHERE col1 IS NULL
会扫描表,因为在这种情况下索引根本没有选择性。