V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fuxinya
V2EX  ›  数据库

[MySQL] ORDER BY 未能使用索引排序

  •  
  •   fuxinya · 2019-03-16 12:23:25 +08:00 · 2225 次点击
    这是一个创建于 1860 天前的主题,其中的信息可能已经有所发展或是发生改变。

    订单表建立了一个联合索引 index_order_store: [ store_id, create_time]

    查询:

    SELECT * 
    FROM orders
    WHERE store_id = 100001
    ORDER BY orders.create_time DESC 
    LIMIT 0,2
    

    EXPLAIN 显示扫描了店铺的所有订单(扫描了 14 行),并没有使用索引排序。

    SIMPLE	orders	ref	index_order_store	index_order_store	5	const	14	Using where
    

    哪个地方错了

    13 条回复    2019-03-17 09:30:55 +08:00
    ilyh
        1
    ilyh  
       2019-03-16 12:28:04 +08:00
    全表才 14 行数据, mysql 会做优化, 直接全表扫描更快吧
    fuxinya
        2
    fuxinya  
    OP
       2019-03-16 12:30:10 +08:00
    @ilyh #1 我多造点数据试试
    ilyh
        3
    ilyh  
       2019-03-16 12:32:57 +08:00
    type 为 ref 已经走了索引了啊...
    ilyh
        4
    ilyh  
       2019-03-16 12:37:20 +08:00
    估计是 store_id = 100001 就有 14 行吧
    kaid97
        5
    kaid97  
       2019-03-16 12:46:29 +08:00
    ref 就是使用了索引,而且返回值也只有一条
    fuxinya
        6
    fuxinya  
    OP
       2019-03-16 12:52:34 +08:00
    @ilyh #4 刚刚给店铺 100001 造了 100 条数据,又给另一个店铺也造了 200 条,查询结果:扫描了 100 行。现在的问题是虽然 store_id 走了那个联合索引,但是对 create_time 排序没有使用索引,SQL 语句中限制了条数:LIMIT 0,2。 但是却扫描了 100 行。期望是仅扫描 2 行。
    难道是我认知错误了,ORDER BY 永远不会索引?
    fuxinya
        7
    fuxinya  
    OP
       2019-03-16 12:53:50 +08:00
    @kaid97 看下#6 我的回复,问题描述补充了一下
    ilyh
        8
    ilyh  
       2019-03-16 12:56:31 +08:00
    不是 orderby 不走索引, 是 limit 是读到所有匹配行再保留第一行
    polythene
        9
    polythene  
       2019-03-16 13:28:10 +08:00
    用 force index 强制走索引吧
    ToTChowChow
        10
    ToTChowChow  
       2019-03-16 13:29:25 +08:00 via Android
    SELECT store_id, create.time
    FROM orders
    WHERE store_id = 100001
    ORDER BY orders.create_time DESC
    LIMIT 0,2

    改成这样?
    harde
        11
    harde  
       2019-03-16 13:36:57 +08:00
    歪个楼。。。。 在做这样的测试时,建议造个几十万条数据。。。 很多时候还是数据库聪明。
    fuxinya
        12
    fuxinya  
    OP
       2019-03-16 13:40:42 +08:00
    @harde 好的,马上试试。可能还是数据量不够,认为不走索引排序更快
    constructor
        13
    constructor  
       2019-03-17 09:30:55 +08:00
    原来和数据量有关系,我之前也有这样的疑问,一度误以为对索引的理解有偏差
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4233 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:08 · PVG 12:08 · LAX 21:08 · JFK 00:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.