2017-06-22 1 views
1

Je me suis gratté la tête sur ce problème pendant des jours. Cela ne devrait pas être si difficile mais je n'ai pas encore trouvé la réponse.L'index de Marriadb pour la déclaration wildcard gauche

Mes données se présente comme suit: +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | name | varchar(255) | NO | | NULL | | | email | varchar(255) | NO | MUL | NULL | | | ip | varchar(255) | NO | | NULL | | | username| varchar(255) | NO | | NULL | | +---------+--------------+------+-----+---------+-------+

Maintenant, la prochaine requête contournera l'index parce que le caractère générique est au début de l'instruction LIKE.

SELECT * FROM db WHERE email LIKE '%@hotmail.com';

Maintenant, cette requête utilisera l'index car les index commencent au début

SELECT * FROM db WHERE email LIKE '[email protected]%';

Maintenant pour la question: Il doit y avoir une méthode pour créer un index qui commence le côté droit afin que je puisse utiliser des index pour des instructions telles que: "LIKE %@hotmail.com" sans avoir à créer une deuxième colonne.

+0

Je me suis gratté la tête pour savoir de quelle base de données vous parlez. Est-ce mysql, sql-server ou mariadb? Choisissez-en un – GuidoG

+0

Am utilisant MariaDB. Mais vu que c'est pour fork de mysql, une solution peut s'appliquer aux deux. – Eddie4

Répondre

1

Les index B-tree réguliers indexent toujours une valeur de chaîne de gauche à droite. Il n'y a pas d'option pour les indexer de droite à gauche.

Une solution de contournement que j'ai vu est de faire une autre colonne pour stocker une copie de la chaîne, reversed, puis indexer cela. MariaDB et MySQL 5.7 ont également des colonnes virtuelles. Vous pouvez indexer des colonnes virtuelles. Vous pouvez donc définir une colonne virtuelle comme REVERSE() de votre colonne e-mail habituelle et l'indexer.

Dans votre cas, si vous avez la nécessité de rechercher séparément pour nom e-mail et le domaine de messagerie, vous pouvez stocker ces deux composants de l'adresse e-mail dans des colonnes séparées, et indexer chacun d'eux.

+0

Merci, Cela a effectivement résolu mon problème sans augmenter l'espace disque à l'exception de l'index. "Table ALTER TABLE ADD' reverse_email' varchar (255) GENEREE TOUJOURS AS (reverse ('user_email')) VIRTUAL;" – Eddie4