所以我有一个UNIQUE CHAR(255)列,我想找到一个特定的行,
创建CHAR(10)INDEX以提高搜索效率是否有意义? 我知道唯一也是一个索引
引擎将扫描索引到第一个字母为J的位置,然后是JO,然后是JOH 但索引为255字节×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;`
(id不是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索引是没用的,根据docs 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';`
你对此有何看法?
谢谢!
答案 0 :(得分:0)
添加一个电子邮件地址的哈希列。然后用作谓词where a.hash = hash('foo@bar.com') and a.email = 'foo@bar.com'
碰巧,mysql包含一个名为password()
的散列函数,它产生16个字节的哈希值。