2016-07-01 118 views
0

我有一個大型的MyISAM表,其中有大約200,000,000行數據表示可通過Web UI搜索的事件。用戶界面是「高級搜索」類別的頁面,因此用戶可以爲任何可搜索字段的組合輸入搜索條件。如何針對模塊化搜索優化MySQL索引/查詢?

表結構的簡化版本是這樣的:

events 
event_id, event_code, place_id, person_id, date, type 

people 
person_id, person_name 

和用戶被允許使用所要求的類型,可選的時間範圍進行搜索,和零個或多個event_codes,place_ids,和/或person_names。

爲了優化這種類型的搜索表,我需要一個索引列的每個排列,除了那些不包括類型?還是有一種更有效的方式來索引表。

目前,該表具有覆蓋event_code,place_id,person_id,日期和類型的主索引,因此當您使用所有字段進行搜索時,響應是可以接受的。但是,如果您嘗試使用例如只有日期範圍,查詢基本上不會返回。

+1

爲客戶提供最有用的信息,我們真的需要看到將執行特別包括實際查詢: - WHERE子句 - GROUP BY子句 - HAVING子句 從而影響性能很大。 –

+0

200M活動!!!你非常成功:-D –

回答

0

MySQL使用從第一個字段到最後一個字段的索引,因此如果您沒有使用索引中的較早字段,則不會使用索引(如您在日期中觀察到的那樣)。

我不一定會說你需要每個排列的索引,但至少有一些。既然你已經說過這個類型是必需的,我會用它開始索引,並創建一個相對較小的兩個字段索引的初始集合,其他每個可搜索字段都是第二個字段。

同樣非常重要的是您如何形成實際的搜索條件。如果您正在對索引字段進行操作(如DAYOFWEEK(date)),則不會有任何索引有幫助。