[英]mysql select cache optimization
有一个名为“ books”的表,然后有多个带有主键和值的表:例如EG“ library”和“ genre”。 然后,该主键将存储在每本书籍的“书籍”表中。
什么是检索库A中所有书籍的有效方法?
一些方法:
select books where library = (select id where library = 'A')
-mysql缓存子查询? 推荐的(快速)方法是什么?
在图书馆和书籍之间使用关系模型,并使用联接对其进行查询。 只要您设置了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 |
+----+------------+--------+------+
如果要提高关系数据库的性能,则必须使用外键。 索引速度很快,但是FK速度更快,这仅仅是因为它们“知道”另一端的内容。 如果之后仍然遇到性能问题,则必须首先了解数据库引擎如何处理您的请求。 如果您有很多书并且只有几个图书馆,请确保引擎首先选择您的图书馆;否则,请执行以下步骤。 不是“书籍内部连接库”,而是“图书馆内部连接书”。 如果您不使用两个表中的数据,则必须使用子查询,因为这样引擎将仅使用子查询中的键进行连接,而不使用完整表。 永远不要使用(PHP)代码为下一个查询缓存数据库结果。 如果事情变得复杂起来,请使用临时表。
我会去:
books
和library
之间的内在联系 毕竟,在这种情况下,考虑以下几点是最合乎逻辑的:
如果您想稍微优化一些东西,是的,您可以使用最后一点; 但不确定实际上会发生很大变化:
如果要添加一些缓存,则可能会缓存整个图书搜索的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.