请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

查询sql没有过滤条件,也就是说要找出表中所有记录。这种情况下不走索引不是应该比走索引要快一些吗?毕竟走索引还多了N步对B+树的I/O操作呀

正在回答 回答被采纳积分+3

2回答

提问者 慕虎7161837 2019-09-03 16:38:55

https://img1.sycdn.imooc.com//szimg/5d6e262409274e7409400204.jpg

https://img1.sycdn.imooc.com/szimg/5d6e26240980ff6208810192.jpg

这两种查询不都是全查询吗?为什么一个走索引,一个不走索引呢?其中id是主键,abz没有约束和索引。Innodb引擎


0 回复 有任何疑惑可以回复我~
  • 翔仔 #1
    同学好,是否走索引主要由mysql执行机决定,它会分析,这里的话因为你第一个直接查的是主键,直接从索引载入(内存)比全表扫描(磁盘)要快,因此走的索引,而第二个因为要从索引定位到叶子节点的全部信息获取对应的非索引字段,因此不走索引
    回复 有任何疑惑可以回复我~ 2019-09-03 23:11:19
  • YogurtJ 回复 翔仔 #2
    老师您好,请问这句“直接从索引载入(内存)”是否有些问题?MySQL的索引即B+树不是应该只有根节点是常驻内存中的嘛?要想查询主键,不是也在一层层的访问 非根节点的时候 会有磁盘的IO操作嘛?(记得老师之前讲过要让树矮一点,从而可以减少对磁盘中数据块的IO操作)
    回复 有任何疑惑可以回复我~ 2020-02-16 20:45:02
  • 翔仔 回复 YogurtJ #3
    同学好,这里主要是想通俗地去做解释,毕竟索引涉及到了内存,而且即使之前不在内存,找数据的时候也会读入到内存里,通过索引快速进行定位
    回复 有任何疑惑可以回复我~ 2020-02-17 00:56:50
翔仔 2019-08-25 16:03:39

同学好,如果都是全表扫描,理论上不走索引比索引确实要快一些,同学可以尝试一下,全表扫描基本是不走索引的提交

0 回复 有任何疑惑可以回复我~
  • 为什么说全表扫描是都是从磁盘读取?相比主键索引速度上哪个快,分别是怎么载入内存的呢
    回复 有任何疑惑可以回复我~ 2020-03-09 20:07:50
  • 翔仔 回复 慕娘7010603 #2
    由于索引扫描后要利用索引中的指针去逐一访问记录,假设每个记录都使用索引访问,则读取磁盘的次数是查询包含的记录数T,而如果表扫描则读取磁盘的次数是存储记录的块数B,如果T>B 的话索引就没有优势了。全表扫描虽然走得磁盘读取,但是是顺序读取,不像索引是随机读取
    回复 有任何疑惑可以回复我~ 2020-03-10 15:44:49

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信