索引问题:a=xxx and b=xxx and id

Longerandlonger 2014-12-12 10:45:40
id是主键,a,b是普通字段,那么查询语句:

select * from my_table where a = xxx and b = xxxx and id<xxxx

这样的查询,我应该建立一个什么索引?是 (a, b) 还是 (a, b, id)。

引擎是innodb,所以索引叶子节点的值就是主键(id)了。但这个id不在内部节点,所以不能用来排序

纠结就在这里:如果我只有(a, b)索引,那么上面的查询语句需要把所有满足 a=xxx and b=xxxx 的记录加载到内存。我是不是应该建立(a, b, id) 索引?
...全文
315 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengchow2001 2014-12-12
  • 打赏
  • 举报
回复
创建(a,b)就可以了,效果是一样的
ACMAIN_CHM 2014-12-12
  • 打赏
  • 举报
回复
建这个索引就行了。 (a, b, id)
珠海-天堂 2014-12-12
  • 打赏
  • 举报
回复
加上ID,不加白不加,加了不白加。 插播一个广告 1、1年以上全职MYSQL/REDIS DBA工作经验. 2、精通/熟悉MySQL数据库的运行机制和体系架构. 3、精通/熟悉MySQL数据库的管理,有丰富的故障处理经验优先. 4、熟悉linux操作系统的使用,有一定的运维经验. 5、熟悉shell/python编程,善于利用脚本解决重复问题 6、熟悉mysql/redis/mongodb的使用优化. 7、基础扎实,做事认真,善于总结,有想法,能承受压力 8、性格沉稳细致或者灵活有原则,愿意陪公司一起成长 工作地点:珠海魅族总部 待遇面议,高于业界普通水平 面试过程:先QQ,电话面试,达成一致后到公司来面谈一下就可以定下来。 联系QQ:32416070,不是猎头。
benluobo 2014-12-12
  • 打赏
  • 举报
回复
是的 按照你的查询方式在索引中加入主键,是可以避免扫描更多的索引节点 如果你的a=xx and b=xx 的选择性很高,效率也是很好的
Longerandlonger 2014-12-12
  • 打赏
  • 举报
回复
引用 1 楼 benluobobo 的回复:
建立(a,b) 即可 因为 innodb的辅助索引 包含了 主键值, 所以没必要在辅助索引中包括主键字段
只有再索引的叶子结点才有主键,在内部节点并没有主键。也就是说,索引里的id是无序的,在范围查询的时候执行过滤的时候,用不到这个主键。
rucypli 2014-12-12
  • 打赏
  • 举报
回复
如果a或者b的区分度足够高 那么单独建立a或者b的索引也未尝不可
benluobo 2014-12-12
  • 打赏
  • 举报
回复
建立(a,b) 即可 因为 innodb的辅助索引 包含了 主键值, 所以没必要在辅助索引中包括主键字段

56,940

社区成员

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

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