ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL查询优化,解释和执行缓慢

2019-11-27 20:24:52  阅读:229  来源: 互联网

标签:explain optimization query-optimization mysql


遇到一些实际问题,尤其是一些查询.以下信息.

tgmp_games,约2万行

CREATE TABLE IF NOT EXISTS `tgmp_games` (
  `g_id` int(8) NOT NULL AUTO_INCREMENT,
  `site_id` int(6) NOT NULL,
  `g_name` varchar(255) NOT NULL,
  `g_link` varchar(255) NOT NULL,
  `g_url` varchar(255) NOT NULL,
  `g_platforms` varchar(128) NOT NULL,
  `g_added` datetime NOT NULL,
  `g_cover` varchar(255) NOT NULL,
  `g_impressions` int(8) NOT NULL,
  PRIMARY KEY (`g_id`),
  KEY `g_platforms` (`g_platforms`),
  KEY `site_id` (`site_id`),
  KEY `g_link` (`g_link`),
  KEY `g_release` (`g_release`),
  KEY `g_genre` (`g_genre`),
  KEY `g_name` (`g_name`),
  KEY `g_impressions` (`g_impressions`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

tgmp_reviews-约20万行

CREATE TABLE IF NOT EXISTS `tgmp_reviews` (
  `r_id` int(8) NOT NULL AUTO_INCREMENT,
  `site_id` int(6) NOT NULL,
  `r_source` varchar(128) NOT NULL,
  `r_date` date NOT NULL,
  `r_score` int(3) NOT NULL,
  `r_copy` text NOT NULL,
  `r_link` text NOT NULL,
  `r_int_link` text NOT NULL,
  `r_parent` int(8) NOT NULL,
  `r_platform` varchar(12) NOT NULL,
  `r_impressions` int(8) NOT NULL,
  PRIMARY KEY (`r_id`),
  KEY `site_id` (`site_id`),
  KEY `r_parent` (`r_parent`),
  KEY `r_platform` (`r_platform`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ;

这是查询,需要3秒钟的时间

SELECT * FROM tgmp_games g
RIGHT JOIN tgmp_reviews r ON g_id = r.r_parent
WHERE g.site_id = '34'
GROUP BY g_name
ORDER BY g_impressions DESC LIMIT 15

说明

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  r   ALL     r_parent    NULL    NULL    NULL    201133  Using temporary; Using filesort
1   SIMPLE  g   eq_ref  PRIMARY,site_id     PRIMARY     4   engine_comp.r.r_parent  1   Using where

我只是尝试获取15个观看次数最多的游戏,然后为每个游戏获取一个评论(这并不重要,我认为评分最高的游戏应该是理想的r_score).

有人可以帮我弄清楚为什么效率如此低下吗?

解决方法:

>我不明白在查询中使用GROUP BY g_name的目的是什么,但这会使MySQL对所选列或两个表中的所有列执行聚合.因此,请尝试排除它并检查是否有帮助.
>另外,RIGHT JOIN使数据库首先查询tgmp_reviews,这不是您想要的.我想在这里LEFT JOIN是一个更好的选择.请尝试更改联接类型.
>如果第一个选项都不起作用,则需要重新设计查询.由于您需要获取该网站的15个观看次数最多的游戏,因此查询为:

SELECT g_id
  FROM tgmp_games g
 WHERE site_id = 34
 ORDER BY g_impressions DESC
 LIMIT 15;

这是数据库应该执行的第一部分,因为它提供了最佳的选择性.然后,您可以获得游戏的所需评价:

SELECT r_parent, max(r_score)
  FROM tgmp_reviews r
 WHERE r_parent IN (/*1st query*/)
 GROUP BY r_parent;

这样的构造将强制数据库首先执行第一个查询(对不起重言式),并为您提供每个想要的游戏的最高分.希望您能够将获得的结果用于您的目的.

标签:explain,optimization,query-optimization,mysql
来源: https://codeday.me/bug/20191127/2077039.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有