【问题标题】:mysql query optimization with order by and limit by clausemysql查询优化与order by和limit by子句
【发布时间】:2014-07-07 22:47:17
【问题描述】:

我有一个包含成员审计信息的表。

我有一个类似的查询:

select columnsname from tablename 
where member id =? 
order by audit_date desc, audit_time desc 
limit 0,150

此查询需要很长时间才能执行。我正在查询的表包含大约 2 到 30 亿条记录。

我无法删除 order by 子句,因为我希望记录按审计日期和审计时间的降序排列。由于我需要分页功能,所以我也无法删除限制子句。

我已经在成员 ID、审计日期和审计时间上应用了索引。

谁能帮助我优化此查询或建议我可以在 Java 层中应用的任何其他方法来实现此功能?

下面是我的解释输出。 左边是列名,右边是它的值。

┌───────────────┬──────────────────────────────────┐
│ Column Name   │ Column Value                     │
├───────────────┼──────────────────────────────────┤
│ ID            │ 1                                │
│ Select Type   │ simple                           │
│ table         │ member_audit_info                │
│ type          │ ref                              │
│ possible_keys │ member_audit_info_memebrid_index │
│ key           │ member_audit_info_memebrid_index │
│ ref           │ const                            │
│ rows          │ 208988                           │
│ extra         │ Using where,Using filesort       │
└───────────────┴──────────────────────────────────┘

【问题讨论】:

  • 如果可以,请显示表结构。
  • 请同时添加explain select column_name from ...的输出
  • 是的,我可以,但实际上我是 stackoverflow 的新手,所以我不知道如何以表格形式添加帖子。请问您也可以帮我吗?
  • 编辑您的问题并添加您的输出,如代码。
  • 您有关于 audit_date 和 audit_time 的索引吗?

标签: java mysql jsp pagination


【解决方案1】:

使用包含日期和时间部分的单列 TIMESTAMPDATETIME,并根据该单列进行排序,这可能会提高查询的性能。

示例查询:

select columnsname from tablename 
where member_id =? 
order by audit_timestamp desc 
limit 0,150

注意:关于查询性能的几点说明

  • member id 列应该被编入索引。
  • 仅获取所需的列
  • 减少限制(分页大小)

【讨论】:

  • 感谢您的好建议。但是这个表结构已经在生产中应用了,我们几乎不可能改变表结构。我们只获取需要的列,memebr_id 已经被索引了。
  • 在减少可能有助于提高性能的限制(分页大小)后尝试最后一个选项。
  • 感谢您的建议。我也有一个想法。如果我将使用查询 select columnsname from tablename where member_id =?和 之间的 audit_date,然后使用 order by 子句和 limit 子句在此视图上触发查询。所以这是一个更好的选择还是可以提供性能问题
  • 从实际表中创建一个新视图,将 audit_date 和 audit_time 组合在一个列(时间戳)中,然后在该视图上触发所有查询,这肯定会提高性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2012-12-31
  • 2012-11-30
相关资源
最近更新 更多