mysql - 为什么大于与等于在 MySQL SELECT 中有所不同?

标签 mysql

我有一个很大的 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/

相关文章:

php - 在 php 代码中使用 post 数组

php - 当我通过 Artisan 类运行时,sp​​atie/laravel-backup "mysqldump"无法识别

php - 无法使用循环在表中插入值

mysql - 使用关系数据库进行 Map Reduce

mysql - mysql中replace函数出错

mysql - 从查询返回的变量值(结果集为空)?

mysql - 如何从子查询中获取值

MySQL - 带有内连接的 SQL 查询花费太长时间

mysql - 更改特定存储过程的 DEFINER 吗?

MYSQL - 与连接表的自连接