在某些情况下,像您这样的布尔值(true 和 false,或 1 和 0)列是可以的,但是如果您发现自己为这样的列建立索引,那么您可能已经越界了。
如果这些值是均匀分布的(50% 正确,50% 错误),MySQL 甚至不会使用索引,除非它是一个覆盖索引。通过二级索引查找每一行的成本很高,其中大部分数据集将被返回,因此 MySQL 将改为执行简单的表扫描。
在您的情况下,由于您正在查询较小的分布(1% 错误),因此 MySQL 可能实际上会使用该索引。
但是,您必须想知道为什么必须在索引中存储这么多甚至没有被使用的真实值,然而,它们会减慢索引更新,并且只是浪费空间。
...修改...
相反,请考虑以另一个表的形式将索引存储在外部。考虑添加一个名为 open_deals 的表,其结构如下,其中 deal_id 是交易和 open_deals 的主键:
deal_id
----------
100
121
135
要获得您的公开交易,只需执行以下操作:
SELECT deals.*
FROM open_deals
STRAIGHT_JOIN deals
ON deals.deal_id = open_deals.deal_id
我们使用直接连接,因为我们总是知道我们将从左到右连接,并且我们正在使 MySQL 不必考虑它。
由于 open_deals 仅包含单个索引列,因此该索引将充当覆盖索引。在正确配置的强大服务器上,索引将存储在内存中,因此表会非常快。
在内部,连接类似于使用原始二级索引,但没有所有这些未使用值的开销。
为了获得最佳性能,请确保将新值附加到 open_deals 表的末尾,或者换句话说,所有新值都应该大于上一个值,但无论如何您都在这样做。
要将交易设置为打开,将其附加到 open_deals 表,并将其标记为已关闭,从 open_deals 表中删除 id。
这里的优点是您不必在表之间移动记录,不必更新其他索引(使用 InnoDB 的聚集索引更糟)。此处更新的唯一索引是 open_deals 表上相当小的索引。