带有 LIKE 的 mysql 查询可能使用索引,但只使用一些 len 字符?



我有一个SQL语句

select * from tb_name where field like 'abc_def_ghj%';

可以和

select * from tb_name where field like 'abc_def_ghj_defg%; 

(可能有很多以 abc_def_qhj 开头的字段值;

从第 12 个字母完全不同)。

我想知道索引字段是否有特殊长度,例如,只有字段(0,10)用于前十个字母效果;

(我假设你有INDEX(field)

如果只有一小部分行与此匹配,则速度很快:

like 'abc_def_ghj_defg%

如果大部分行与此匹配,则速度很慢:

like 'abc_def_ghj%'

速度差异与长度关系不大,只是与匹配的行数有关。

如果排序规则..._ci,则大写和小写相互匹配。

请注意,下划线(_)是通配符。

计时时,请务必运行两次查询。 缓存可以产生很大的不同。

是的,MySQL中索引键的长度有限制。

来自"15.22 InnoDB 限制"(假设您使用 InnoDB 作为存储引擎,因为它是当今最流行的):

  • 对于使用InnoDBDYNAMICCOMPRESSED行格式。

    对于使用InnoDBREDUNDANTCOMPACT行格式。例如,您可能会使用列达到此限制 前缀TEXTVARCHAR列上超过 191 个字符的索引, 假设一个utf8mb4字符集,每个字符集最多 4 个字节 字符。

    尝试使用超过限制的索引键前缀长度将返回错误。

    如果减小InnoDB页面大小 到 8KB 或 4KB,方法是指定innodb_page_size选项,创建 MySQL 实例时,最大长度 索引键根据 3072 字节的限制按比例降低 对于 16KB 的页面大小。也就是说,最大索引键长度为 1536 页面大小为 8KB 时为字节,页面大小为 768 字节 4KB。

    适用于索引键前缀的限制也适用于全列索引键。

最新更新