mysql选择缓存优化

时间:2011-04-24 15:51:25

标签: php mysql database-design

有一个名为'books'的表,然后是一个带有主键和值的表:E.G'library'和'genre'。然后,这个主键存储在每本书的“书籍”表中。

检索图书馆A中所有图书的有效方法是什么?

一些方法:

  • 选择使用内部联接并对库列进行排序 - 对临时表有效吗?能够快速索引数据的聪明方法吗?
  • 将文本值复制到“books”表而不是主键 - 不一致的数据库?
  • 使用子查询select books where library = (select id where library = 'A') - mysql缓存子查询?
  • 发送两个查询,并在php / memcached中缓存库A的主要ID - 凌乱的实现?

这样做的推荐(和快速)方式是什么?

3 个答案:

答案 0 :(得分:2)

在库和书籍之间使用关系模型,并使用连接进行查询。只要您拥有library_id设置的主键和索引,这个速度相当快。

table: libraries
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  | PRI | NULL    |       |
| name  | varchar(100) | NO   |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
+------+------+
| id   | name |
+------+------+
|    1 | Foo  |
|    2 | Bar  |
+------+------+

table: books
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id         | int(11)      | NO   | PRI | 0       |       |
| library_id | int(11)      | NO   | MUL | NULL    |       |
| author     | varchar(100) | NO   |     | NULL    |       |
| name       | varchar(100) | NO   |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+
+----+------------+--------+------+
| id | library_id | author | name |
+----+------------+--------+------+
|  1 |          1 | Jon    | Baz  |
|  2 |          1 | Bill   | Baz  |
|  3 |          2 | Mary   | Abc  |
+----+------------+--------+------+

这样可以非常轻松地进行查询。要查找库中名为“Foo”的所有图书,您可以使用如下查询:

mysql> SELECT books.* FROM books
    -> JOIN libraries ON libraries.id = books.library_id
    ->  AND libraries.name = 'Foo';
+----+------------+--------+------+
| id | library_id | author | name |
+----+------------+--------+------+
|  1 |          1 | Jon    | Baz  |
|  2 |          1 | Bill   | Baz  |
+----+------------+--------+------+

如果您已经知道库ID,则甚至不需要加入:

mysql> SELECT * FROM books
    -> WHERE library_id = 2;
+----+------------+--------+------+
| id | library_id | author | name |
+----+------------+--------+------+
|  3 |          2 | Mary   | Abc  |
+----+------------+--------+------+

答案 1 :(得分:1)

如果要在关系数据库上执行性能,则必须使用外键。索引速度很快,但FK更快,因为它们“知道”另一端的内容。如果您之后仍然遇到性能问题,则必须首先了解数据库引擎如何处理您的请求。如果您有很多书籍,只有少数几个图书馆,请确保引擎首先选择您的图书馆;不是'书籍内部加入图书馆',而是“图书馆内部联合书籍”。 如果不使用来自两个表的数据,则必须使用子查询,因为引擎只会使用子查询中的键进行连接,而不是整个表。 切勿使用(PHP)代码缓存下一个查询的数据库结果。如果事情变得复杂,一次性使用临时表。

答案 2 :(得分:0)

我会选择:

  • 单个SQL查询
  • bookslibrary
  • 之间使用内部联接

毕竟,在这种情况下,这是最合乎逻辑的事情,考虑到:

  • 您正在使用关系数据库系统
  • 您的数据似乎结构合理。


如果你想优化一些东西,是的,你可以使用你的最后一点;但不确定实际会有多大变化:

  • 您将向数据库发送两个查询
  • 使用正确的索引(您可能是,如果使用外键和InnoDB),单个查询应该可以很快地运行。

如果我要添加一些缓存,我可能会缓存整个图书搜索的结果。