MySQL在Index中使用自定义字符串比较运算符

时间:2016-10-13 11:12:21

标签: mysql sql indexing innodb mariadb

我正在寻找一种方法来指定MySQL索引使用的顺序(使用MariaDB 10的InnoDB中的BTREE)。更具体地说,我想创建一个索引,该索引使用类似于以下伪代码的可变长度条目索引varchar列:

-- assume "str" to be the field in question, return values like strcmp
if (len(row1.str) < len(row2.str))
{
    return -1;
} else if (len(row1.str) > len(row2.str)) {
    return 1;
} else {
    return row1.str < row2.str;
}

有没有办法只为一个特定的索引指定这个排序?

2 个答案:

答案 0 :(得分:1)

这样的事情会产生同样的效果:

ORDER BY CHAR_LENGTH(str), str

答案 1 :(得分:1)

https://mariadb.com/kb/en/mariadb/virtual-computed-columns/ -

ALTER TABLE foo ADD COLUMN
  for_sorting VARCHAR(...)   -- make a little wider than `str`
      AS (       -- syntax
         CONCAT(
            RIGHT(CONCAT('0000', CHAR_LENGTH(str)), 5),  -- num sortable as string
               ':', str )  -- tack on `str` for when len differs
      ) PERSISTENT   -- "indexes can only be based on PERSISTENT virtual columns"
      COMMENT "kludge for special indexing" 

然后执行ORDER BY for_sorting

(警告:我没有尝试过,但感觉它会起作用。)