2010-09-11 82 views
1

我在我的MySQL数据库这两个表:上优化MySQL查询/数据库结构

CREATE TABLE IF NOT EXISTS `articles` (
    `id` bigint(20) NOT NULL, 
    `url` varchar(255) collate utf8_bin NOT NULL, 
    `img` varchar(255) collate utf8_bin NOT NULL, 
    `name` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, 
    `url_key` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, 
    `type_code` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, 
    `likes_count` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `type` (`type`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

CREATE TABLE IF NOT EXISTS `articles_types` (
    `id` int(11) NOT NULL auto_increment, 
    `code` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, 
    `url_key` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, 
    `name` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name` (`code`), 
    KEY `type` (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 

而且我试图运行此查询:

SELECT a.* FROM `articles` a INNER JOIN articles_types at ON at.`code`=a.type ORDER BY p.likes_count DESC LIMIT 1 

它返回1行,在1秒

表中的文章大约包含超过70k行,articles_types仅包含大约70行。

是否有机会优化该表的结构(可能是引擎?),还是优化查询本身以使其更快?

+0

你对这些表的索引创建索引?如果是这样,让我们​​知道哪些列被覆盖。 – 2010-09-11 22:20:26

+0

2Dustin:正如您在上面看到的那样,表格由许多索引组成,现在我已经为articles.like_count添加了一个新索引,因为结果按此列排序。但它没有帮助。 – 2010-09-12 07:36:51

+0

2Damien:感谢considiring有关:-)相信我,如果我能真正回答,哪个能解决我的问题,我会接受这个答案。 – 2010-09-12 07:38:37

回答

4

您应检查您的查询

很可能通过该命令可以让你的EXPLAIN输出,等等articles.likes_count

+0

你是对的。这里的问题是ORDERing - 但即使在articles.likes_count中添加索引之后,它也需要1-2秒。如果没有排序结果(没有ORDER BY),它的速度非常快 - 例如, 0.0004sec。 – 2010-09-12 07:34:52

+0

它帮助使用LEFT JOIN而不是INNER JOIN。也许它可能会发生,那将出现一个未知类别的文章,所以我将不得不在应用程序中检查。 – 2010-09-12 07:54:34