MySQL嵌套SELECT查询花费的时间太长

时间:2019-05-29 12:06:04

标签: mysql

我编写了一个MySQL查询,该查询显示了我想要的数据,但是至少需要30秒-1分钟才能运行。

我研究了如何使用我需要的SELECT创建嵌套的COUNT查询,以显示所需的数据。 SQL也是我所拥有的网页的一部分,当我从一页转到另一页时,它需要花费相同的时间来加载。我敢肯定,有一种更高效的查询写方法,它可以快速加载,因为 ttb_shows表中只有大约1500条记录,而 ttb_books表中只有大约11000条记录。下面是查询。

-- DDL
CREATE TABLE `ttb_books` (
  `book_id` int(11) NOT NULL,
  `book_name` varchar(255) NOT NULL DEFAULT '',
  `cover_image` varchar(255) DEFAULT NULL,
  `show_id` int(11) NOT NULL DEFAULT '0',
  `state_id` int(7) NOT NULL DEFAULT '0',
  `notes` text,
  `year` varchar(255) DEFAULT NULL,
  `publisher` varchar(255) DEFAULT NULL,
  `status_id` int(7) NOT NULL DEFAULT '0',
  `no_pages` varchar(255) DEFAULT NULL,
  `footer` text,
  `opt1` varchar(255) NOT NULL DEFAULT '$5-10',
  `opt2` varchar(255) DEFAULT NULL,
  `opt3` varchar(255) DEFAULT NULL,
  `opt4` varchar(255) DEFAULT NULL,
  `opt5` varchar(255) DEFAULT NULL,
  `owned` int(1) DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


CREATE TABLE `ttb_shows` (
  `show_id` int(11) NOT NULL,
  `show_name` varchar(255) NOT NULL DEFAULT '',
  `date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- QUERY
SELECT ttb_shows.show_id, ttb_shows.show_name, ttb_shows.date_added,
    COUNT(ttb_books.book_id) AS books,
    (SELECT COUNT(ttb_books.owned) AS owned FROM ttb_books WHERE (owned=1 AND ttb_books.show_id = ttb_shows.show_id)) 
FROM ttb_shows LEFT JOIN ttb_books ON ttb_shows.show_id = ttb_books.show_id 
GROUP BY ttb_shows.show_id, ttb_shows.show_name, ttb_shows.date_added

感谢所有能够提供帮助的人。真的很感激!

2 个答案:

答案 0 :(得分:0)

您可以根据情况避免使用总和的子查询

SELECT ttb_shows.show_id
  , ttb_shows.show_name
  , ttb_shows.date_added
  , COUNT(ttb_books.book_id) AS books
  , sum( case when  ttb_books.owned = 1 then 1 else  0 end) AS owned 

FROM ttb_shows 
LEFT JOIN ttb_books ON ttb_shows.show_id = ttb_books.show_id 
GROUP BY ttb_shows.show_id, ttb_shows.show_name, ttb_shows.date_added

答案 1 :(得分:0)

您的查询只能由您优化。似乎这么多的左外部显然会减慢输出速度。如果您可以避免那么多的外部因素,也可以做少量的案例来提取数据,然后获取最终输出。