MySQL ищет длинный столбец CHAR, используя меньший (подстрока) столбец CHAR в качестве индекса? - PullRequest
0 голосов
/ 07 февраля 2010

Итак, у меня есть столбец UNIQUE CHAR (255), я хочу найти определенную строку,

Имеет ли смысл создавать CHAR (10) INDEX, чтобы сделать поиск более эффективным? Я знаю, уникальный также индекс

движок просканирует индекс, где первая буква - J, затем JO, затем JOH но индекс 255 байтов x 1 миллион записей - это много места для сканирования памяти, вместо 10 байтов x 1 миллион

mail_sub = LEFT (mail, 10)
mail_sub = substr (mail, 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;`

(идентификатор не auto_increment, он определен перед вставкой)

Таблица читается во многих
SELECT * FROM pwd WHERE email='abcde12345.john@internet.com';
а
SELECT * FROM pwd WHERE id=12345;

Так что «id» или «mail» могут быть первичным ключом, я действительно не вижу никакой разницы;

Мой вопрос, что-то вроде

`SELECT * FROM pwd WHERE mail_sub='abcde12345' AND 
email='abcde12345.john@internet.com';`  

сделает поиск более эффективным?

оптимизатор настаивает на использовании "ind_email"
Индексы FORCE / IGNORE бесполезны, согласно документам подсказки индекса mysql молча игнорируются для строковых типов (http://dev.mysql.com/doc/refman/5.1/en/index-hints.html)

Я подумал использовать JOIN, чтобы сначала выполнить поиск по mail_sub, но безуспешно

`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';`

что вы думаете по этому поводу?

спасибо!

1 Ответ

0 голосов
/ 07 февраля 2010

Добавьте столбец, который является хешем адреса электронной почты. Затем используйте в качестве предиката where a.hash = hash('foo@bar.com') and a.email = 'foo@bar.com'

Как это происходит, mysql включает функцию хеширования, называемую password(), которая создает 16-байтовые хэши.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...