mysql - 投票表的最佳索引是什么?

标签 mysql sql indexing

这是我的查询:

SELECT qa.id,
       qa.subject,
       qa.category cat,
       qa.keywords tags,
       qa.body_html,
       qa.amount,
       qa.visibility,
       qa.date_time,
       COALESCE(u.reputation, 'N') reputation,
       COALESCE(CONCAT(u.user_fname, ' ', u.user_lname), 'unknown') name,
       COALESCE(u.avatar, 'anonymous.png') avatar,

  (SELECT COALESCE(sum(vv.value),0)
   FROM votes vv
   WHERE qa.id = vv.post_id
     AND 15 = vv.table_code) AS total_votes,

  (SELECT COALESCE(sum(vt.total_viewed),0)
   FROM viewed_total vt
   WHERE qa.id = vt.post_id
     AND 15 = vt.table_code
   LIMIT 1) AS total_viewed
FROM qanda qa
LEFT JOIN users u ON qa.author_id = u.id
AND qa.visibility = 1
WHERE qa.type = 0
ORDER BY qa.date_time DESC
LIMIT 0,
      11;

这是EXPLAIN的结果:

enter image description here

看到了吗?最后一行 (vv) 对任何索引都没有好处。这里还有 votes 表的当前索引:

enter image description here

无论如何,你有什么建议?我需要什么指标才能让性能更好?

最佳答案

我认为您需要将 qa.visibility = 1LEFT JOIN..ON 移动到 WHERE。完成此操作后,请获得以下索引:

qanda:  INDEX(visibility, type, date_time)  -- date_time must be last

这将完全处理 WHEREORDER BYLIMIT ——这可能是性能的最大提升。

vv and vt:  INDEX(post_id, table_code) -- in either order

您似乎有(post_id, table_code, user_id)。如果它是唯一的,则将其提升为PRIMARY KEY并删除id;这会带来额外的一点插入。

我假设用户PRIMARY KEY(id)

您不需要在 vt 子查询上使用 LIMIT 1

如果您需要进一步讨论此问题,请为每个表提供SHOW CREATE TABLE

关于mysql - 投票表的最佳索引是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44382393/

相关文章:

mysql - 存储单个变量的多个值 (PDO)

sql - SQL中的orderby/where查询需要什么样的索引?

sql - 索引中列的顺序有多重要?

php - UTF-8贯穿始终

javascript - 尝试 POST 到 mysql 数据库时 PHP 代码卡在浏览器中(以不同的随机间隔)

php - 执行 PDO 查询将绑定(bind)参数从整数更改为字符串

用于从 MySQL 列中的数据中删除 '!' 或 '*' 等字符的 SQL 命令

indexing - 在PANDAS中,如何获取已知值的索引?

mysql - 来自 SQL 查询的错误记录

php - mysql 在 like 和 like 查询错误之间我收到了错误