我有一个包含会员审核信息的表。
我有一个类似的查询:
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 │
└───────────────┴──────────────────────────────────┘
答案 0 :(得分:0)
使用包含日期和时间部分的单列TIMESTAMP
或DATETIME
,并根据单列进行排序,这可能会提高查询的效果。
示例查询:
select columnsname from tablename
where member_id =?
order by audit_timestamp desc
limit 0,150
注意:(关于查询效果的几点)
member id
应编入索引。