簡體   English   中英

MySQL - 跨越兩個表的最佳實踐

[英]MySQL - Best practice to cross two tables

我有兩張桌子。 每個人都有大約50K記錄。 兩者都有一個共同的領域。 我想要公共字段匹配的兩個表的記錄。 所以我使用以下SQL代碼。 問題是查詢現在已經運行了20分鍾而且什么也沒發生。 對我來說,這花了很多時間似乎很奇怪。 我想知道是否有更好的方法來實現我的目標。 提前感謝您的回復。

我的SQL代碼:

Select * from tableOne T1, tableTwo T2 
Where T1.name = T2.name

順便說一句,我對php解決方案開放(循環或其他任何東西,如果它更好......)

兩件事情:

  1. 您需要確保兩個表中的name列都有索引。 否則,查詢將必須掃描每個表的每一行以查找匹配項。

  2. 理想情況下,索引應包含要在查詢中選擇的“包含列”。 否則查詢將無法完全使用索引,但必須返回到表並為每行手動獲取其他列。 這意味着您應該考慮在查詢中僅選擇所需的列(而不是*),並將這些列作為包含的列添加到索引中。

嘗試這個:

select *
from tableOne t1
inner join tableTwo t2 on t1.name = t2.name

雖然我懷疑這會有所作為,嘗試不會受到傷害。 不建議使用from tableOne t1, tableTwo t2 ,因為你隱式制作了一個笛卡爾積!

我相信最好使用Join

像這樣的東西:

SELECT *
FROM tableOne
INNER JOIN TableTwo
ON tableOne.name=TableTwo.name

應該是一個內部聯接,以從兩個表中獲取名稱連接的行。

SELECT t1.*, t2.* FROM table1 t1 INNER JOIN table2 t2 ON t1.name = t2.name

MySQL內部聯接 - 你在那里發生的事情 - 非常有效。 50K的記錄根本不是很多,即使是一對有幾百萬個條目的表,也只有20分鍾。 嘗試重新啟動查詢,或只是重新啟動整個Web服務器。 查詢本身如果正常(盡管最好指定您想要的每個表中的哪些列,即使您希望除了一列之外的每一列)。 如果沒有索引,添加索引也是一個好主意。

你桌子的存儲引擎是什么? 如果它是InnoDB,您需要在這兩個表之間設置一個外鍵 - 這肯定會解決您的性能問題。

暫無
暫無

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

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