我有一张这样的桌子
CREATE TABLE values (
id int(10) auto_increment NOT NULL,
molecule_id int(5) NOT NULL,
descriptor_id int(5) NOT NULL,
T double DEFAULT NULL,
value double NOT NULL,
PRIMARY KEY (id),
KEY index1 (molecule_id, T),
KEY index2 (descriptor_id, T)
) ENGINE=InnoDB;
表的行是 3000 个descriptor_ids、600 个molecules_ids 和3500 个具有随机双值的Ts 的许多组合(约20 亿行)。
我的印象是,对于像这样的查询
SELECT T, value FROM values WHERE molecule_id = X AND descriptor_id = Y
mysql 将使用两个键,然后与结果相交。但是Explain extended
在这个查询上做一个告诉我它只使用了 index2,在 index1 和 index2 之间进行了选择。
分子 ID = X 命中大约 1/600 的表格。descriptor_id = Y 命中表的一小部分(如 0.001%)或大约 1/700,具体取决于 Y。
看起来相交会比仅使用 index2 并扫描超过 250 万行的其余部分更快。即使 3000 个descriptor_id 分布均匀,它仍然会平均留下 800,000 行要扫描。
我错过了什么?