[英]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.