2012-11-11 108 views
2

部分索引有助于缩小索引,并使INSERT更快。字段末尾的部分MySQL索引

例如

CREATE TABLE wine (
    name VARCHAR(100), 
    ... 
    INDEX (name(8))); 

虽然名称类似

 Chateau Mouton-Rothschild 
    Chateau Mouton-Cadet 
    Chateau Petrus 
    Chateau Lafite 
    Chateau Lafleur 
    ...

在此(例如)名单,Chateau出现的时候,MySQL的基础上,8个前几个字符创建索引.. 。这意味着索引中只有一个条目(并且Chateau Petrus的搜索将按顺序对所有的Chateau进行)。
(在这种情况下,第一个单词(Chateau)与两个字段中名称的其余部分之间的分隔是有意义的,但这不是重点)。

有没有办法让MySQL根据字段的结尾创建部分索引?

+0

很好的问题,我在等待答案。 – SaidbakR

+0

不,MySQL(不像许多其他DBMS)不支持这种高级索引。 –

回答

0

其实我发现在其间的方式 - 带着几分编程:

只为name

  • 所有name条目存储在DB反向
  • 所有name搜索反向
  • name行中是被发送到客户端之前反转(用户代理)

比如在PHP

  • ...query('INSERT ... name="' . strrev($name) . '"...
  • ...query('SELECT * FROM wine WHERE name="' . strrev($name) . '"');
  • 和例如搜索的%MOUTON%实际上将搜索%NOTUOM%

有一点o f reverse开销,但与可能的数据库增益相比可以忽略不计。

这个问题特别要求提供一个纯粹的MySQL解决方案,但如果没有的话,这是一种可行的解决方法。如果没有更好的东西,我会在几天内接受这个答案。

+0

请注意,“LIKE%FOO%”形式的查询不使用MySQL中的索引。数据库将扫描所有候选行并对每行进行比较。鉴于此,这里的收益可以忽略不计,可能不值得增加额外的复杂性。 –

+0

是的,但是按照我的* reverse *算法,搜索'%MOUTON%'不会返回正确的行......它被提到使答案更清晰 –

+0

我建议反转你插入到数据库中的数据可能不值得增加额外的复杂性_无数_在你想忽略的每个字段的开头有大量的数据。 –

0

除了上面提到的解决方案之外,MySQL中唯一的解决方案是明确存储要索引的值。 (例如name没有Chateau

+0

是的,它适用于我在这种情况下的具体示例 - 这就是为什么我在问题中提到这只是一个示例,并且单词的划分不是重点...... –

+0

@ ring0 This isn'具体到分词。我建议如果你想索引任何你认为字段的“结尾”,你必须将它存储在一个单独的列中。 –

+0

很抱歉,如果不清楚,这是什么*第一个词(Chateau)和其他名称在两个字段*之间的差异*暗示。 –