【发布时间】:2011-01-10 16:38:45
【问题描述】:
感谢您的关注。
有两个 INNODB 表:
表作者
id INT
nickname VARCHAR(50)
status ENUM('active', 'blocked')
about TEXT
表书籍
author_id INT
title VARCHAR(150)
我正在对这些表进行查询,以获取每位作者和他拥有的书籍数量:
SELECT a. * , COUNT( b.id ) AS book_count
FROM authors AS a, books AS b
WHERE a.status != 'blocked'
AND b.author_id = a.id
GROUP BY a.id
ORDER BY a.nickname
此查询非常慢(执行大约需要 6 秒)。我在books.author_id 上有一个索引,它运行良好,但我不知道如何在authors 表上创建索引,以便该查询可以使用它。
这是当前 EXPLAIN 的外观:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE a ALL PRIMARY,id_status_nickname NULL NULL NULL 3305 Using where; Using temporary; Using filesort
1 SIMPLE b ref key_author_id key_author_id 5 a.id 2 Using where; Using index
我查看了MySQL manual on optimizing queries with group by,但不知道如何将其应用于我的查询。
我将不胜感激任何帮助和提示 - 索引结构必须是什么,以便 MySQL 可以使用它?
编辑
我试过了:
(id, status, nickname)
(status, nickname)
两者都导致相同的情况。
【问题讨论】:
-
索引的基本经验法则是,您在连接和/或 where 子句中使用的任何字段都应该被索引。对于您的查询,这意味着 a.id、b.author_id 和 a.status 都应该被编入索引。
标签: mysql indexing query-optimization