2011-04-24 76 views
1

有一張名爲'books'的表,然後有多個表,主鍵和值:E.G'library'和'genre'。然後,這個主鍵存儲在每本書的「書籍」表中。mysql select高速緩存優化

什麼是檢索圖書館A中所有圖書的有效方法?

一些方法:

  • 選擇使用內部聯接和排序庫列 - 使用臨時表innefficient?聰明的方式來索引數據,使這個快速?
  • 將文本值複製到'books'表中而不是主鍵 - 不一致的數據庫?
  • 使用子查詢select books where library = (select id where library = 'A') - mysql緩存子查詢?
  • 發送兩個查詢,並在PHP/memcached中緩存庫A的主ID - 凌亂的實現?

這樣做的建議(快速)方法是什麼?

回答

0

我會去:

  • 單個SQL查詢
  • 隨着內加入bookslibrary

畢竟之間,這是做的最順理成章的事情,在這種情況,考慮:

  • 您正在使用關係數據基本系統
  • 而且您的數據似乎結構合理。


如果你想優化的東西一點點,是的,你可以用你的最後一點;但不知道會多少實際改變:(如果使用外鍵和InnoDB你可能是)

  • 你會發送兩個數據庫查詢
  • 使用正確的索引,一個單一的查詢應該工作蠻快。

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

+0

用外鍵,這是否意味着mysql不必建立一個臨時表,然後對結果集進行排序? E.G與整個書的結果集的加入值把一個臨時表開始實際排序前? – 2011-04-24 16:38:00

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 | 
+----+------------+--------+------+ 

這樣就可以很方便的查詢。爲了找到符合的「富」的名稱庫中的所有書籍,你會使用這樣的查詢:

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

如果你願意,你必須使用外鍵關係數據庫的性能。索引是速度快,但FK的速度更快,只是因爲他們「知道」上,另一端是什麼。如果在此之後仍然存在性能問題,則必須首先了解數據庫引擎如何處理您的請求。如果你有很多書,只有少數圖書館確保引擎首先選擇你的圖書館;不是'書籍內部連接圖書館',而是'圖書館內部連接書籍'。 如果不從兩個表必須去子查詢使用數據,「造成這樣發動機就只能使用子查詢的連接鍵,而不是完整的表格。 切勿使用(PHP)碼緩存數據庫結果下一個查詢。如果事情變得複雜一步完成,請使用臨時表。