簡體   English   中英

mysql選擇緩存優化

[英]mysql select cache optimization

有一個名為“ books”的表,然后有多個帶有主鍵和值的表:例如EG“ library”和“ genre”。 然后,該主鍵將存儲在每本書籍的“書籍”表中。

什么是檢索庫A中所有書籍的有效方法?

一些方法:

  • 選擇使用內部聯接並在庫列上排序-臨時表效率低下嗎? 聰明的方法來索引數據,以使之快速?
  • 將文本值復制到“ books”表中而不是主鍵中-數據庫不一致?
  • 使用子查詢select books where library = (select id where library = 'A') -mysql緩存子查詢?
  • 發送兩個查詢,並將庫A的主ID緩存在php / memcached中-混亂的實現?

推薦的(快速)方法是什么?

在圖書館和書籍之間使用關系模型,並使用聯接對其進行查詢。 只要您設置了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)代碼為下一個查詢緩存數據庫結果。 如果事情變得復雜起來,請使用臨時表。

我會去:

  • 單個SQL查詢
  • 通過bookslibrary之間的內在聯系

畢竟,在這種情況下,考慮以下幾點是最合乎邏輯的:

  • 您正在使用關系數據庫系統
  • 而且您的數據似乎結構正確。


如果您想稍微優化一些東西,是的,您可以使用最后一點; 但不確定實際上會發生很大變化:

  • 您將向數據庫發送兩個查詢
  • 使用正確的索引(如果使用外鍵和InnoDB您可能會使用正確的索引 ,單個查詢應該運行得很快。

如果要添加一些緩存,則可能會緩存整個圖書搜索的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM