Mysql 优化这个SQL!

Mysql 优化这个SQL!,mysql,sql,Mysql,Sql,用户访问源代码段塞(例如,源代码段塞)。系统尝试获取其他用户(使用过源代码的用户)先前访问过的其他不同源代码,按使用频率最高到使用频率最低排序。基本上,该系统试图找到有相似兴趣的用户,并显示他们之前访问过的其他页面 需要优化此查询的帮助: SELECT DISTINCT(SOURCE_SLUG), COUNT(SOURCE_SLUG) CATCOUNT FROM topsources WHERE SOURCE_SLUG <> ? AND USER_ID IN (SE

用户访问源代码段塞(例如,源代码段塞)。系统尝试获取其他用户(使用过源代码的用户)先前访问过的其他不同源代码,按使用频率最高到使用频率最低排序。基本上,该系统试图找到有相似兴趣的用户,并显示他们之前访问过的其他页面

需要优化此查询的帮助:

SELECT DISTINCT(SOURCE_SLUG), COUNT(SOURCE_SLUG) CATCOUNT 
  FROM topsources 
 WHERE SOURCE_SLUG <> ? 
   AND USER_ID IN (SELECT DISTINCT(USER_ID) 
                     FROM topsources WHERE SOURCE_SLUG = ?) 
GROUP BY SOURCE_SLUG ORDER BY CATCOUNT DESC
  • 使用内部联接而不是子选择
  • 在源代码段塞上添加索引

在回答带有问号的问题时,你可能会更幸运,而不是让人觉得你在让我们工作……我不会让任何人工作……作为开发人员,我喜欢挑战……我觉得这也会挑战其他问题解决者。我在这个问题上也有“需要帮助”的问题。目前的查询速度有多慢?有多少行数据?您能否发布:show index from的结果,以便我们可以查看基数?您能为同一个slug发布几行样本数据吗?当前查询需要3-4秒。数据的总行数最多可为1000行,但限制为5行。表上的行总数为220KSOURCE\u SLUG已编制索引。但是第一个需要帮助。感谢您的正确回复spirit@Daniel,我是Java/PHP开发人员…不是sql专家。不太擅长内部连接、区分和排序,请尝试一下。能够加入并不能使您成为SQL专家;-)好吧,你把我逼到这里来了。这是我想到的。您能检查一下是否可以进一步优化它吗<代码>在ts.USER\U ID=tsi.USER\U ID和tsi.SOURCE\U SLUG=?上从topsources ts内部连接topsources tsi选择DISTINCT(ts.SOURCE\U SLUG)、COUNT(ts.SOURCE\U SLUG)CATCOUNT?哪里有ts.SOURCE\u SLUG?和ts.CATEGORY_SLUG=?GROUP BY ts.SOURCE\U SLUG ORDER BY ts.CATCOUNT DESC LIMIT 5即使使用上述查询,我也会得到不同的结果…问题是内在的
`topsources` (
  `USER_ID` varchar(255) NOT NULL,
  `DATE_AND_HOUR` varchar(255) NOT NULL,
  `UPDATED_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `ITEM_ID` int(11) NOT NULL,
  `SOURCE_SLUG` varchar(100) NOT NULL,
  `FEED_PAGE_URL` varchar(255) NOT NULL,
  `CATEGORY_SLUG` varchar(100) NOT NULL,
  `REFERRER` varchar(2048) DEFAULT NULL,
  PRIMARY KEY (`USER_ID`,`DATE_AND_HOUR`(30),`ITEM_ID`),
  KEY `USER_ID` (`USER_ID`),
  KEY `FEED_PAGE_URL` (`FEED_PAGE_URL`),
  KEY `SOURCE_SLUG` (`SOURCE_SLUG`),
  KEY `CATEGORY_SLUG` (`CATEGORY_SLUG`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;