2

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

例如

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

虽然名字有点像

  木桐酒庄
  木桐嘉棣酒庄
  柏图斯城堡
  拉菲城堡
  拉弗勒城堡
  ...

在这个(示例)列表中,Chateau一直出现,MySQL 根据前 8 个字符创建一个索引......这意味着索引中只有一个条目(并且搜索Chateau Petrus将按顺序完成 all Chateau)。
(在这种情况下,将Chateau两个字段中的第一个单词 ( ) 和名称的其余部分分开是有意义的,但这不是重点)。

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

4

2 回答 2

0

实际上我在此期间找到了一种方法 - 有点编程:

只为name领域

  • 所有name条目都反向存储在数据库中
  • 所有name搜索都是反向的
  • name在发送到客户端(用户代理)之前将行中的内容反转

例如在 PHP

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

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

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

于 2012-11-11T12:56:29.600 回答
0

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

于 2012-11-11T14:44:42.867 回答