Marriadb索引左通配符语句

时间:2017-06-22 15:35:47

标签: mysql mariadb sql-like

这几天我一直在摸不着头脑。这应该不是很难,但我还没有找到答案。

我的数据如下: +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | name | varchar(255) | NO | | NULL | | | email | varchar(255) | NO | MUL | NULL | | | ip | varchar(255) | NO | | NULL | | | username| varchar(255) | NO | | NULL | | +---------+--------------+------+-----+---------+-------+

现在,下一个查询将绕过索引,因为通配符位于LIKE语句的开头。

SELECT * FROM db WHERE email LIKE '%@hotmail.com';

现在这个查询将使用索引,因为索引从头开始

SELECT * FROM db WHERE email LIKE 'first.last@%';

现在提出问题: 必须有一种方法来创建一个从右侧开始的索引,这样我就可以使用索引来编写语句,例如:“LIKE%@ hotmail.com”,而不必创建第二列。

1 个答案:

答案 0 :(得分:2)

常规B树索引始终从左到右索引字符串值。没有选择让它们从右向左索引。

我看到的一个解决方法是创建另一个列来存储字符串reversed的副本,然后将其编入索引。

MariaDB和MySQL 5.7也有虚拟列。您可以索引虚拟列。因此,您可以将虚拟列定义为常规电子邮件列的REVERSE(),并将其编入索引。

在您的情况下,如果您需要单独搜索电子邮件名称和电子邮件域,则可以将这两个电子邮件地址组件存储在不同的列中,并为每个组件编制索引。