MySQL 中 BINARY LIKE 操作的索引
Indexing for BINARY LIKE operations in MySQL
我知道 Postgresql 中存在 varchar_pattern_ops
,用于在 LIKE
查询中进行基于索引的快速搜索,但是 MySQL 是否有任何类似的功能?
我目前有一个 Django-MySQL 设置,其中我有一个在非索引字段上运行的查询和一个 BINARY LIKE
操作,它需要一分钟多的时间才能完成。
我的查询是从文本开头部分搜索 - text%
。
这是table结构。 table 实际上包含 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
做 MySQL 索引字符串左侧的事实。
如果查询使用通配符右侧,则字符串列可以使用索引:
SELECT * FROM your_table WHERE field LIKE "text%" # can use an index
但请记住,对于索引,有 767 字节的限制
来自 Mysql 文档
A B-tree index can be used for column comparisons in expressions that
use the =, >, >=, <, <=, or BETWEEN operators. The index also can be
used for LIKE comparisons if the argument to LIKE is a constant string
that does not start with a wildcard character.
https://dev.mysql.com/doc/refman/8.0/en/index-btree-hash.html
我知道 Postgresql 中存在 varchar_pattern_ops
,用于在 LIKE
查询中进行基于索引的快速搜索,但是 MySQL 是否有任何类似的功能?
我目前有一个 Django-MySQL 设置,其中我有一个在非索引字段上运行的查询和一个 BINARY LIKE
操作,它需要一分钟多的时间才能完成。
我的查询是从文本开头部分搜索 - text%
。
这是table结构。 table 实际上包含 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
做 MySQL 索引字符串左侧的事实。
如果查询使用通配符右侧,则字符串列可以使用索引:
SELECT * FROM your_table WHERE field LIKE "text%" # can use an index
但请记住,对于索引,有 767 字节的限制
来自 Mysql 文档
A B-tree index can be used for column comparisons in expressions that use the =, >, >=, <, <=, or BETWEEN operators. The index also can be used for LIKE comparisons if the argument to LIKE is a constant string that does not start with a wildcard character.
https://dev.mysql.com/doc/refman/8.0/en/index-btree-hash.html