假设我有一张包含 100 万行和大量列的表。X 和 Y 是两个 varchar 列。0.1% 的行 X 和 Y 都有值。其余 99.9% 的行 X 和 Y 都为空。假设我在 (X,Y) 上创建一个复合 BTree 索引。
MySQL 会索引所有这些空值吗?
当我单独查询 X 或同时查询 X 和 Y 时,我将获得出色的性能。但是,每次插入或更新 X 和 Y 均为空的新记录时,我是否都会付出一点代价?
假设我有一张包含 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
会扫描表,因为在那种情况下索引根本没有选择性。在 INSERT 或 UPDATE 上更新索引确实会产生少量开销。这不能是 UNIQUE 索引,因此工作量会少一些。但在大多数情况下,这并不值得担心,除非您的 INSERT / UPDATE 工作量远大于您的 SELECT 工作量。如果您可以设置列,
COLLATE latin1_bin
您将获得最轻的索引权重。但没有表情符号、中文字符或不区分大小写。