有一个名为“book”的表,然后有一个主键的多个表,以及值:例如“库”和“类型”。然后,将这个主键存储在每本书的“图书”表中。
什么是检索A图书馆所有书籍的有效方法?
一些办法:
select books where library = (select id where library = 'A')?mysql缓存子查询?中缓存A库的主id
这样做的方法是什么?
发布于 2011-04-24 16:12:56
我会去:
library与
毕竟,在这种情况下,这是最合乎逻辑的事情,考虑到:
如果你想优化一些东西,是的,你可以用你的最后一点,但不确定这是否真的会改变很多:
您将向database
如果我要添加一些缓存,我可能会缓存整个图书搜索的结果。
发布于 2011-04-24 16:26:41
在库和书籍之间使用关系模型,并使用联接查询它。只要设置了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 |
+----+------------+--------+------+发布于 2011-08-17 20:12:07
如果要在关系数据库上执行性能,必须使用“外键”。索引速度很快,但FK的速度更快,仅仅是因为它们“知道”另一端是什么。如果在此之后仍然存在性能问题,则必须首先了解DB引擎如何处理请求。如果你有很多书,而且只有少数几个图书馆,那么要确保引擎首先选择你的图书馆;不是‘图书内部连接库’,而是‘图书馆内部连接图书’。如果不使用两个表中的数据,则必须使用子查询,因为这样引擎将只使用连接的子查询的键,而不是完整的表。永远不要使用(PHP)-code来缓存下一个查询的数据库结果。如果事情变得复杂,一次完成任务,请使用临时表。
https://stackoverflow.com/questions/5771527
复制相似问题