2011-01-26 69 views
0

我在mysql中有以下查询。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'实际上是存储过程中的一个变量,所以'IS NULL和concat是必需的。

+1

什么是 's' 吗?一个文本字符串或另一列? – 2011-01-26 17:30:58

+0

@Larry Lusting:根据语法是一个常量字面...我想... – 2011-01-26 17:33:35

+0

@Pablo圣克鲁斯:这是根据语法,但然后查询没有什么意义。也许这是在一些外部脚本中准备好声明的占位符? – Mchl 2011-01-26 17:34:55

回答

1
  1. 's' IS NULL总是假

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

  3. 尝试综合指数(FirstName, LastName, FullName),虽然它可能不适合(VAR)CHAR的工作真的很好(甚至在所有看起来是)


由于#3没有工作,我现在只能引用你到MySQL手册。这里有一点关于如何使用MySQL如何使用索引here

1

首先,只是一个快速的建议:不要使用concat如果你不必。

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); 
您的查询可以改写为 ('s' is NULL)所以你可以总是会得到所有基于行的第二个条件反正总是FALSE

您也可以考虑为您的表的全文搜索索引。

0

为你full text indexing也是一种选择

添加全文索引3个字段,然后

使用

MATCH() AGAINST()语法

SELECT * FROM articles WHERE MATCH (title,body) 
AGAINST ('superb catch' IN BOOLEAN MODE);