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