2016-09-28 34 views
1

的MySQL/InnoDB的索引如果在MySQL的InnoDB表的索引字段(姑且稱之爲長期在這裏),只能使用:如何迫使長期LIKE%...%

term LIKE 'step%' 

查詢種類符號末尾如果您想索引工作。換句話說:

你可以做的前綴只

沒有此限制的解決辦法,將在certian情況下工作索引搜索。

+0

如果必須掃描整個索引,因爲你不能依靠它的量級上,這將是性能優勢? (無論如何,我不認爲這是一個壞問題。) –

+0

@ÁlvaroGonzález這是一個經常遇到的問題,我想分享一個我爲SO用戶使用的技巧。 –

回答

2

重要!這是一種解決方法,它不適合所有情況。但在某些情況下,它可能派上用場。

此替代方法有助於節省性能,但是通過使用額外的內存量來支付。

例的情況下

讓我們建立一個簡單的例子情況:

term 
------------------ 
... 
Understanding InnoDB clustered indexes 
... 

和用戶搜索的所有條款符合以下斷言:

term LIKE '%InnoDB%' 

如果您簡化爲短語LIKE'InnoDB%',這個短語將會從搜索中丟失。

解決方法

  1. 介紹R項列將包含扭轉長期

    term          rterm 
    ------------------ 
    ... 
    Understanding InnoDB clustered indexes sexedni deretsulc BDonnI gnidnatsrednU 
    ... 
    
  2. 添加一個索引列R項

    ALTER TABLE `t_term` 
    ADD INDEX `rterm` (`rterm`); 
    

    或唯一一個根據您的情況:

    ALTER TABLE `t_term` 
    ADD UNIQUE `rterm` (`rterm`); 
    
  3. 由以下謂詞應用搜索:

    term LIKE 'InnoDB%' OR rterm LIKE 'BDonnI%' 
    

    其中 'BDonnI' 是 'InnoDB的' 反轉字符串。

  4. 利潤!

查詢計劃

enter image description here

MySQL查詢,以填補R項 columnn

MySQL有一個方便的字符串函數REVERSE()。爲了填補R項列使用:

UPDATE t_term SET rterm = REVERSE(term) 
+0

嗯,這並不是真的強制使用索引來表示問題中提到的'LIKE%...%',是嗎? ;-P –

+1

哇,它像一個魅力。謝謝 – Learner

+0

@ÁlvaroGonzález絕對不是。問題標題旨在通過搜索找到此解決方法。實際上,它通過搜索兩個索引併合並結果來模仿完整索引。 –