首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql选择缓存优化

mysql选择缓存优化
EN

Stack Overflow用户
提问于 2011-04-24 15:51:24
回答 3查看 331关注 0票数 1

有一个名为“book”的表,然后有一个主键的多个表,以及值:例如“库”和“类型”。然后,将这个主键存储在每本书的“图书”表中。

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

一些办法:

  • 使用内部联接进行选择,并对库列进行排序--是否使用临时表?将文本值复制到“book”表而不是主键不一致的database?
  • Using a子查询select books where library = (select id where library = 'A')?mysql缓存子查询?
  • 发送两个查询,并在php/memcached -杂乱的implementation?

中缓存A库的主id

这样做的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-24 16:12:56

我会去:

library

  • 之间具有内部连接的单一SQL查询

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

  • 您正在使用的是关系数据库系统
  • ,您的数据看起来结构合理。

如果你想优化一些东西,是的,你可以用你的最后一点,但不确定这是否真的会改变很多:

您将向database

  • Using发送两个查询--正确的索引(如果使用外键和InnoDB,可能是正确的索引),一个查询应该运行得非常快。

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

票数 0
EN

Stack Overflow用户

发布于 2011-04-24 16:26:41

在库和书籍之间使用关系模型,并使用联接查询它。只要设置了library_id的主键和索引,这是相当快的。

代码语言:javascript
复制
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”的所有图书,请使用如下查询:

代码语言:javascript
复制
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,甚至不需要连接:

代码语言:javascript
复制
mysql> SELECT * FROM books
    -> WHERE library_id = 2;
+----+------------+--------+------+
| id | library_id | author | name |
+----+------------+--------+------+
|  3 |          2 | Mary   | Abc  |
+----+------------+--------+------+
票数 2
EN

Stack Overflow用户

发布于 2011-08-17 20:12:07

如果要在关系数据库上执行性能,必须使用“外键”。索引速度很快,但FK的速度更快,仅仅是因为它们“知道”另一端是什么。如果在此之后仍然存在性能问题,则必须首先了解DB引擎如何处理请求。如果你有很多书,而且只有少数几个图书馆,那么要确保引擎首先选择你的图书馆;不是‘图书内部连接库’,而是‘图书馆内部连接图书’。如果不使用两个表中的数据,则必须使用子查询,因为这样引擎将只使用连接的子查询的键,而不是完整的表。永远不要使用(PHP)-code来缓存下一个查询的数据库结果。如果事情变得复杂,一次完成任务,请使用临时表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5771527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档