Итак, у меня есть столбец 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';`
что вы думаете по этому поводу?
спасибо!