我有SQL查询的问题,有什么方法可以加快这个查询的速度? 表字包含14 000行,查询在localhost上占用4.5631秒。
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
感谢您的帮助。
答案 0 :(得分: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
答案 1 :(得分: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