Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 什么';投票表的最佳索引是什么?_Mysql_Sql_Indexing - Fatal编程技术网

Mysql 什么';投票表的最佳索引是什么?

Mysql 什么';投票表的最佳索引是什么?,mysql,sql,indexing,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_fn

我的问题是:

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;
下面是解释的结果:

看到了吗?最后一行(
vv
)对任何索引都没有好处。以下是
投票
表中的当前索引:


不管怎样,你有什么建议?我需要什么索引才能使性能更好?

我认为您需要将
qa.visibility=1
左连接..ON
移动到
何处
。完成此操作后,请创建以下索引:

qanda:  INDEX(visibility, type, date_time)  -- date_time must be last
这将完全处理
WHERE
ORDER BY
LIMIT
——这可能是性能的最大提升

vv and vt:  INDEX(post_id, table_code) -- in either order
您似乎有
(post\u id、table\u code、user\u id)
。如果是唯一的,则将其提升为
主键
,并删除
id
;这将提供额外的一点推动

我假设
用户
主键(id)

vt
子查询上不需要
LIMIT 1


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

表投票是否包含大量数据或大量共币?为什么不在post\u id列上添加投票PK?然后,您有唯一的数据和post\u id上的索引,您可以在post\u id和table\u代码上添加索引,因为您在where条件中选择ti作为旁白,限制1似乎是多余的。请查看您的段落:“您似乎有..”。。!是的,就是说我可以删除
id
列?老实说,没有
id
列的表很奇怪
:-)
,不是吗?没有主键的表很奇怪。通常,“自然PK”在各种方面都比人工的
id
好。InnoDB在通过辅助索引进行查找时,获取PK(
id
,位于辅助BTree的叶节点),然后通过PK进行第二次查找。通过将索引移动到PK中(如果它是唯一的),可以让查找只进行一步,而不是两步。