关于MYSQL多条件查询orderby优化的问题

wondyfox 2010-09-26 09:36:35
select b.sessionkey
from dbaudit_fd0005864b8e3214_20100919 b ,
dbauditalarm_fd0005864b8e3214_20100919 c
where b.alarmkey>0
and c.ruleid in (1,-1) and b.alarmkey=c.alarmkey
and b.dt>=1284825600 and b.dt<=1284907022 and 1=1
order by b.dt limit 1000
以上是我的查询语句,说明下:
1.我不使用order by 可以实现我需要的结果,但是如果我需要倒序怎么办,那就非常慢了
2.由于记录表中我需要查询的记录是在表最后的记录,所以直接用倒序很蛮,但如果记录在刚开始的记录中的话,我使用倒序就很慢了。
大家帮忙想想办法
...全文
265 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2010-09-26
  • 打赏
  • 举报
回复
创建复合索引

dbaudit_fd0005864b8e3214_20100919(dt,alarmkey)
wondyfox 2010-09-26
  • 打赏
  • 举报
回复
不好意思,是我没说清楚,怕贴出来太乱,大家看不懂,我是对需要的那几个字段单独建索引。
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
dbauditalarm_fd0005864b8e3214_20100919 0 PRIMARY 1 id A 262964 BTREE
dbauditalarm_fd0005864b8e3214_20100919 1 alarmkey_dbauditalarm_fd0005864b8e3214_20100919 1 alarmkey A 262964 YES BTREE
dbaudit_fd0005864b8e3214_20100919 0 PRIMARY 1 id A 27209342 BTREE
dbaudit_fd0005864b8e3214_20100919 1 dt_dbaudit_fd0005864b8e3214_20100919 1 dt A 52025 YES BTREE
dbaudit_fd0005864b8e3214_20100919 1 alarmkey_dbaudit_fd0005864b8e3214_20100919 1 alarmkey A 21 YES BTREE
ACMAIN_CHM 2010-09-26
  • 打赏
  • 举报
回复
[Quote]那两张表查询涉及到的字段全有索引[/Quote]贴一下很复杂吗? 还是说你的这些表中任意两个字段组合都有复合索引? 任意三个排列组合也创建了索引?


问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧
wondyfox 2010-09-26
  • 打赏
  • 举报
回复
那两张表查询涉及到的字段全有索引
explain结果如下:
1 SIMPLE b range dt_dbaudit_fd0005864b8e3214_20100919,alarmkey_dbaudit_fd0005864b8e3214_20100919 dt_dbaudit_fd0005864b8e3214_20100919 9 null 14979235 Using where

1 SIMPLE c ref alarmkey_dbauditalarm_fd0005864b8e3214_20100919 alarmkey_dbauditalarm_fd0005864b8e3214_20100919 9 heidunlog.b.alarmkey 1 Using where
ACMAIN_CHM 2010-09-26
  • 打赏
  • 举报
回复
贴出你的
show index from dbaudit_fd0005864b8e3214_20100919;
show index from dbauditalarm_fd0005864b8e3214_20100919;
explain select b.sessionkey
from dbaudit_fd0005864b8e3214_20100919 b ,
dbauditalarm_fd0005864b8e3214_20100919 c
where b.alarmkey>0
and c.ruleid in (1,-1) and b.alarmkey=c.alarmkey
and b.dt>=1284825600 and b.dt<=1284907022 and 1=1
order by b.dt limit 1000;

三个语句的结果。

56,685

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧