有一个名为'books'的表,然后是一个带有主键和值的表:E.G'library'和'genre'。然后,这个主键存储在每本书的“书籍”表中。
检索图书馆A中所有图书的有效方法是什么?
一些方法:
select books where library = (select id where library = 'A')
- mysql缓存子查询?这样做的推荐(和快速)方式是什么?
答案 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)
我会选择:
books
和library
毕竟,在这种情况下,这是最合乎逻辑的事情,考虑到:
如果你想优化一些东西,是的,你可以使用你的最后一点;但不确定实际会有多大变化:
如果我要添加一些缓存,我可能会缓存整个图书搜索的结果。