我有一个大的MyISAM表.它接近100万行.它基本上是一个项目列表和一些有关它们的信息.
有两个指数:
我运行两个查询:
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
Run Code Online (Sandbox Code Playgroud)
第一个在~0.0005秒内完成,第二个在~0.05秒内完成.这是100倍的差异.我期望这两者以大致相同的速度运行是不对的?我不能很好地理解这些指数.如何加快第二次查询?
不管Mysql如何,它都归结为基本的算法理论。
大集合上的大于和小于操作比恒等操作慢。对于大型数据集,用于确定小于或大于的理想数据结构是自平衡树(二叉树或 n 树)。在自平衡树上,找到所有小于/大于的最坏情况是log n。
身份查找的理想数据结构是哈希表。哈希表的性能通常为O(1),即固定时间。然而,哈希表不适合更大/更少。
一般来说,平衡良好的树的性能仅比哈希表稍差(这就是 Haskell 使用树作为哈希表的方式)。
因此,无论 Mysql 做什么,<,> 比 = 慢也就不足为奇了
旧答案如下:
因为第一个类似于哈希表查找,因为它的“=”(特别是如果您的索引是哈希表),它会比第二个更快,第二个可能更适合树状索引。
由于 MySql 允许配置索引格式,您可以尝试更改它,但我相当确定第一个总是比第二个运行得更快。
| 归档时间: |
|
| 查看次数: |
2412 次 |
| 最近记录: |