这是InnoDB与MySQL 5.7的。MySQL - 索引字符串比较
如果我有这样的查询:
SELECT A, B, C FROM TABLE WHERE STRCMP(D, 'somestring') > 0
是否有可能具有可以通过查询使用上D
的指数?即MySQL是否足够聪明,可以为STRCMP函数使用btree索引?
如果不是,我怎么能够重新设计查询(和/或表),以便我可以对D进行字符串比较,并且可以有某种形式的修剪,以便它不必击中每一个行?
这是InnoDB与MySQL 5.7的。MySQL - 索引字符串比较
如果我有这样的查询:
SELECT A, B, C FROM TABLE WHERE STRCMP(D, 'somestring') > 0
是否有可能具有可以通过查询使用上D
的指数?即MySQL是否足够聪明,可以为STRCMP函数使用btree索引?
如果不是,我怎么能够重新设计查询(和/或表),以便我可以对D进行字符串比较,并且可以有某种形式的修剪,以便它不必击中每一个行?
惊奇的是许多错误的答案为止。让我看看我不能加入他们。
STRCMP
根据参数比较的方式返回-1,0或1。
STRCMP(D, 'somestring') > 0
与D > 'somestring'
完全相同。 (不>=
,不=
,不LIKE
)
实际上,有可能是核对的差异,但是这可以根据需要被处理。
任何函数和某些操作符都可以使用INDEXes
来“隐藏”列。 D > 'somestring'
可受益于从D
开始的索引; STRCMP
版本不能。
谢谢@ rick-james! (还可以使用@ydoow和@ mike-bryant)。这可能听起来很愚蠢,但我不知道“>”等可以用在字符串操作数上! –
Mysql不会使用索引进行函数调用。
使用下面的查询和报告d列
SELECT A, B, C FROM TABLE WHERE D ='somestring'
创建索引使用下面的查询
create index index1 on TABLE(D);
为什么不
WHERE D > 'somestring'
这将充分利用创建索引典型B树索引列D
。
如果仅通过将列值传递给诸如STRCMP()
之类的函数来执行比较,那么在对其进行索引时没有值。
参考:https://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
A B树索引可以在使用=
,>
,>=
,<
,<=
,或BETWEEN
运算符的表达式被用于列的比较。
所以,你可以使用
SELECT A, B, C FROM TABLE WHERE D > 'somestring'
代替,而LIKE
更为严格,可能是你所期望的。
此外,您可以使用COLLATE
运算符将列转换为区分大小写的排序规则,以确保它也可以比较大小写。
SELECT A, B, C FROM TABLE WHERE D > 'somestring' COLLATE utf8_bin
没有通配符的'LIKE'与'='相同。我认为OP的意图是作为一种排序机制 - 返回所有记录,其中D大于(以字母数字排序术语)与表记录进行比较的字符串。 –
感谢@MikeBrant指出。我忽略了这个问题,并且弄错了。相应地更正了答案。 – ydoow
用途:WHERE D like%somestring% – kollein
@kollein:对不起,但是这个评论又是如何相关?首先,由于前缀变量,%somestring%会关闭索引。其次,我试图做字符串比较,而不是子字符串匹配。 –