2012-11-12 50 views
1

我有SQL查询的问题,有什么办法如何加快这个查询? 表字包含14 000行查询在本地主机上花费了4.5631秒。内部SQL查询优化

SELECT 
    (SELECT SUM((SELECT COUNT(*) 
        FROM word w 
        WHERE w.lecture_id = l._id AND active = 1)) 
     FROM lecture l 
     WHERE l.book_id = b._id) AS active_word_count, 
    (SELECT SUM((SELECT COUNT(*) 
       FROM word w 
       WHERE w.lecture_id = l._id)) 
     FROM lecture l 
     WHERE book_id = b._id) AS word_count, 
    (SELECT COUNT(*) 
    FROM lecture l 
    WHERE l.book_id = b._id) AS lecture_count, 
    b._id, 
    b.name, 
    b.version 
FROM book b 



CREATE TABLE book (
    _id int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    version tinyint(3) unsigned NOT NULL, 
    lang tinyint(4) NOT NULL DEFAULT '1', 
    PRIMARY KEY (_id) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ; 

CREATE TABLE lecture (
    _id int(11) NOT NULL AUTO_INCREMENT, 
    book_id int(11) NOT NULL, 
    lecture_name varchar(255) NOT NULL, 
    PRIMARY KEY (_id) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=155 ; 

CREATE TABLE word (
    _id int(11) NOT NULL AUTO_INCREMENT, 
    question varchar(255) NOT NULL, 
    answer varchar(255) NOT NULL, 
    active tinyint(1) NOT NULL, 
    lecture_id int(11) NOT NULL, 
    PRIMARY KEY (_id) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

查询返回的数据,女巫都可以在这里:http://pastebin.com/80KNsU7Y

谢谢你的帮助。

+1

如果您向我们解释了什么是查询返回(有我们的,而不是通过看你的查询,它安静坦率地说是有点晦涩看着办吧),这将有助于。 – h2ooooooo

回答

2

我添加了一些JOIN。所以它现在应该更快。 http://sqlfiddle.com/#!2/eec80/15

SELECT 
    (SELECT COUNT(*) 
     FROM word w 
     JOIN lecture l ON l._id = w.lecture_id 
     WHERE l.book_id = b._id 
     AND w.active = 1) AS active_word_count, 
    (SELECT COUNT(*) 
     FROM word w 
     JOIN lecture l ON w.lecture_id = l._id 
     WHERE l.book_id = b._id) AS word_count, 
    (SELECT COUNT(*) 
     FROM lecture l 
     WHERE l.book_id = b._id) AS lecture_count, 
    b._id, 
    b.name, 
    b.version 
FROM book b 
+0

查询时间为0.5781秒,非常感谢! –

4

我已经添加了几个索引,可以加快以这种方式编写的查询。他们也可能会帮助原创。 http://sqlfiddle.com/#!2/bdcf8/1

Select 
    Sum(Case When w.Active = 1 Then 1 Else 0 End) As active_word_count, 
    Count(w._id) As word_count, 
    Count(Distinct l._id) As lecture_count, 
    b._id, 
    b.name, 
    b.version 
From 
    Book b 
    Left Outer Join 
    Lecture l 
    On l.book_id = b._id 
    Left Outer Join 
    Word w 
    On w.lecture_id = l._id 
Group By 
    b._id, 
    b.name, 
    b.version 
+0

我添加它http://sqlfiddle.com/#!2/eec80/3 ^^ – Varon

+0

@Varon谢谢,困惑你的原始海报! – Laurence

+0

没问题。你的代码似乎非常有效。为它+1。我想不出更多的优化! – Varon