Mysql 分组查询优化

Mysql 分组查询优化,mysql,optimization,Mysql,Optimization,亲爱的, 我需要你的帮助来优化下面的查询。我有两个表,一个用于存储图书数据,另一个用于将图书映射到与其相关的标记。我想数一数某个出版商在每个类别中出版了多少本书。此查询可以完成任务,但我需要对其进行优化: select count(book.id),publisher from book,tag where book.id=tag.book_id AND publisher ='Addison-Wesley Professional' AND tag.name='PHP' group by

亲爱的,
我需要你的帮助来优化下面的查询。我有两个表,一个用于存储图书数据,另一个用于将图书映射到与其相关的标记。我想数一数某个出版商在每个类别中出版了多少本书。此查询可以完成任务,但我需要对其进行优化:

select count(book.id),publisher from book,tag where book.id=tag.book_id  AND publisher ='Addison-Wesley Professional' AND tag.name='PHP' group by category
explain
的结果是

    id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  tag     ref     PRIMARY     PRIMARY     92  const   1   Using where; Using index; Using temporary; Using f...
1   SIMPLE  book    eq_ref  PRIMARY     PRIMARY     4   test.tag.book_id    1   Using where
各表如下:

-- 
-- Table structure for table `book`
-- 

CREATE TABLE `book` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(30) NOT NULL,
  `ISBN` varchar(10) NOT NULL,
  `category` varchar(30) NOT NULL,
  `publisher` varchar(30) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

-- 
-- Dumping data for table `book`
-- 

INSERT INTO `book` VALUES (1, 'PHP and MySQL Web Development', '9780672329', 'Web Development', 'Addison-Wesley Professional');
INSERT INTO `book` VALUES (2, 'JavaScript Patterns', '0596806752', 'Web Development', 'O''Reilly Media');



-- 
-- Table structure for table `tag`
-- 

CREATE TABLE `tag` (
  `name` varchar(30) NOT NULL,
  `book_id` int(11) NOT NULL,
  PRIMARY KEY  (`name`,`book_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- 
-- Dumping data for table `tag`
-- 

INSERT INTO `tag` VALUES ('MySQL', 1);
INSERT INTO `tag` VALUES ('PHP', 1);

您需要在图书表中的(publisher,category)上按确切顺序创建一个复合索引,这样子查询对category进行分组可以将结果快速限制为具有确切publisher的结果,然后使用索引的第二部分对category进行分组

ALTER TABLE book ADD INDEX publ_cat( publisher, category );

+1但请注意,这并不一定有帮助。如果标记比发布者更具选择性,则计划员应选择标记。