mysql - 内部 SQL 查询优化

标签 mysql sql query-optimization

我的 SQL 查询有问题,有什么办法可以加快这个查询的速度吗? 表字包含 14000 行查询在本地主机上花费了 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

谢谢你的帮助。

最佳答案

我已经添加了几个索引,它们将加速以这种方式编写的查询。他们也可能会帮助处理原件。 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

关于mysql - 内部 SQL 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13343698/

相关文章:

PHP脚本无法连接到sql数据库

sql - PostgreSQL: VACUUM FULL 持续时间估计

php - 使用增量值更新表

php - 使用 20.000 条记录更新 MySql 数据库时出现问题

mysql - 使用 SQL 查询了解哪些表具有列 "a"和 "b"

mysql - 在 MySQL 中查找最近的评论日期 - 速度问题

mysql - 为什么 MySQL Workbench 中的 'fetch'(如持续时间/获取)对于非常有限的数据量需要很长时间?

mysql - 大型 MySQL 数据库表的最佳方法

mysql - 如何设置独立的 SQL Server

sql - 优化 SQL 查询查找表中不存在的条目