我有一个很大的 MyISAM 表。它接近 100 万行。它基本上是一个项目列表和一些关于它们的信息。
有两个指标:
- 主要:项目 ID
- date(日期)和col(int)。
我运行两个查询:
SELECT * FROM table WHERE date = '2011-02-01' AND col < 5 LIMIT 10
SELECT * FROM table WHERE date < '2011-02-01' AND col < 5 LIMIT 10
第一个在 ~0.0005 秒内完成,第二个在~0.05 秒内完成。那是 100 倍的差异。我期望这两者以大致相同的速度运行是错误的吗?我一定不是很了解指数。我怎样才能加快第二个查询?
最佳答案
不管是Mysql还是归结为基本的算法理论。
大集合上的大于和小于操作比恒等操作慢。 对于大型数据集,确定小于或大于的理想数据结构是自平衡树(二叉树或 n 树)。 在自平衡树上,找到所有小于/大于的最坏情况是 log n。
身份查找的理想数据结构是哈希表。哈希表的性能通常为 O(1),即固定时间。然而,哈希表不适用于更大/更少。
一般来说,一棵平衡良好的树的性能仅略低于哈希表(这就是 Haskell 为哈希表使用树的原因)。
因此无论 Mysql 做什么,<,> 比 = 慢也就不足为奇了
旧答案如下:
因为第一个类似于 Hashtable 查找,因为它的“=”(特别是如果您的索引是一个哈希表)它会比第二个更快,后者可能更适用于像索引这样的树。
由于 MySql 允许配置索引格式,您可以尝试更改它,但我很确定第一个总是比第二个运行得更快。
关于mysql - 为什么大于与等于在 MySQL SELECT 中有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894409/