mysql - 在某些情况下语句之间缺少索引

标签 mysql query-optimization

我有一个庞大的数字数据库,我正在寻找两者之间的匹配:

例如:

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/

相关文章:

mysql - 如何将单元格中的文本替换为mysql中另一个表中的数据

mysql - 请教我如何优化这个 MySQL 查询

mysql - 统一这 2 个使用 3 个表的查询

sql - PostgreSQL 在一次查询中获取事件发生的每日、每周和每月平均值

MySQL资源利用率优化

php - 使用 fetch_assoc 从数据集中获取特定行?

mysql - 如何在 SQL 中正确地加倍 JOIN

MySQL - 将文本更新为原始文本的变体

mysql - SQL语句是否立即执行?

mysql - 在 MySQL 中的 BigInt 列上建立索引