来自End of Field的部分MySQL索引

时间:2012-11-11 12:27:09

标签: mysql performance indexing field partial

部分索引有助于获得更小的索引,并使INSERT更快。

例如

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

虽然名字类似于

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

在这个(示例)列表中,Chateau一直出现,MySQL根据8个第一个字符创建索引...意味着索引中只有一个条目(以及{{{ 1}}将按顺序完成所有Chateau Petrus)。(在这种情况下,第一个单词(Chateau)与两个字段中其余名称之间的分隔将会产生感觉,但这不是重点。)

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

2 个答案:

答案 0 :(得分:0)

实际上我在此期间找到了一种方法 - 通过一些编程:

仅适用于name字段

  • 所有name个条目都存储在
  • 中的 reverse
  • 所有name次搜索都是反向
  • 在发送给客户端(用户代理)之前
  • name颠倒

例如在PHP中

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

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

问题是专门要求一个纯粹的MySQL解决方案,但如果没有,这是任何语言的可行解决方法。如果没有更好的东西,我会在几天内接受这个答案。

答案 1 :(得分:0)

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