类似于图书数据库
有一张表放的是作者的信息
有一张表放的是书的信息
一个作者可以有好几本书,一本书也可以有好几个作者
把作者的ID和书的ID拿出来当外键,做了张rel_book_author的表记录对应关系
现在将数据导入后,最后张表有300W的记录。
每次查询一个作者写了哪几本书,SQL语句用的是这样的SELECT bookId FROM rel_book_author WHERE authorId = 
现在查询速度约为0.05秒,虽然很快了,但是我要在做一个算法要进行大量这样的查询,大约1-2W次查询吧。所以累加起来就很慢了。
不知道应该怎么优化?
是优化MySQL 还是换个更快的数据库?有没有什么好的建议?或者什么地方的设置可以改进

解决方案 »

  1.   

    SELECT bookId FROM rel_book_author WHERE authorId = 这个语句本身没有什么问题,如果优化的话,你需要检查一下表 rel_book_author 上的索引有什么?假设你rel_book_author表结构为
    rel_book_author(authorId,bookid) 如果你有索引(authorId) 或者索引 (authorId,bookid)  的话,则你这条语句应该就已经优化到头了。没什么再优化的余地了。建议检查一下Mysql的系统参数看看能不能优化一下mysql数据本身,比如CACHE,KEY , TABLE CACHE等。否则就建议换数据库了。
    如果你没有这两个索引,只有(bookid,authorId)则可以创建一个(authorId,bookid)的索引。
    
      

  2.   

    我不是很清楚索引是否建立的正确。应该如何查看?

    show index from tableName;mysql> show index from t1;
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
    | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
    | t1    |          0 | PRIMARY  |            1 | id          | A         |  NULL |     NULL | NULL   |      | BTREE      |         |
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
    1 row in set (0.25 sec)mysql>
    换数据库的话应该换怎么样的数据库?
    这个很难讲了。其实感觉上任何一种数据库对这个简单的查询来说都差不多,加大内存,加快CPU,加多CPU。这样可以用oracle
      

  3.   

    +------------------+------------+-------------+--------------+-------------+----
    -------+-------------+----------+--------+------+------------+---------+
    | Table            | Non_unique | Key_name    | Seq_in_index | Column_name | Col
    lation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
    +------------------+------------+-------------+--------------+-------------+----
    -------+-------------+----------+--------+------+------------+---------+
    | rel_book_author |          1 | FK_bookID  |            1 | bookID     | A
           |     3109401 |     NULL | NULL   |      | BTREE      |         |
    | rel_book_author |          1 | FK_authorID |            1 | authorID    | A
           |     1554700 |     NULL | NULL   |      | BTREE      |         |
    +------------------+------------+-------------+--------------+-------------+----
    -------+-------------+----------+--------+------+------------+---------+
    2 rows in set (0.28 sec)看了下,不知道这样建对不对?
      

  4.   

    建议你再创建一个 (authorId,bookid)  索引。
      

  5.   

    CREATE INDEX id_index ON rel_book_author (authorId,bookid);