MySQL 8速度慢,复合索引递减

MySQL 8速度慢,复合索引递减,mysql,indexing,composite-index,Mysql,Indexing,Composite Index,我有以下疑问: SELECT shows.id, shows.title, shows.thumbnail, shows.views, shows.likes, shows.dislikes, shows.duration, shows.hd, shows.origin, UNIX_TIMESTAMP(shows.upload_date) as upload

我有以下疑问:

SELECT 
      shows.id, 
      shows.title, 
      shows.thumbnail, 
      shows.views, 
      shows.likes, 
      shows.dislikes, 
      shows.duration, 
      shows.hd, 
      shows.origin, 
      UNIX_TIMESTAMP(shows.upload_date) as upload_date 
   FROM 
      shows 
   WHERE 
          (shows.views, shows.id) < (0, 272990) 
      and shows.visible = 1 
   ORDER BY 
      shows.views DESC, 
      shows.id DESC 
   LIMIT 
      32
还有像这样的:

CREATE INDEX views_desc_id_desc_visible ON shows (views desc, id desc, visible)
CREATE INDEX views_desc_id_desc ON shows (views desc, id desc)
和许多其他排列。我已经删除了它们,并多次从头开始重新编辑。Visible本身有一个索引

当我执行expain时,我看到它只执行“使用where”,而使用名为views\u desc\u id\u desc\u visible的键。从查询中删除visible不会改变其性能。删除两个desc(so:orderbyviews,id)会使其保持0.0008秒

为什么进展不快

更新(从评论中复制)

选择shows.id、shows.title、shows.缩略图、shows.views、shows.likes、,
shows.dislikes,shows.duration,shows.hd,shows.origin,
UNIX时间戳(显示.upload\u日期)作为上载日期
从节目
其中(shows.views=272990)
和可见=1
按shows.views DESC、shows.id DESC排序
限制32

修复它。我只是不知道为什么使用另一种方式会忽略索引。

visible
必须放在索引的第一位

INDEX(visible, views DESC, id DESC)
建立最佳指数的一般规则是:

  • 包括
    中使用
    =常量测试的所有列,其中
  • 然后是其他栏目
  • 更多详情:

    一起使用的“行构造函数”可能存在问题,其中(shows.views,shows.id)<(0272990)
    。这在5.7之前根本没有得到优化

    解决方法(5.7之前)是优化您在评论中提到的复杂表达式。它可能仍在优化中:

    WHERE      (shows.views <= 0)
      and  not (shows.views  = 0 and shows.id >= 272990)
    
    在这种情况下,可以向后遍历索引以处理

    WHERE visible = 0
      AND ...
    ORDER BY views DESC, id DESC
    

    这是假设行构造函数问题得到解决。

    似乎与此相关:(shows.views,shows.id)<(0272990)选择shows.id,shows.title,shows.缩略图,shows.views,shows.likes,shows.dislikes,shows.duration,shows.hd,shows.origin,UNIX_时间戳(shows.upload_date)作为上传日期,从shows WHERE(shows.views=272990)和visible=1 ORDER BY shows.views DESC,shows.id DESC LIMIT 32修复了它。我只是不知道为什么使用其他方式会忽略索引。
    views
    可以是负数吗?
    INDEX(visible, views, id)
    
    WHERE visible = 0
      AND ...
    ORDER BY views DESC, id DESC