2011-06-09 50 views
3

我正在部署一個Rails應用程序,它將來自各種第三方提供商的優惠券數據彙總到可搜索的數據庫中。搜索是針對每個優惠券的四個字段進行的:標題,優惠券代碼,說明和到期日期。多列數據庫索引和查詢速度

由於其中一些第三方提供商在保留其數據排序方面做得相當差,並且因爲我不希望重複的優惠券進入我的數據庫,所以我在這四列中實現了唯一的複合索引。這可以防止同一張優惠券不止一次插入到我的數據庫中。

鑑於我在搜索這些列(通過簡單的WHERE column LIKE %whatever%暫時匹配),我希望這些列各自受益於索引它們的速度增益。

因此,這裏是我的問題:將整個複合索引所有列提供相同的搜索速度上漲,就好像我已經申請個人指標每個列?或者它只會保證行之間的唯一性?

稍微複雜一點是我在Rails中開發,所以我的問題與SQLite3和MySQL(以及我們將來要移植到的任何東西)有關,而不是一個特定的RDBMS。

我的猜測是索引加速跨個別列搜索,但我真的沒有足夠的「數據庫底層」的專業知識來對該判斷充滿信心。

感謝您借用您的專業知識。

+1

'WHERE LIKE%任何%'可以** **從來沒有使用一個索引列; 'WHERE列LIKE無論%'可以通過。 – Johan 2011-06-09 15:40:48

+0

@Johan:哎唷!我沒有想過,儘管它確實有道理。這讓我有興趣儘快切換到更好的搜索機制(可能是思維獅身人面像)。感謝您指出了這一點。 – 2011-06-09 16:05:47

+0

切換到獅身人面像或Lucene之前,我建議考慮MySQL全文搜索選項。可能正是你需要的。 http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html – bpgergo 2011-06-09 16:30:40

回答

5

將在所有 列化合物索引提供相同的搜索 速度增益我彷彿施加 單獨的索引到每一列?

沒有。索引中列的順序非常重要。讓我們假設你有一個這樣的指標:create unique index index_name on table_name (headline, coupon_code, description,expiration_date) 在這種情況下,這些查詢將使用索引

select * from table_name where headline = 1 
select * from table_name where headline = 1 and cupon_code = 2 

和這些查詢不會使用唯一索引:

select * from table_name where coupon_code = 1 
select * from table_name where description = 1 and cupon_code = 2 

這樣,規則是這樣的。當你有多個索引在一起的字段時,你必須指定第一個k字段才能使用索引。

所以,如果你想成爲能夠搜索這些領域中的任何一個,那麼你應該對他們每個人對指數單獨創建(除了合併唯一索引)

此外,要小心LIKE操作符。

這將採用指數SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; 這樣就不會SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';

索引使用http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html 多列索引http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

+0

這正是我需要知道的。非常感謝您的明確解釋和參考。我需要稍微閱讀這些內容。謝謝! – 2011-06-09 16:08:04

+0

@chrisallenlane,這是我需要得到的反饋信息。謝謝! – bpgergo 2011-06-09 16:12:22