java吧 关注:1,247,252贴子:12,724,835

回复:请教一个mysql索引的问题

只看楼主收藏回复

很简单的道理。id是主键,主键有个索引树。那么查询就在索引树里取数据就能直接返回。
你查全字段。索引树里没有全字段,那么只能再去叶子结点拿数据。自然就是全表。
你可以建一个name的索引。然后select name。并且order by name。那么查询自然会走name的索引树。
你现在没指定order,凭什么走联合索引?


IP属地:浙江来自Android客户端20楼2024-03-08 08:08
回复
    主键索引存了数据 普通索引需要回表主键拿数据 在说你这里也没有用到普通索引呀


    IP属地:广东来自iPhone客户端21楼2024-03-08 09:26
    回复
      非叶子节点也存了id,*查询会访问到具体的叶子节点,只查id只需要到非叶子节点就行了,可能mysql优化器判断*查询时走全表更快


      IP属地:湖北来自Android客户端22楼2024-03-08 11:35
      回复
        首先聚集索引是一种概念,指的是叶子节点存储索引和数据,而该概念的默认支撑是由主键实现的,如果你没有主动设置主键,mysql的底层会选择一列唯一且不为空的列作为主键,如果你的表结构没有这样的列,mysql会隐式的设置一列代替。你这个问题还涉及到对mysql执行过程的理解,你既然这么问,说明你不明白或忽视了mysql的执行过程。mysql的执行过程是首先查缓存,其次再执行分析器得到抽象语法数,然后再执行优化器通过一系列运算得到最优的执行计划,最后执行sql执行器完成sql的执行。再来看你的描述,首先“*”是映射的全表全字段,你的limit前又没有order by 所以是全表扫描。而 select id 只有一列,mysql的优化器可以在后面自动例如追加order by id asc达成索引计算。


        IP属地:江苏来自iPhone客户端24楼2024-03-09 03:49
        回复
          你应该是想问为什么判定全表比索引快。


          IP属地:北京来自iPhone客户端25楼2024-03-09 13:32
          回复
            基础不牢固,需要复习


            IP属地:北京来自Android客户端26楼2024-03-13 11:58
            回复
              因为聚簇索引的叶子节点存储的是详细数据,你不需要查询详细数据,所以只需要从索引树获取前几个非叶子节点的数据就好了啊,这有什么不理解的


              IP属地:浙江来自Android客户端27楼2024-03-18 10:41
              回复