Mysql多行索引

时间:2011-01-26 17:25:42

标签: mysql indexing

我在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是必要的。

3 个答案:

答案 0 :(得分:1)

  1. 's' IS NULL始终为假

  2. 您使用CONCAT('s','%')代替's%'是否有任何理由?

  3. (FirstName, LastName, FullName)上尝试复合索引,虽然它可能不适用于(VAR)CHAR(或者甚至根本看不到)


  4. 由于#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);