MySQL 数据库 索引优化

现有sql语句:
①select * from tab1 where number = '5' and mode >= 1 and mode <= 21 order by id desc limit 100;

②select * from (select * from tab2 where mode >= 1 and mode <= 21 and name = '5' and create_time >= '2018-01-01' and create_time <= '2019-09-04' order by id desc) A order by id;

请问这两句sql该如何建立索引以达到优化的目的?对于①,我建立了联合索引,key(number,id)但是explain的时候提示没有用到该索引,用的是主键索引。

3个回答

SQL1:key (number,mode)
SQL2为什么外层要排序,直接在子查询里order by id不行么?

qq_36974792
qq_370284518 应该怎么修改呢
12 个月之前 回复
qq_36974792
qq_370284518 回复受了伤风的星辰: 是的,不用limit的话数据量很大,我试了你那个联合索引,不起作用
12 个月之前 回复
weixin_39004901
遇星 回复qq_370284518: 还是用主键,那我猜如果不加limit,返回的结果集应该很大吧?这种情况的话,可以建一个这样的索引,用到索引下推的特性:key (id,number,mode)
12 个月之前 回复
weixin_39004901
遇星 回复qq_370284518: 没看懂你的意思,子查询里面也没有limit,你在里面降序排了,然后又升序排,跟直接升序排有什么区别?
12 个月之前 回复
qq_36974792
qq_370284518 第二个SQL是因为我数据库里的数据是实时更新,正序排列,我先降序查询可以找到最新的那些符合where条件的数据,然后我需要把数据绘制成实时更新的图表,所以需要再正序排列一次
12 个月之前 回复
qq_36974792
qq_370284518 SQL1:我按照你的要求试了一下,还是不行,仍然只使用了主键索引;
12 个月之前 回复

可以使用 force_index 强制指定索引

qq_36974792
qq_370284518 我正常情况下为什么不会用到那个索引呢
12 个月之前 回复

第一个sql你那个等号和order by根本不在一个步骤里,怎么可能联合呢...
第二个sql把子查询 去掉,就用括号里的sql,把desc去掉。

weixin_42080504
have_power 回复qq_370284518: 索引不是随便加的,如果你的离散度太小,加了反而慢,另外你的表更新周期也得考虑。你要是非得想要索引,那两个字段分别单独加一个就行了。
12 个月之前 回复
qq_36974792
qq_370284518 那第一个怎么修改索引呢
12 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问