mysql limit 1 10000_小白,请教各位大佬!Mysql面试题,优化:SELECT * FROM user LIMIT 10000,1.十分感谢...

314bc6e4933714c60ba2a81fe033b03d.png

叮当猫咪

如果我去面试,我会这样答。1.select*很有可能返回不需要的列,如果可以指定具体需要哪些列会更好,减少结果集整体大小。2.limit10000,1,分不同情况的优化。对于user表主键id是连续的,可以改写selectid,username,agefromuserwhereid>10000limit1对于user表主键id有断层的,对于select*fromuserlimit10000,1是没有优化空间的。要优化,必须加where条件,例如selectid,username,agefromuserwhereuser_city='广州'limit10000,1,这样就可以改写成selectid,username,agefromuserainnerjoin(selectidfromuserwhereuser_city='广州'limit10000,1)bona.id=b.id,但要配合覆盖索引idx(user_city)才有效果,优化的思想是先从比user表小的覆盖索引上获取到主键id,再回表到主键索引里获取其他列的数据。3.在大多数情况下,主键id很有可能是断层的,而且假设实际需求就是select*fromuserlimit10000,1,加了where条件就不符合需求。那么这种情况下,就只能对表结构和表数据下手了,想办法将行数据大小减少,例如恰当地将varchar换成int,按照三范式减少数据冗余等,目的是使得每一个数据页能装下更多的行数据,即使全表扫描,读取尽可能少的数据页。4.从SELECT*FROMuserLIMIT10000,1来看,就是简单的获取user表第10001条数据,看不到有什么实质的查询意义,而且对于selectid,usernamefromuserlimit10000,1,这样在username列上有索引和无索引会使得返回结果集有可能是不一样的,应该结合业务逻辑来看看有没有优化空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值