使用order by和limit by子句进行mysql查询优化

时间:2014-07-04 11:01:17

标签: java mysql jsp pagination

我有一个包含会员审核信息的表。

我有一个类似的查询:

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

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

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

我已经在会员ID,audit_date和audit_time上应用了索引。

任何人都可以帮助我优化此查询或建议我可以在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       │
└───────────────┴──────────────────────────────────┘

1 个答案:

答案 0 :(得分:0)

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

示例查询:

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

注意:关于查询效果的几点

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