【问题标题】:Optimize sql query to use indexes or rewrite sql优化sql查询使用索引或重写sql
【发布时间】:2017-11-08 07:24:16
【问题描述】:

我有sql查询

SELECT 
  bd2.*, 
  bdmax.last_video, 
  bdmax.number_videos 
FROM 
  video bd2 
  JOIN 
    ( SELECT 
      bd.video_cat_id, 
      MAX(bd.last_poster_time) AS last_video, 
      COUNT(bd.video_id) as number_videos 
    FROM 
      video bd 
    GROUP BY 
      bd.video_cat_id 
    ) AS bdmax 
    ON bd2.video_cat_id = bdmax.video_cat_id 
      AND bd2.last_poster_time = bdmax.last_video;

表格键是

  PRIMARY KEY (`video_id`),
  KEY `video_cat_id` (`video_cat_id`),
  KEY `video_user_id` (`video_user_id`),
  KEY `video_time` (`video_time`),
  KEY `video_urn` (`video_urn`),
  KEY `last_poster_time` (`last_poster_time`),
  KEY `video_username` (`video_username`),
  KEY `video_approval` (`video_approval`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=45619 ;

如何优化此查询以使用索引?

【问题讨论】:

  • 它已经在使用你的索引了?您查询整个表,因此扫描不会出现问题。
  • 感谢您的回复!你能重写这个sql查询吗?
  • 这样就好了。因为您要查询整个表,所以必须读取整个表。查询规划器给你一个很好的计划
  • 可能需要创建新索引?
  • 为什么您认为您的查询需要更改?我看不出有什么问题

标签: mysql sql optimization innodb


【解决方案1】:

不要将表名放在列名的开头,从而造成混乱。然后这个'复合'索引

INDEX(cat_id, last_poster_time, id)

将有助于子查询(通过“覆盖”)和JOIN

这个查询的一部分是“groupwise max”。但是COUNT 意味着对最大值的优化没有用。

【讨论】:

  • 感谢您的回答!现在表有键 PRIMARY KEY (video_id), KEY video_cat_id (video_cat_id), KEY video_user_id (video_user_id), KEY video_time (video_time), KEY video_urn4@ (@98765433 ), KEY last_poster_time (last_poster_time), KEY video_username (video_username), KEY video_approval (video_approval), KEY video_cat_id_2 (video_cat_id,last_poster_time,'s@9876好? image.ibb.co/fDo4Aw/query.jpg
  • 好。但是现在您可以将 KEY video_cat_id (video_cat_id) 删除为多余的(与新索引的最左侧列相同)。它跑得更快吗?这才是真正的决定点。
  • 我可以删除那个索引,然后只创建那个你 adwise 的,行吗?
  • 看起来你已经添加了更好的索引。这将删除不必要的:ALTER TABLE video DROP INDEX video_cat_id;
  • 现在表有键 PRIMARY KEY (video_id), KEY video_user_id (video_user_id), KEY video_time (video_time), KEY video_urn (video_urn), KEY last_poster_time (last_poster_time), KEY video_username (video_username), KEY video_approval (video_approval), KEY video_cat_id (video_cat_id,last_poster_time,last_poster_time,video_approval263video_cat_id)非常感谢大家!!!!
猜你喜欢
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 2017-05-19
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多