0
我有以下三個表:MySQL的外鍵和索引優化
users
(約1000線)
user_id | username | email | ....
events
(約50萬行,並在5〜50天增加)
event_id | e_date | e_location | e_duration | ...
和表格可將用戶鏈接到事件:
users_events
:
user_id | event_id
我建立在表users_events
外鍵來刪除線或者當事件或用戶將被刪除,因此,我在每個表中的每個user_id
和event_id
索引(PRIMARY)。
我對這個設計有第二次猜測,因爲它有一個索引events.event_id
,因爲它是一個唯一的ID,基數等於行數。
events.date
將有一年365的最大基數,並且events.location
將被限制在200左右,所以那些感覺比event_id
更適合索引。
有什麼建議嗎?最常用的查詢
例子:
查找事件用戶要:
SELECT e.date, e.location FROM events e
JOIN users_events ue ON ue.event_id = e.event_id
JOIN users u ON u.user_id = ue.user_id
WHERE user_id = 'currentuserid'
OR
發現,如果一個事件是根據它的特性已經存在:
SELECT event_id FROM events
WHERE date='eventdate'
AND location='eventlocation'
AND duration='eventduration'
沒有理由你不能擁有多個索引,MySQL只會選擇它認爲最適合該查詢的那個索引。額外的索引確實意味着INSERT時間略有增加,但對於大多數應用來說,與SELECT中的節省相比將是最小的。對於一個聯接,一個獨特的索引是非常好的,因爲它可以得到。你的第一個查詢將基於user_id從用戶中選擇一行(希望你有一個索引),使用users_events.user_id上的索引將它加入到users_events中,然後根據events.events_id上的索引將它加入到事件中(希望一個主鍵)。 – Kickstart
'SHOW CREATE TABLE'。看看你的很多:很多表看起來像[this](http://mysql.rjweb.org/doc)。PHP/index_cookbook_mysql#many_to_many_mapping_table)。 –