2011-01-26 3 views
0

J'ai une requête suivante dans mysql.Index de plusieurs lignes 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','%') 
        ) 
    ) 

Comment dois-je mettre les index pour la table?

p.s. 's' est en fait une variable dans proc stocké, donc 's' est NULL et concat sont nécessaires.

+1

Qu'est-ce est? Une chaîne de texte ou une autre colonne? –

+0

@Larry Lusting: Selon la syntaxe est une constante littérale ... Je suppose ... –

+0

@Pablo Santa Cruz: C'est en fonction de la syntaxe, mais alors la requête a très peu de sens. Peut-être que c'est un espace réservé pour l'instruction préparée dans un script externe? – Mchl

Répondre

1
  1. 's' IS NULL est toujours faux

  2. Y at-il une raison que vous utilisez CONCAT('s','%') au lieu de 's%'?

  3. Essayez un indice composite sur (FirstName, LastName, FullName), bien qu'il ne pourrait pas vraiment bien pour (VAR)CHAR s (ou même pas du tout, il semble)


Depuis # 3 ne fonctionne pas, je peut seulement vous renvoyer au manuel de MySQL maintenant. Il y a un peu sur l'utilisation de la façon dont MySQL utilise les index avec LIKE here

+0

Je ne pense pas qu'un index composite aidera pour l'ensemble de la requête, car il aidera seulement votre 'a.FirstName like 's%'' clause ... –

+0

1, 2 C'est une partie d'une procédure, la chaîne est en fait une variable. 3. J'ai essayé un index pour trois colonnes, et plusieurs index pour chaque colonne, mais l'optimiseur ne les a pas utilisés – aikixd

1

tout d'abord, une suggestion rapide: ne pas utiliser concat si vous n'avez pas. Votre requête peut être réécrite comme ('s' is NULL) est toujours FAUX afin que vous puissiez vous toujours obtenir toutes les lignes en fonction de la deuxième condition de toute façon:

SELECT 
    * 
FROM 
    Accounts AS a 
WHERE 
    a.FirstName LIKE 's%' OR 
    a.LastName LIKE 's%' OR 
    a.FullName LIKE 's%' 

index qui pourrait aide, mais ne se sont pas nécessairement:

create index idx_01 on accounts(FirstName); 
create index idx_01 on accounts(LastName); 
create index idx_01 on accounts(FullName); 

Vous pouvez également envisager un index de recherche de texte complet pour votre table.

0

POUR vous full text indexing est également une option

Ajouter un index texte intégral pour 3 champs puis

utilisation

MATCH() AGAINST() syntaxe

Par exemple

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

J'utilise InnoDB, donc je ne peux pas utiliser l'index fulltext – aikixd

+0

Une autre option serait d'utiliser Sphinx, – Harish

Questions connexes