0

有人帮我想出了这个查询,但它仍然太慢;订单正在减慢它的速度,我不认为它使用我的索引我希望有人可以为我修复它:D 是的,我阅读了手册页,但我无法理解。

询问:

 EXPLAIN SELECT u.id, u.url, u.title, u.numsaves
 FROM urls u
 JOIN tags t ON t.url_id = u.id
 AND t.tag = 'osx'
 ORDER BY u.numsaves DESC
 LIMIT 20 

 Showing rows 20 - 19 ( 20 total, Query took 1.5395 sec) [numsaves: 6130 - 2107]


 id     select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
 1  SIMPLE  t   ref     tag_id  tag_id  767     const   49432   Using where; Using index; Using temporary; Using filesort
 1  SIMPLE  u   eq_ref  PRIMARY,id_numsaves_IX  PRIMARY     4   jcooper_whatrethebest_urls.t.url_id     1   

数据库:

 CREATE TABLE `urls` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `url` text NOT NULL,
 `domain` text,
 `title` text NOT NULL,
 `description` text,
 `numsaves` int(11) NOT NULL,
 `firstsaved` varchar(256) DEFAULT NULL,
 `md5` varchar(255) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`),
 UNIQUE KEY `md5` (`md5`),
 KEY `id_numsaves_IX` (`id`,`numsaves`)
 ) ENGINE=InnoDB AUTO_INCREMENT=2958560 DEFAULT CHARSET=utf8

 CREATE TABLE `tags` (
 `url_id` int(11) DEFAULT NULL,
 `hash` varchar(255) NOT NULL,
 `tag` varchar(255) NOT NULL,
 UNIQUE KEY `tag_id` (`tag`,`url_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
4

1 回答 1

1

我认为您查询的主要问题是您选择的索引。

1)tags有一个化合物UNIQUE KEYon tagandurl_id但没有PRIMARY KEY

如果不出意外,您应该将其设为主要 - 这可能对性能有所帮助。VARCHAR(255)此外,如果您的标签确实需要,您可能需要仔细查看。它使索引相当大。

2)添加一个单独的索引,numsaves因为您是按此排序的。复合索引在这里idnumsaves没有帮助。

3)EXPLAIN表示您在tags该匹配中有 49432 行"osx"。这是相当多余的。您可能希望将标签表分成两份,一份包含文本,另一份包含 N:M 链接到urls.

于 2013-04-19T23:29:10.600 回答