2016-03-08 61 views
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_idevent_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' 
+0

沒有理由你不能擁有多個索引,MySQL只會選擇它認爲最適合該查詢的那個索引。額外的索引確實意味着INSERT時間略有增加,但對於大多數應用來說,與SELECT中的節省相比將是最小的。對於一個聯接,一個獨特的索引是非常好的,因爲它可以得到。你的第一個查詢將基於user_id從用戶中選擇一行(希望你有一個索引),使用users_events.user_id上的索引將它加入到users_events中,然後根據events.events_id上的索引將它加入到事件中(希望一個主鍵)。 – Kickstart

+0

'SHOW CREATE TABLE'。看看你的很多:很多表看起來像[this](http://mysql.rjweb.org/doc)。PHP/index_cookbook_mysql#many_to_many_mapping_table)。 –

回答

0

如果已將這些列定義爲主鍵,則您已在users.user_idevents.event_id上有索引。

users_events表有兩個索引(可以由您自己創建,也可以由外鍵約束自動創建)。

第一個查詢只需要從上面提到的索引中獲得,並且不會從任何其他獲益。

第二個查詢將受益於events表上的附加索引。