我有一个庞大的数字数据库,我正在寻找两者之间的匹配:
例如:
1112203488
我的表格是这样的:
|沙顿 |伊顿|信息 |
我在 sATON 和 eATON 上有两个索引(名为 s 和 e)
所以我的SQL如下:
SELECT *
FROM `data2`
FORCE INDEX ( s, e )
WHERE 1112203488
BETWEEN `sATON`
AND `eATON`;
所以通常当使用索引时,查询将花费几乎为零的时间 (0.02)。然而,有时看起来 MySQL 中的表统计信息正在决定进行全表扫描,尽管我强制在 SQL 中使用索引。这是一个巨大的性能损失,因为它将查询时间从 0.02 秒缩短到 120 秒。
以下是一些运行速度很快的示例(使用索引):
67372289
134744072
慢的:
1112203488
1348203839
如果它有助于索引使用 BTREE。
最佳答案
如果任何此类查询将返回最多一行,这意味着 (sATON, eATON)
范围不重叠。
因此,并且仅当范围不重叠时,您可以改用此查询:
SELECT *
FROM data2
WHERE sATON =
( SELECT MAX(sATON)
FROM data2
WHERE sATON <= 1112203488
)
AND eATON =
( SELECT MIN(eATON)
FROM data2
WHERE eATON >= 1112203488
)
甚至这个(只需要使用一个索引,sATON
一个):
SELECT *
FROM data2
WHERE sATON =
( SELECT MAX(sATON)
FROM data2
WHERE sATON <= 1112203488
)
AND eATON >= 1112203488
关于mysql - 在某些情况下语句之间缺少索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7955382/