[英]Better site performance: multiple simple mySQL queries or one complex mySQL query later manipulated in PHP?
[英]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_id
和model_type
查詢很多,您可以在其中一個或兩個字段上創建索引。
我建議使用前面帶有EXPLAIN
連接運行查詢,即EXPLAIN SELECT {your query}
。 這會給你一些關於 MySQL 如何執行你的查詢的見解。 然后,您可以嘗試使用單獨的查詢進行相同的操作。 然后添加索引,看看它們是否被使用。 然后選擇性能最佳的解決方案。
關於索引:
簡介: https : //www.mysqltutorial.org/mysql-index/mysql-create-index/
更深入: https : //use-the-index-luke.com/
根據我的理解,這個問題沒有統一的答案。 一種可能的解決方案是非規范化。 定期使用您需要的所有數據創建額外的表。 在某些情況下它有很大幫助,但不幸的是,在其他情況下不可能這樣做。
以下是在這種情況下需要考慮的事情。 單個查詢的參數:
JOIN
可能更快。支持多個查詢:
一般來說,平衡是在單個查詢上,但並不總是如此。 例如,如果數據庫速度很快但應用程序的帶寬很慢,那么最后一項可能始終是主導因素。
我很驚訝您的查詢需要這么多時間。 您沒有ORDER BY
或GROUP BY
因此獲得第一個結果的時間應該非常快。 您可以通過簡單地在app
上執行子選擇來讓它運行得更快:
FROM (SELECT app.*
FROM `applicants` `app`
LIMIT 10
) app . . .
聯接表是將每個表中的所有數據合並為一個。 因此,預計加載時間會更慢。 如果您只從每個表中收集特定數據,那么運行單獨的查詢可能是更好的主意。 這取決於您的應用程序的布局方式以及您如何使用這些信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.