java吧 关注:1,247,112贴子:12,724,563

请教一个mysql索引的问题

只看楼主收藏回复

假如我有一个user表,有name和age字段,我为这两个字段创建了联合索引,那么,我select * from user limit 100,10是全表扫描,而select id from user limit 100,10,确用到了索引。这是为啥呢?我看用到的是主键索引,而id又是聚簇索引,他的树叶子结点挂的是row吧,为什么*就是全表扫描呢?有大佬知道吗


IP属地:广东来自Android客户端1楼2024-03-07 10:47回复
    limit 不搭配 order by 来用么。不指定排序规则的话。好像是使用数据库默认的排序。(忘了是啥了)才不走索引把


    IP属地:浙江2楼2024-03-07 11:01
    收起回复
      因为你*返回所有列,而且你索引只覆盖了name和age


      IP属地:江苏来自Android客户端3楼2024-03-07 11:04
      收起回复
        你表里有多少数据


        IP属地:上海来自iPhone客户端4楼2024-03-07 12:38
        收起回复
          mysql会自己估算运行时间,有些情况确实不会走索引


          IP属地:江苏来自iPhone客户端5楼2024-03-07 12:44
          回复
            直接limit 100试试 不要offset


            IP属地:四川来自Android客户端6楼2024-03-07 13:00
            收起回复
              查id直接聚簇索引,这个快.联合索引的数据排序不一定等于正常数据排序,还有就是星号,索引覆盖不了吧


              IP属地:广东来自Android客户端7楼2024-03-07 13:11
              回复
                我回复一下,我的描述有错误,我没创建联合索引,就是select * limit没有走索引,select id就走了索引,id为主键


                IP属地:广东来自Android客户端9楼2024-03-07 13:47
                收起回复
                  这个很好理解啊,如果我是数据库设计人员,查询的列只是索引列,我直接走索引好了。你试试id+name还会不会走索引


                  IP属地:浙江来自iPhone客户端10楼2024-03-07 18:56
                  回复
                    select * 的语句,不加where条件,通常就是全表扫描


                    IP属地:湖南来自iPhone客户端11楼2024-03-07 19:02
                    回复
                      严格意义上聚簇索引也是数据,你最后怎么也要用到索引啊


                      IP属地:新疆来自Android客户端12楼2024-03-07 19:26
                      回复
                        Mysql和oracle不一样,有一套自己的判断规则,迷的很,执行计划一套,实际效率另一套。一张70万数据的表,单表类型分组得一秒左右,oracle配合好点的服务器100多毫秒


                        IP属地:江苏来自iPhone客户端13楼2024-03-07 19:55
                        回复
                          只是索引覆盖而已,因为只取id,扫描的整颗索引树,type是index,比all还是好些的


                          IP属地:上海来自Android客户端15楼2024-03-07 20:39
                          回复
                            这个问题我老早时候在某🐴视频上看过,他也没讲仔细,id是主键,建立了索引,找到对应id返回这一行数据,select* 就等于select name,age 当然是全局扫描


                            IP属地:辽宁来自Android客户端16楼2024-03-07 20:44
                            收起回复
                              我觉得是因为索引上有id这个值,所以直接查索引就能查出来了


                              IP属地:江苏来自Android客户端17楼2024-03-07 21:31
                              回复