您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何使JOIN查询使用索引?

如何使JOIN查询使用索引?

如果您有很多类别,则无法提高此查询的效率。单个索引不能一次覆盖两个表MysqL

你所要做的非规范化:添加last_updatedhas_commentsdeletedarticle_categories

CREATE TABLE `article_categories` (
  `article_id` int(11) NOT NULL DEFAULT '0',
  `category_id` int(11) NOT NULL DEFAULT '0',
  `last_updated` timestamp NOT NULL,
  `has_comments` boolean NOT NULL,
  `deleted` boolean NOT NULL,
  PRIMARY KEY (`article_id`,`category_id`),
  KEY `category_id` (`category_id`),
  KEY `ix_articlecategories_category_comments_deleted_updated` (category_id, has_comments, deleted, last_updated)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

并运行以下查询

SELECT  *
FROM    (
        SELECT  article_id
        FROM    article_categories
        WHERE   (category_id, has_comments, deleted) = (78, 1, 0)
        ORDER BY
                last_updated DESC
        LIMIT   100, 20
        ) q
JOIN    articles a
ON      a.id = q.article_id

当然article_categories,每当您更新中的相关列时,您也应该更新article。这可以在触发器中完成。

请注意,该列has_comments是布尔值:这将允许使用相等谓词对索引进行单个范围扫描。

还要注意,LIMIT进入子查询。这将MysqL使用认情况下不使用的后行查找。请参阅我的博客中有关如何提高性能文章

如果您使用的是sql Server,则可以在查询上建立可索引的视图,从本质article_categories上讲,它将使用服务器自动维护的带有附加字段的非规范化索引副本。

不幸的是,MysqL不支持功能,您将必须手动创建这样的表并编写其他代码以使其与基本表保持同步。

其他 2022/1/1 18:42:53 有264人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶