簡體   English   中英

更好的性能,JOIN 還是多個查詢?

[英]Better performance, JOIN or multiple queries?

從多個表中獲取數據的最佳性能是什么?

我有這些下表

Applicants ( 50,101 rows )
-id
-first_name
-email

Phones ( 50,151 rows )
-id
-number
-model_id
-model_type

Address (100,263 rows)
-id
-state
-model_id
-model_type

Business (26 rows)
-id
-company
-model_id
-model_type

我想要的結果

 id | first_name | email | number | company | state
----+------------+-------+--------+---------+------
  1 |    test    |   -   |   -    |    -    |   -

我使用SQLyog在下面執行這個查詢,而且速度很慢,我在這些表上有成千上萬的數據

SELECT `app`.`id`,`app`.`first_name`, `app`.`email`, `p`.`number`, `b`.`company`, `add`.`state`
FROM `applicants` AS `app`
LEFT JOIN  phones AS `p` ON `app`.`id` = `p`.`model_id` 
    AND `p`.`model_type` = 'App\\Models\\Applicant'
LEFT JOIN `businesses` AS `b` ON `app`.`id` = `b`.`model_id` 
    AND `b`.`model_type` = 'App\\Models\\Applicant'
LEFT JOIN `addresses` AS `add` ON `app`.`id` = `add`.`model_id` 
    AND `b`.`model_type` = 'App\\Models\\Applicant'
LIMIT 10

總結,需要 25.794 才能完成

Execution Time : 25.792 sec
Transfer Time  : 0.001 sec
Total Time     : 25.794 sec

實現我的目標的最佳方式是什么? 比如應該對每個電話、公司和地址執行單獨的多個查詢嗎? 雖然我不確定如何通過多個查詢達到我想要的結果

這真的取決於具體情況,什么會更快。 您也可以通過創建適當的索引來優化您的情況。 例如,如果您通過model_idmodel_type查詢很多,您可以在其中一個或兩個字段上創建索引。

我建議使用前面帶有EXPLAIN連接運行查詢,即EXPLAIN SELECT {your query} 這會給你一些關於 MySQL 如何執行你的查詢的見解。 然后,您可以嘗試使用單獨的查詢進行相同的操作。 然后添加索引,看看它們是否被使用。 然后選擇性能最佳的解決方案。

關於索引:

簡介: https : //www.mysqltutorial.org/mysql-index/mysql-create-index/

更深入: https : //use-the-index-luke.com/

根據我的理解,這個問題沒有統一的答案。 一種可能的解決方案是非規范化。 定期使用您需要的所有數據創建額外的表。 在某些情況下它有很大幫助,但不幸的是,在其他情況下不可能這樣做。

以下是在這種情況下需要考慮的事情。 單個查詢的參數:

  • 數據庫旨在處理復雜的查詢,因此數據庫中的JOIN可能更快。
  • 每個查詢都會產生將查詢移入數據庫並將數據移出數據庫的開銷。

支持多個查詢:

  • 查詢優化器並不完美,因此它們可能會提出錯誤的計划。
  • 將數據作為單個結果集返回通常需要具有許多重復列的數據的“寬”格式。 返回更多數據會更慢。

一般來說,平衡是在單個查詢上,但並不總是如此。 例如,如果數據庫速度很快但應用程序的帶寬很慢,那么最后一項可能始終是主導因素。

我很驚訝您的查詢需要這么多時間。 您沒有ORDER BYGROUP BY因此獲得第一個結果的時間應該非常快。 您可以通過簡單地在app上執行子選擇來讓它運行得更快:

FROM (SELECT app.* 
      FROM `applicants` `app`
      LIMIT 10
     ) app . . . 

聯接表是將每個表中的所有數據合並為一個。 因此,預計加載時間會更慢。 如果您只從每個表中收集特定數據,那么運行單獨的查詢可能是更好的主意。 這取決於您的應用程序的布局方式以及您如何使用這些信息。

暫無
暫無

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

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