这几天我一直在摸不着头脑。这应该不是很难,但我还没有找到答案。
我的数据如下:
+---------+--------------+------+-----+---------+-------+
| 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”,而不必创建第二列。
答案 0 :(得分:2)
常规B树索引始终从左到右索引字符串值。没有选择让它们从右向左索引。
我看到的一个解决方法是创建另一个列来存储字符串reversed的副本,然后将其编入索引。
MariaDB和MySQL 5.7也有虚拟列。您可以索引虚拟列。因此,您可以将虚拟列定义为常规电子邮件列的REVERSE(),并将其编入索引。
在您的情况下,如果您需要单独搜索电子邮件名称和电子邮件域,则可以将这两个电子邮件地址组件存储在不同的列中,并为每个组件编制索引。