我在mysql中有以下查询。
SELECT
*
FROM
Accounts AS a
WHERE
('s' IS NULL OR (a.FirstName LIKE CONCAT('s','%') OR
a.LastName LIKE CONCAT('s','%') OR
a.FullName LIKE CONCAT('s','%')
)
)
我应该如何为表格添加索引?
P.S。 's'实际上是存储过程中的变量,所以's'是NULL并且concat是必要的。
答案 0 :(得分:1)
's' IS NULL
始终为假
您使用 CONCAT('s','%')
代替's%'
是否有任何理由?
在(FirstName, LastName, FullName)
上尝试复合索引,虽然它可能不适用于(VAR)CHAR
(或者甚至根本看不到)
由于#3不起作用,我现在只能推荐你使用MySQL手册。这有点关于使用MySQL如何使用LIKE here
的索引答案 1 :(得分:1)
首先,只是一个简单的建议:如果你不需要,不要使用 concat 。您的查询可以重写,因为('s' is NULL)
始终为FALSE,因此您始终可以根据第二个条件获取所有行:
SELECT
*
FROM
Accounts AS a
WHERE
a.FirstName LIKE 's%' OR
a.LastName LIKE 's%' OR
a.FullName LIKE 's%'
可能有帮助的索引,但不一定是:
create index idx_01 on accounts(FirstName);
create index idx_01 on accounts(LastName);
create index idx_01 on accounts(FullName);
您还可以考虑为表格设置FULL TEXT SEARCH索引。
答案 2 :(得分:0)
FOR full text indexing
也是一个选项
为3个字段添加全文索引,然后
使用
MATCH() AGAINST()
语法
例如
SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('superb catch' IN BOOLEAN MODE);