2010-02-06 6 views
0

Donc, j'ai une colonne CHAR (255) UNIQUE, je veux trouver une ligne particulière,MySQL recherchant une longue colonne CHAR, utilisant une colonne CHAR plus petite (sous-chaîne) comme index?

Serait-il logique de créer CHAR (10) INDEX pour rendre la recherche plus efficace? Je connais un unique est également un indice

le moteur va scanner throught l'index où la 1ère lettre J, puis JO, puis JOH mais un indice de 255 octets x 1 million d'enregistrements, est beaucoup de mémoire "espace" pour numériser, au lieu de seulement 10 octets x 1 million

mail_sub = GAUCHE (courrier, 10)
mail_sub = substr (courrier, 10)

`CREATE TABLE pwd( 
    id  INT, 
    mail_sub CHAR(10) NOT NULL, 
    mail  CHAR(255) NOT NULL, 
    pw_hash CHAR(32) NOT NULL, 
PRIMARY KEY (id), 
UNIQUE KEY ind_email (mail), 
INDEX  rv_sub (mail_sub,id) 
) ENGINE = INNODB CHARACTER SET latin1;` 

(id est auto_increment pas, son défini avant l'insertion)

Le tableau est lu autant
SELECT * FROM pwd WHERE email='[email protected]';
comme
SELECT * FROM pwd WHERE id=12345;

Alors « id » ou « mail » pourrait être la clé primaire, je ne vois pas vraiment de différence;

Ma question est, quelque chose comme

`SELECT * FROM pwd WHERE mail_sub='abcde12345' AND 
email='[email protected]';` 

rendrait la recherche plus efficace? optimiseur

insiste sur l'utilisation de « ind_email »
index FORCE/IGNORE ne sert à rien, selon docs indicateurs d'index MySQL sont ignorés silencieusement pour les types de cordes (http://dev.mysql.com/doc/refman/5.1/en/index-hints.html)

je pensais utiliser JOIN pour effectuer une recherche sur mail_sub d'abord, mais sans succès

`EXPLAIN EXTENDED 
SELECT a.pw_hash FROM pwd as a 
JOIN pwd as b ON b.id=a.id 
WHERE a.mail_sub='abcde12345' AND b.mail='abc...john.com';` 

Quelles sont votre opinion à ce sujet?

merci!

Répondre

0

Ajouter une colonne qui est un hash de l'adresse e-mail. Puis utilisez comme prédicat where a.hash = hash('[email protected]') and a.email = '[email protected]'

En l'occurrence, mysql inclut une fonction de hachage, appelée password() qui produit des hachages de 16 octets.

+0

merci pour la suggestion ----- oui, je pense à utiliser MD5() qui est 16 octets (32 hex), mot de passe() est en réalité 20 octets (40 hex char) ----- mais pourrait je utilise seulement un hachage dans le prédicat? --- vous avez écrit 'et a.email = 'foo @ bar.com'' donc je suppose que nous ne pouvons pas faire confiance au hash pour être unique, bien que mysql assure l'unicité pendant INSERTion, je pourrais finir par dire à l'utilisateur un email adresse est déjà enregistrée, quand ce n'est pas, ou suis-je trop paranoïaque? – Luxvero

+0

aussi quand je l'ai essayé plus tôt en utilisant 'où a.hash = hash ('[email protected] ') et a.email =' foo @ bar.com'' mysql continue d'utiliser l'index' email' ---- ou suggérez-vous d'utiliser la colonne de hachage Not only, just et index, d'où le "mail = xxx" pour filtrer les lignes correspondant à l'index? et oubliez juste d'appliquer le courrier pour être unique via les contraintes sql? – Luxvero

Questions connexes