【问题标题】:Query taking so much time in mysql but not in oracle查询在mysql中花费了很多时间,但在oracle中却没有
【发布时间】:2013-12-31 09:25:11
【问题描述】:

为什么下面的查询在 mysql 中花费了这么多时间,而在 oracle 中却没有

select * from (select * from employee) as a limit 1000

我在 oracle 和 MySQL 数据库中测试此查询,此表中有 50,00,000 条记录。

我知道这些查询应该写成这样

select * from employee limit 1000

但是为了向我们的自定义动态网格显示数据和总行数,我们只有一个查询,我们使用简单的select * from employee 查询,然后添加限制或其他条件。

我们把这个问题做短了。

但我的问题是“为什么在 mysql 中进行这样的查询需要太多时间?”

【问题讨论】:

  • 因为你使用的 MySQL 版本并没有通过重写/删除派生表来优化查询。也可以用 mysql 5.6 或 MariaDB 5.5 试试。
  • 第一个查询在 Oracle 中几乎需要 0 秒,因为它不会在那里运行 - 语法对 Oracle 无效。
  • 是的,你是对的@a_horse_with_no_name 我忘了给别名
  • Oracle 不支持 limit 子句(除非您使用的是 Oracle 12c)
  • @DarshanPatel 您的 Oracle 数据库版本是多少?

标签: mysql database oracle


【解决方案1】:

嗯,因为要执行这个查询,MySQL 必须遍历表中的所有 50K 行,将它们复制到临时表(在内存中或磁盘上,取决于大小),然后取前 1000 行。

在 MySQL 中,如果您想优化使用 LIMIT 的查询,您需要遵循一些防止扫描完整数据集(主要是您排序依据的列上的索引)的做法。

请看这里:http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html

【讨论】:

  • 好的@Galz,但是为什么这个查询在oracle中执行得很快?
  • 因为oracle优化器比mysql优化器好。
猜你喜欢
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 2018-01-08
相关资源
最近更新 更多