【问题标题】:Indexing for BINARY LIKE operations in MySQLMySQL 中 BINARY LIKE 操作的索引
【发布时间】:2019-09-05 04:55:10
【问题描述】:

我知道 varchar_pattern_ops 存在于 Postgresql 中,用于在 LIKE 查询中进行快速、基于索引的搜索,但 MySQL 是否有类似的功能?

我目前有一个 Django-MySQL 设置,我有这个查询,它在一个非索引字段上运行并使用 BINARY LIKE 操作,并且需要一分钟多的时间才能完成。

我的查询是从文本开头的部分搜索 - text%

这是表结构。该表实际上包含 20 多个字段,但我只包含了主键和我正在搜索的字段

+---------+---------------+------+-----+---------+-------+

| Field   | Type          | Null | Key | Default | Extra |

+-------------------------+---------------+------+-----+--

| id      | varchar(255)  | NO   | PRI | NULL    |       |

| mid     | varchar(255)  | NO   | MUL | NULL    |       |

这是查询 -

select count(*) from table where mid binary like 'text%';

这些是索引 -

PRIMARY KEY index has cardinality 102820460
mid index has cardinality 756032

【问题讨论】:

  • 谢谢,虽然我的问题比这更受限制。我已经更新了这个问题。我的查询只是从测试开始的部分搜索。
  • 在这种情况下,索引应该可以工作..因为 initil 部分可以与索引匹配..尝试在列上添加一个简单的索引,但请记住对于索引有 767 个字节的限制跨度>
  • 原因可能是该索引中值的基数,导致选择性不好。你可以试试FORCE INDEX。另外,在这里找到解释:logicalread.com/mysql-index-cardinality-mc12
  • 另外,提到的 LIKE 搜索是唯一的条件吗?请发布表结构(包括索引)和您的完整查询。

标签: mysql database-indexes


【解决方案1】:

执行 MySQL 索引字符串左侧的事实。

如果查询使用通配符右侧,则字符串列可以使用索引:

 SELECT * FROM your_table WHERE field LIKE "text%" # can use an index

但请记住,索引有 767 个字节的限制

来自 Mysql 文档

B 树索引可用于表达式中的列比较 使用 =、>、>=、

https://dev.mysql.com/doc/refman/8.0/en/index-btree-hash.html

【讨论】:

  • 该列当前已编入索引,但未用于该查询。我为查询做了一个解释,虽然possible_keys 包含该索引,但key 列是NULL
  • 我发现如果我从查询中删除binary 并只执行select count(*) from table where mid like 'text%';,它会使用索引并变得异常快。
  • @Kaii - 我明白了。据我所知,使用 binary 返回区分大小写的搜索。但该字段仅包含大写值。所以这不是问题。
猜你喜欢
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 2013-07-20
  • 2021-09-04
相关资源
最近更新 更多